From 9c1db9d0323b11e057f4325ab1aa38a1dc46928a Mon Sep 17 00:00:00 2001 From: liwen Date: Thu, 14 Jan 2021 16:52:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0websocket,=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../6.7/executionHistory/executionHistory.bin | Bin 0 -> 20263 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/6.7/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/6.7/fileHashes/fileHashes.bin | Bin 0 -> 18697 bytes .gradle/6.7/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/6.7/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 18713 bytes .gradle/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/configuration-cache/gc.properties | 0 .gradle/vcs-1/gc.properties | 0 README.md | 8 + falsework-client/pom.xml | 44 +- .../src/main/java/META-INF/MANIFEST.MF | 110 +-- .../com/epri/fx/client/websocket/Session.java | 24 - .../com/{epri => }/fx/client/AppStartup.java | 41 +- .../fx/client/bean/CountryPath.java | 2 +- .../{epri => }/fx/client/bean/MenuVoCell.java | 6 +- .../fx/client/exception/AppRunException.java | 2 +- .../client/gui/feature/DisabledByFeature.java | 2 +- .../fx/client/gui/feature/FeatureHandler.java | 4 +- .../gui/feature/FeatureResourceConsumer.java | 2 +- .../fx/client/gui/feature/HideByFeature.java | 2 +- .../group/GroupManagementController.java | 12 +- .../components/GroupDetailController.java | 27 +- .../GroupTypeManagementController.java | 15 +- .../logManagement/LoginLogController.java | 229 +++++ .../OperationLogController.java} | 36 +- .../admin/menu/MenuManagementController.java | 28 +- .../admin/user/UserManagementController.java | 31 +- .../user/components/UserAddController.java | 12 +- .../user/components/UserEditController.java | 14 +- .../basicInfo/BasicDataSetController.java | 2 +- .../basicInfo/CoalPriceDiffController.java | 2 +- .../basicInfo/CurrentFreightController.java | 2 +- .../basicInfo/MainConclusionController.java | 2 +- .../basicInfo/RailwayCostController.java | 2 +- .../container/TabPaneFlowContainer.java | 2 +- .../control/FilterableCheckBoxTreeItem.java | 2 +- .../control/FilterableTreeItem.java | 2 +- .../uicomponents/control/LFXDecorator.java | 4 +- .../control/TreeItemPredicate.java | 2 +- .../gui/uicomponents/home/HomeController.java | 23 +- .../uicomponents/login/LoadingController.java | 2 +- .../uicomponents/login/LoginController.java | 76 +- .../gui/uicomponents/main/MainController.java | 118 ++- .../main/components/SkinInfoController.java | 2 +- .../main/components/UserInfoController.java | 4 +- .../onlineuser/OnlineUserController.java | 284 +++++++ .../monitor/quartz/SysJobController.java | 494 +++++++++++ .../monitor/quartz/SysJobLogController.java | 289 +++++++ .../fx/client/model/GroupDataModel.java | 8 +- .../fx/client/model/GroupTypeDataModel.java | 7 +- .../fx/client/model/LogDataModel.java | 7 +- .../fx/client/model/LoginLogDataModel.java | 58 ++ .../fx/client/model/MenuDataModel.java | 6 +- .../fx/client/model/OnlineUserDataModel.java | 41 + .../com/fx/client/model/SysJobDataModel.java | 46 + .../com/fx/client/model/SysJobLogModel.java | 58 ++ .../fx/client/model/UserDataModel.java | 7 +- .../{epri => }/fx/client/request/Request.java | 9 +- .../request/feign/AppRequestErrorDecoder.java | 11 +- .../request/feign/AppRequestInterceptor.java | 4 +- .../fx/client/request/feign/FeignAPI.java | 2 +- .../request/feign/admin/ElementFeign.java | 8 +- .../request/feign/admin/GroupFeign.java | 12 +- .../request/feign/admin/GroupTypeFeign.java | 6 +- .../client/request/feign/admin/LogFeign.java | 14 +- .../request/feign/admin/LoginLogFeign.java | 24 + .../client/request/feign/admin/MenuFeign.java | 6 +- .../request/feign/admin/SysJobFeign.java | 44 + .../client/request/feign/admin/UserFeign.java | 21 +- .../request/feign/login/LoginFeign.java | 12 +- .../fx/client/store/ApplicatonStore.java | 11 +- .../{epri => }/fx/client/utils/AlertUtil.java | 4 +- .../{epri => }/fx/client/utils/Helper.java | 2 +- .../fx/client/utils/Pinyin4jUtil.java | 2 +- .../com/fx/client/websocket/WSClient.java | 91 ++ .../src/main/resources/META-INF/datafx.xml | 7 - .../src/main/resources/css/app-dark.css | 51 +- .../src/main/resources/css/app-light.css | 74 +- .../resources/fonts/icon_font/iconfont.svg | 33 + .../fxml/admin/logManagement/login_log.fxml | 78 ++ .../operation_log.fxml} | 0 .../main/resources/fxml/admin/quartz/job.fxml | 50 -- .../resources/fxml/admin/quartz/job_log.fxml | 72 -- .../src/main/resources/fxml/main/main.fxml | 22 +- .../fxml/monitor/onlineuser/online_user.fxml | 42 + .../resources/fxml/monitor/quartz/job.fxml | 91 ++ .../fxml/monitor/quartz/job_detail.fxml | 52 ++ .../fxml/monitor/quartz/job_log.fxml | 93 ++ .../src/main/resources/fxml/test/test.fxml | 11 + .../main/resources/sample-client.properties | 2 +- .../src/test/java/MyStackedAreaChart.java | 1 + .../src/test/java/StackedAreaChartApp.java | 14 +- .../src/test/java/TableViewSample.java | 2 +- falsework-sever/pom.xml | 8 +- falsework-sever/sql/mysql/fx_falsework_db.sql | 803 ++++++++++++++++++ falsework-sever/sql/mysql/ipsm_dba.sql | 505 ----------- .../fx/server/config/WebSecurityConfig.java | 41 - .../com/epri/fx/server/util/DateUtils.java | 23 - .../fx/server/ServerApplication.java | 6 +- .../fx/server/config/FilterConfig.java | 4 +- .../fx/server/config/KeyConfiguration.java | 2 +- .../fx/server/config/UserAuthConfig.java | 2 +- .../fx/server/config/UserConfiguration.java | 2 +- .../fx/server/config/WebConfiguration.java | 13 +- .../com/fx/server/config/WebSocketConfig.java | 27 + .../server/constant/AdminCommonConstant.java | 2 +- .../fx/server/constant/CommonConstants.java | 19 +- .../fx/server/constant/RestCodeConstants.java | 2 +- .../fx/server/constant/UserConstant.java | 2 +- .../fx/server/context/BaseContextHandler.java | 8 +- .../{epri => }/fx/server/entity/Element.java | 2 +- .../{epri => }/fx/server/entity/Group.java | 2 +- .../fx/server/entity/GroupType.java | 2 +- .../com/{epri => }/fx/server/entity/Menu.java | 2 +- .../fx/server/entity/ResourceAuthority.java | 2 +- .../{epri => }/fx/server/entity/RsaKey.java | 2 +- .../java/com/fx/server/entity/SysJob.java | 57 ++ .../com/{epri => }/fx/server/entity/User.java | 2 +- .../{epri => }/fx/server/entity/UserInfo.java | 2 +- .../fx/server/entity/log/GateLog.java | 2 +- .../fx/server/entity/log/LogInfo.java | 11 +- .../com/fx/server/entity/log/SysJobLog.java | 61 ++ .../fx/server/entity/log/SysLoginInfor.java | 59 ++ .../fx/server/exception/BaseException.java | 2 +- .../auth/ClientForbiddenException.java | 6 +- .../auth/ClientInvalidException.java | 6 +- .../exception/auth/ClientTokenException.java | 6 +- .../exception/auth/UserInvalidException.java | 6 +- .../exception/auth/UserTokenException.java | 6 +- .../fx/server/filter/ReplaceStreamFilter.java | 2 +- .../fx/server/filter/RequestWrapper.java | 2 +- .../handler/ChatHandshakeInterceptor.java | 52 ++ .../handler/GlobalExceptionHandler.java | 16 +- .../fx/server/interceptor/LogInterceptor.java | 22 +- .../interceptor/UserAuthRestInterceptor.java | 14 +- .../interceptor/WebcocketInterceptor.java | 93 ++ .../com/fx/server/job/AbstractQuartzJob.java | 102 +++ .../main/java/com/fx/server/job/TestJob.java | 23 + .../{epri => }/fx/server/jwt/IJWTInfo.java | 2 +- .../{epri => }/fx/server/jwt/JWTHelper.java | 6 +- .../com/{epri => }/fx/server/jwt/JWTInfo.java | 2 +- .../fx/server/jwt/RsaKeyHelper.java | 12 +- .../fx/server/jwt/UserAuthUtil.java | 6 +- .../fx/server/mapper/ElementMapper.java | 4 +- .../fx/server/mapper/GateLogMapper.java | 5 +- .../fx/server/mapper/GroupMapper.java | 4 +- .../fx/server/mapper/GroupTypeMapper.java | 4 +- .../fx/server/mapper/MenuMapper.java | 4 +- .../mapper/ResourceAuthorityMapper.java | 4 +- .../fx/server/mapper/RsaKeyMapper.java | 4 +- .../com/fx/server/mapper/SysJobLogMapper.java | 22 + .../fx/server/mapper/SysLoginInforMapper.java | 22 + .../fx/server/mapper/UserMapper.java | 4 +- .../fx/server/msg/BaseResponse.java | 2 +- .../fx/server/msg/ListRestResponse.java | 2 +- .../fx/server/msg/ObjectRestResponse.java | 2 +- .../fx/server/msg/TableResultResponse.java | 2 +- .../server/msg/auth/TokenErrorResponse.java | 6 +- .../msg/auth/TokenForbiddenResponse.java | 6 +- .../fx/server/rest/AuthController.java | 8 +- .../fx/server/rest/ElementController.java | 8 +- .../fx/server/rest/GroupController.java | 10 +- .../fx/server/rest/GroupTypeController.java | 7 +- .../fx/server/rest/HelloController.java | 4 +- .../fx/server/rest/LogController.java | 19 +- .../fx/server/rest/LoginController.java | 2 +- .../fx/server/rest/MenuController.java | 7 +- .../com/fx/server/rest/SysJobController.java | 86 ++ .../server/rest/SysLoginInfoController.java | 29 + .../fx/server/rest/UserController.java | 45 +- .../fx/server/runner/AuthServerRunner.java | 11 +- .../fx/server/service/ElementService.java | 10 +- .../fx/server/service/GroupService.java | 25 +- .../fx/server/service/GroupTypeService.java | 10 +- .../fx/server/service/MenuService.java | 23 +- .../fx/server/service/PermissionService.java | 26 +- .../fx/server/service/RsaKeyService.java | 6 +- .../fx/server/service/UserService.java | 26 +- .../fx/server/service/log/GateLogService.java | 14 +- .../server/service/log/SysJobLogService.java | 38 + .../service/log/SysLoginInfoService.java | 38 + .../server/service/quartz/SysJobService.java | 287 +++++++ .../service/security/auth/AuthService.java | 4 +- .../security/auth/impl/AuthServiceImpl.java | 16 +- .../{epri => }/fx/server/util/ClientUtil.java | 2 +- .../com/{epri => }/fx/server/util/DBLog.java | 6 +- .../java/com/fx/server/util/DateUtils.java | 514 +++++++++++ .../com/fx/server/util/DynamicEnumUtils.java | 122 +++ .../fx/server/util/EncryptUtil.java | 2 +- .../fx/server/util/EntityUtils.java | 4 +- .../com/{epri => }/fx/server/util/Query.java | 2 +- .../fx/server/util/ReflectionUtils.java | 2 +- .../java/com/fx/server/util/SpringUtils.java | 149 ++++ .../fx/server/util/StringHelper.java | 2 +- .../{epri => }/fx/server/util/TreeUtil.java | 4 +- .../{epri => }/fx/server/util/UUIDUtils.java | 2 +- .../util/user/JwtAuthenticationRequest.java | 2 +- .../util/user/JwtAuthenticationResponse.java | 2 +- .../fx/server/util/user/JwtTokenUtil.java | 8 +- .../{epri => }/fx/server/vo/ElementVO.java | 2 +- .../{epri => }/fx/server/vo/FrontUser.java | 2 +- .../{epri => }/fx/server/vo/GroupTree.java | 2 +- .../{epri => }/fx/server/vo/GroupTypeVO.java | 2 +- .../{epri => }/fx/server/vo/GroupUsers.java | 4 +- .../com/{epri => }/fx/server/vo/GroupVO.java | 3 +- .../com/{epri => }/fx/server/vo/MenuVO.java | 4 +- .../fx/server/vo/PermissionInfo.java | 2 +- .../main/java/com/fx/server/vo/SysJobVO.java | 56 ++ .../com/{epri => }/fx/server/vo/TreeNode.java | 2 +- .../com/{epri => }/fx/server/vo/UserVO.java | 2 +- .../websocket/WebSocketMessageHandler.java | 212 +++++ .../src/main/resources/application-dm.yml | 4 +- .../src/main/resources/application-mysql.yml | 29 +- .../src/main/resources/application.properties | 1 - .../src/main/resources/application.yml | 2 +- .../main/resources/mapper/ElementMapper.xml | 12 +- .../main/resources/mapper/GateLogMapper.xml | 14 +- .../src/main/resources/mapper/GroupMapper.xml | 12 +- .../main/resources/mapper/GroupTypeMapper.xml | 12 +- .../src/main/resources/mapper/MenuMapper.xml | 12 +- .../mapper/ResourceAuthorityMapper.xml | 14 +- .../main/resources/mapper/RsaKeyMapper.xml | 12 +- .../main/resources/mapper/SysJobLogMapper.xml | 154 ++++ .../resources/mapper/SysLoginInforMapper.xml | 163 ++++ .../src/main/resources/mapper/UserMapper.xml | 12 +- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++ gradlew.bat | 89 ++ pom.xml | 1 - readme/login_log.png | Bin 0 -> 244289 bytes readme/online_user.png | Bin 0 -> 235830 bytes 236 files changed, 6453 insertions(+), 1496 deletions(-) create mode 100644 .gradle/6.7/executionHistory/executionHistory.bin create mode 100644 .gradle/6.7/executionHistory/executionHistory.lock create mode 100644 .gradle/6.7/fileChanges/last-build.bin create mode 100644 .gradle/6.7/fileHashes/fileHashes.bin create mode 100644 .gradle/6.7/fileHashes/fileHashes.lock create mode 100644 .gradle/6.7/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/checksums/checksums.lock create mode 100644 .gradle/configuration-cache/gc.properties create mode 100644 .gradle/vcs-1/gc.properties delete mode 100644 falsework-client/src/main/java/com/epri/fx/client/websocket/Session.java rename falsework-client/src/main/java/com/{epri => }/fx/client/AppStartup.java (62%) rename falsework-client/src/main/java/com/{epri => }/fx/client/bean/CountryPath.java (98%) rename falsework-client/src/main/java/com/{epri => }/fx/client/bean/MenuVoCell.java (88%) rename falsework-client/src/main/java/com/{epri => }/fx/client/exception/AppRunException.java (97%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/feature/DisabledByFeature.java (87%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/feature/FeatureHandler.java (90%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/feature/FeatureResourceConsumer.java (97%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/feature/HideByFeature.java (87%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/admin/group/GroupManagementController.java (90%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/admin/group/components/GroupDetailController.java (97%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/admin/grouptype/GroupTypeManagementController.java (96%) create mode 100644 falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/logManagement/LoginLogController.java rename falsework-client/src/main/java/com/{epri/fx/client/gui/uicomponents/admin/log/LogManagementController.java => fx/client/gui/uicomponents/admin/logManagement/OperationLogController.java} (86%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/admin/menu/MenuManagementController.java (97%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/admin/user/UserManagementController.java (93%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/admin/user/components/UserAddController.java (88%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/admin/user/components/UserEditController.java (91%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/basicInfo/BasicDataSetController.java (84%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/basicInfo/CoalPriceDiffController.java (84%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/basicInfo/CurrentFreightController.java (84%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/basicInfo/MainConclusionController.java (84%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/basicInfo/RailwayCostController.java (84%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/container/TabPaneFlowContainer.java (97%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/control/FilterableCheckBoxTreeItem.java (98%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/control/FilterableTreeItem.java (98%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/control/LFXDecorator.java (99%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/control/TreeItemPredicate.java (85%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/home/HomeController.java (97%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/login/LoadingController.java (82%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/login/LoginController.java (91%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/main/MainController.java (79%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/main/components/SkinInfoController.java (84%) rename falsework-client/src/main/java/com/{epri => }/fx/client/gui/uicomponents/main/components/UserInfoController.java (90%) create mode 100644 falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/onlineuser/OnlineUserController.java create mode 100644 falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/quartz/SysJobController.java create mode 100644 falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/quartz/SysJobLogController.java rename falsework-client/src/main/java/com/{epri => }/fx/client/model/GroupDataModel.java (92%) rename falsework-client/src/main/java/com/{epri => }/fx/client/model/GroupTypeDataModel.java (89%) rename falsework-client/src/main/java/com/{epri => }/fx/client/model/LogDataModel.java (91%) create mode 100644 falsework-client/src/main/java/com/fx/client/model/LoginLogDataModel.java rename falsework-client/src/main/java/com/{epri => }/fx/client/model/MenuDataModel.java (92%) create mode 100644 falsework-client/src/main/java/com/fx/client/model/OnlineUserDataModel.java create mode 100644 falsework-client/src/main/java/com/fx/client/model/SysJobDataModel.java create mode 100644 falsework-client/src/main/java/com/fx/client/model/SysJobLogModel.java rename falsework-client/src/main/java/com/{epri => }/fx/client/model/UserDataModel.java (92%) rename falsework-client/src/main/java/com/{epri => }/fx/client/request/Request.java (94%) rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/AppRequestErrorDecoder.java (57%) rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/AppRequestInterceptor.java (74%) rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/FeignAPI.java (70%) rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/admin/ElementFeign.java (75%) rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/admin/GroupFeign.java (82%) rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/admin/GroupTypeFeign.java (81%) rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/admin/LogFeign.java (57%) create mode 100644 falsework-client/src/main/java/com/fx/client/request/feign/admin/LoginLogFeign.java rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/admin/MenuFeign.java (82%) create mode 100644 falsework-client/src/main/java/com/fx/client/request/feign/admin/SysJobFeign.java rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/admin/UserFeign.java (55%) rename falsework-client/src/main/java/com/{epri => }/fx/client/request/feign/login/LoginFeign.java (73%) rename falsework-client/src/main/java/com/{epri => }/fx/client/store/ApplicatonStore.java (96%) rename falsework-client/src/main/java/com/{epri => }/fx/client/utils/AlertUtil.java (95%) rename falsework-client/src/main/java/com/{epri => }/fx/client/utils/Helper.java (85%) rename falsework-client/src/main/java/com/{epri => }/fx/client/utils/Pinyin4jUtil.java (99%) create mode 100644 falsework-client/src/main/java/com/fx/client/websocket/WSClient.java delete mode 100644 falsework-client/src/main/resources/META-INF/datafx.xml create mode 100644 falsework-client/src/main/resources/fxml/admin/logManagement/login_log.fxml rename falsework-client/src/main/resources/fxml/admin/{log/log_management.fxml => logManagement/operation_log.fxml} (100%) delete mode 100644 falsework-client/src/main/resources/fxml/admin/quartz/job.fxml delete mode 100644 falsework-client/src/main/resources/fxml/admin/quartz/job_log.fxml create mode 100644 falsework-client/src/main/resources/fxml/monitor/onlineuser/online_user.fxml create mode 100644 falsework-client/src/main/resources/fxml/monitor/quartz/job.fxml create mode 100644 falsework-client/src/main/resources/fxml/monitor/quartz/job_detail.fxml create mode 100644 falsework-client/src/main/resources/fxml/monitor/quartz/job_log.fxml create mode 100644 falsework-client/src/main/resources/fxml/test/test.fxml create mode 100644 falsework-sever/sql/mysql/fx_falsework_db.sql delete mode 100644 falsework-sever/sql/mysql/ipsm_dba.sql delete mode 100644 falsework-sever/src/main/java/com/epri/fx/server/config/WebSecurityConfig.java delete mode 100644 falsework-sever/src/main/java/com/epri/fx/server/util/DateUtils.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/ServerApplication.java (85%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/config/FilterConfig.java (91%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/config/KeyConfiguration.java (91%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/config/UserAuthConfig.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/config/UserConfiguration.java (89%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/config/WebConfiguration.java (85%) create mode 100644 falsework-sever/src/main/java/com/fx/server/config/WebSocketConfig.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/constant/AdminCommonConstant.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/constant/CommonConstants.java (64%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/constant/RestCodeConstants.java (87%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/constant/UserConstant.java (80%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/context/BaseContextHandler.java (91%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/Element.java (95%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/Group.java (99%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/GroupType.java (99%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/Menu.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/ResourceAuthority.java (99%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/RsaKey.java (85%) create mode 100644 falsework-sever/src/main/java/com/fx/server/entity/SysJob.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/User.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/UserInfo.java (97%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/log/GateLog.java (91%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/entity/log/LogInfo.java (93%) create mode 100644 falsework-sever/src/main/java/com/fx/server/entity/log/SysJobLog.java create mode 100644 falsework-sever/src/main/java/com/fx/server/entity/log/SysLoginInfor.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/exception/BaseException.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/exception/auth/ClientForbiddenException.java (67%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/exception/auth/ClientInvalidException.java (66%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/exception/auth/ClientTokenException.java (66%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/exception/auth/UserInvalidException.java (66%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/exception/auth/UserTokenException.java (65%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/filter/ReplaceStreamFilter.java (95%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/filter/RequestWrapper.java (98%) create mode 100644 falsework-sever/src/main/java/com/fx/server/handler/ChatHandshakeInterceptor.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/handler/GlobalExceptionHandler.java (82%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/interceptor/LogInterceptor.java (90%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/interceptor/UserAuthRestInterceptor.java (82%) create mode 100644 falsework-sever/src/main/java/com/fx/server/interceptor/WebcocketInterceptor.java create mode 100644 falsework-sever/src/main/java/com/fx/server/job/AbstractQuartzJob.java create mode 100644 falsework-sever/src/main/java/com/fx/server/job/TestJob.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/jwt/IJWTInfo.java (91%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/jwt/JWTHelper.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/jwt/JWTInfo.java (98%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/jwt/RsaKeyHelper.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/jwt/UserAuthUtil.java (86%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/mapper/ElementMapper.java (88%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/mapper/GateLogMapper.java (75%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/mapper/GroupMapper.java (91%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/mapper/GroupTypeMapper.java (82%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/mapper/MenuMapper.java (89%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/mapper/ResourceAuthorityMapper.java (90%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/mapper/RsaKeyMapper.java (78%) create mode 100644 falsework-sever/src/main/java/com/fx/server/mapper/SysJobLogMapper.java create mode 100644 falsework-sever/src/main/java/com/fx/server/mapper/SysLoginInforMapper.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/mapper/UserMapper.java (89%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/msg/BaseResponse.java (95%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/msg/ListRestResponse.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/msg/ObjectRestResponse.java (95%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/msg/TableResultResponse.java (95%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/msg/auth/TokenErrorResponse.java (67%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/msg/auth/TokenForbiddenResponse.java (68%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/rest/AuthController.java (89%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/rest/ElementController.java (85%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/rest/GroupController.java (91%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/rest/GroupTypeController.java (86%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/rest/HelloController.java (89%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/rest/LogController.java (55%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/rest/LoginController.java (86%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/rest/MenuController.java (86%) create mode 100644 falsework-sever/src/main/java/com/fx/server/rest/SysJobController.java create mode 100644 falsework-sever/src/main/java/com/fx/server/rest/SysLoginInfoController.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/rest/UserController.java (72%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/runner/AuthServerRunner.java (86%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/ElementService.java (85%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/GroupService.java (93%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/GroupTypeService.java (88%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/MenuService.java (80%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/PermissionService.java (91%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/RsaKeyService.java (86%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/UserService.java (78%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/log/GateLogService.java (82%) create mode 100644 falsework-sever/src/main/java/com/fx/server/service/log/SysJobLogService.java create mode 100644 falsework-sever/src/main/java/com/fx/server/service/log/SysLoginInfoService.java create mode 100644 falsework-sever/src/main/java/com/fx/server/service/quartz/SysJobService.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/security/auth/AuthService.java (66%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/service/security/auth/impl/AuthServiceImpl.java (74%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/ClientUtil.java (94%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/DBLog.java (94%) create mode 100644 falsework-sever/src/main/java/com/fx/server/util/DateUtils.java create mode 100644 falsework-sever/src/main/java/com/fx/server/util/DynamicEnumUtils.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/EncryptUtil.java (99%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/EntityUtils.java (98%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/Query.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/ReflectionUtils.java (99%) create mode 100644 falsework-sever/src/main/java/com/fx/server/util/SpringUtils.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/StringHelper.java (87%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/TreeUtil.java (95%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/UUIDUtils.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/user/JwtAuthenticationRequest.java (95%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/user/JwtAuthenticationResponse.java (90%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/util/user/JwtTokenUtil.java (81%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/ElementVO.java (99%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/FrontUser.java (98%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/GroupTree.java (93%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/GroupTypeVO.java (98%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/GroupUsers.java (92%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/GroupVO.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/MenuVO.java (97%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/PermissionInfo.java (97%) create mode 100644 falsework-sever/src/main/java/com/fx/server/vo/SysJobVO.java rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/TreeNode.java (96%) rename falsework-sever/src/main/java/com/{epri => }/fx/server/vo/UserVO.java (98%) create mode 100644 falsework-sever/src/main/java/com/fx/server/websocket/WebSocketMessageHandler.java delete mode 100644 falsework-sever/src/main/resources/application.properties create mode 100644 falsework-sever/src/main/resources/mapper/SysJobLogMapper.xml create mode 100644 falsework-sever/src/main/resources/mapper/SysLoginInforMapper.xml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 readme/login_log.png create mode 100644 readme/online_user.png diff --git a/.gradle/6.7/executionHistory/executionHistory.bin b/.gradle/6.7/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..4788a7460107a34b1b9c0719ccebb0297f20e3ce GIT binary patch literal 20263 zcmeI%Pe>F|90%|jx5A`98xcqm9r6<7%>H*3FUo30e-zivZrkk4TW8#DXLxVc)#xB5 z7$}xOc__N&!Jwij=wM!ox(I62LGj`xJOp;=Y_mJNsB8yWU5NM&%*^A>yx;HrKJ#Yw zupy4Cc5dW1ZgV@a*+dHh5P$##AOHafKmY;|fB*y_009U<00Izz00bZaf&WDyVii(l z7gK${BHK8c;W*bJtHHbEQ`ajFPd&9Sw>1_1KPa57{&V&<93cP!2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|_!k7c z9Cu*F+P`J@#~DS@jYLB0Pbo>SNk@p1x_%mG^Nkb=o8JP)SJ=K{7PKlvsiZ z87dhDp+dKPj)sV=Q^_QXbN$JK_0}V?=j!tD`03W=_KICc;6C%w=Cqbn!ZOtiGg=d+ z=~Prs>MTu(yQa|cM7?z`uPabrPvUOBJE#!9Pw~mJCm5@9#exCZ?ff*kH1%xgk!FdJ$`?DSw5CHc)$HvP7do3lms_Hda7$;jt^G<%Ay)PV$9Nt{ zR5WI?iR_VTv9zh_slCXxE#O}gKH8cvtV$k#AZ$I;ZNs_-3{v@SM>U7GOg}qpxcTDM z`&&~)XwosGnx?@TM3E8Nr^$pBR*jV+$4~%ZqP?7I143PGOiKy3G-KTEx<)9oh#bS# zC2rqXOfqHFe(L;;7_kB~F{x!pO6;I|FOkh|ohFze$wXvkS{V@I{k3r^$wOX@u%*2Q+l=pUej1#g_d3*(+ta>} z)1lxizKq$*8M~;EQI`9X<^ literal 0 HcmV?d00001 diff --git a/.gradle/6.7/executionHistory/executionHistory.lock b/.gradle/6.7/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..51904c93204bcef0a5747273522178ce26b5a3bc GIT binary patch literal 17 UcmZR+T=OIOUw!$01_)pV07MK0WB>pF literal 0 HcmV?d00001 diff --git a/.gradle/6.7/fileChanges/last-build.bin b/.gradle/6.7/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/6.7/fileHashes/fileHashes.bin b/.gradle/6.7/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..4ef3554523bf9b9988a1be71a8efa4282479522b GIT binary patch literal 18697 zcmeI%KPZH89LMqBxiffD&OpzgB$JZUok6n5GbqCu+^%ksMc3ueV7Mrf*mM&UhMRK)lwaq5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0;rzX&AcLk#~hW_O)8G|dUo+bD-nDUnQ$MLv)G z>ybzO|Db$*va^x8Iac|Q&fC&)`}AddUFB(=&zGL2?%wWKRlcip{grvjzvDyz0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_Kd zzX-%+xl8U2Z->`j1I^=QceG((Y0z>jhe8Bqoh|c1UdmvS-D` z&1|P?gnkO*eYm!9l_?Zr!O4|{T;FBR>fcw5px+R7ZR7koTAz>X8Pl2k$HBzcjB3RF JM(eWI_y#C$dX)eG literal 0 HcmV?d00001 diff --git a/.gradle/6.7/fileHashes/fileHashes.lock b/.gradle/6.7/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..12179644648405b09f96fb7a9f2864061fea4018 GIT binary patch literal 17 UcmZR6`e@n zY?0RHv_!31a@ZX9yk^YrXOo))rSH_tJbj;M=4n3H=`+UfE6QO?M}29?2mu5TKmY** z5I_I{1Q0*~0R#|0009ILKmY**{)<4!{*Ws7WBiR}&Y&)8OtaS>csIMBYl2tfUG8*$ zR{tNI1{OE2?@g=psP?nLVs0)!HYq)*{ieKUH|JYgmOiCD6AFh%0?caAFp2q1s}0tg_000IagfB*srAb - - com.epri + com.fx falsework-sever 0.0.1-SNAPSHOT + compile + + + org.controlsfx + controlsfx + 11.0.3 - jfoenix jfoenix ${jfoenix.version} system - ${basedir}/libs/jfoenix-8.0.10.jar - - - datafx-flow - datafx-flow - ${datafx.version} - system - ${basedir}/libs/datafx-flow-8.0.2-SNAPSHOT.jar + ${pom.basedir}/libs/jfoenix-8.0.10.jar tilesfx tilesfx 1.6.8 system - ${basedir}/libs/tilesfx-1.6.8.jar + ${pom.basedir}/libs/tilesfx-1.6.8.jar + + + datafx-flow + datafx-flow + ${datafx.version} + system + ${pom.basedir}/libs/datafx-flow-8.0.2-SNAPSHOT.jar @@ -56,21 +60,21 @@ datafx-injection ${datafx.version} system - ${basedir}/libs/datafx-injection-8.0.2-SNAPSHOT.jar + ${pom.basedir}/libs/datafx-injection-8.0.2-SNAPSHOT.jar datafx-eventsystem datafx-eventsystem ${datafx.version} system - ${basedir}/libs/datafx-eventsystem-8.0.2-SNAPSHOT.jar + ${pom.basedir}/libs/datafx-eventsystem-8.0.2-SNAPSHOT.jar datafx-core datafx-core ${datafx.version} system - ${basedir}/libs/datafx-core-8.0.2-SNAPSHOT.jar + ${pom.basedir}/libs/datafx-core-8.0.2-SNAPSHOT.jar javax.inject @@ -156,6 +160,16 @@ javassist 3.18.1-GA + + org.java-websocket + Java-WebSocket + 1.5.1 + + + org.projectlombok + lombok + 1.18.16 + diff --git a/falsework-client/src/main/java/META-INF/MANIFEST.MF b/falsework-client/src/main/java/META-INF/MANIFEST.MF index 91f7f32..fcfd6bc 100644 --- a/falsework-client/src/main/java/META-INF/MANIFEST.MF +++ b/falsework-client/src/main/java/META-INF/MANIFEST.MF @@ -1,56 +1,58 @@ Manifest-Version: 1.0 -Main-Class: com.epri.fx.client.AppStartup -Class-Path: . libs/javax.inject-1.jar libs/tilesfx-1.6.8.jar libs/netfli - x-statistics-0.1.1.jar libs/jackson-core-2.11.0.jar libs/spring-boot-st - arter-security-2.3.0.RELEASE.jar libs/spring-boot-starter-logging-2.3.0 - .RELEASE.jar libs/spring-web-5.2.6.RELEASE.jar libs/jackson-module-para - meter-names-2.11.0.jar libs/datafx-injection-8.0.2-SNAPSHOT.jar libs/pi - nyin4j-2.5.0.jar libs/okhttp-3.14.8.jar libs/spring-context-support-5.2 - .6.RELEASE.jar libs/spring-boot-starter-json-2.3.0.RELEASE.jar libs/myb - atis-spring-2.0.5.jar libs/druid-spring-boot-starter-1.1.14.jar libs/Hi - kariCP-3.4.5.jar libs/xml-apis-1.0.b2.jar libs/datafx-core-8.0.2-SNAPSH - OT.jar libs/controlsfx-8.40.17.jar libs/pagehelper-spring-boot-autoconf - igure-1.2.5.jar libs/archaius-core-0.7.6.jar libs/commons-collections-3 - .2.1.jar libs/servo-core-0.10.1.jar libs/feign-jackson-10.9.jar libs/ja - karta.annotation-api-1.3.5.jar libs/jsr305-3.0.1.jar libs/ribbon-loadba - lancer-2.3.0.jar libs/tomcat-embed-websocket-9.0.35.jar libs/spring-con - text-5.2.6.RELEASE.jar libs/slf4j-api-1.7.30.jar libs/mybatis-spring-bo - ot-autoconfigure-2.1.3.jar libs/spring-boot-starter-jdbc-2.3.0.RELEASE. - jar libs/okio-1.17.2.jar libs/spring-tx-5.2.6.RELEASE.jar libs/jackson- - datatype-jsr310-2.11.0.jar libs/commons-lang3-3.10.jar libs/spring-boot - -starter-cache-2.3.0.RELEASE.jar libs/jsr311-api-1.1.1.jar libs/hystrix - -core-1.5.18.jar libs/httpcore-4.4.13.jar libs/datafx-flow-8.0.2-SNAPSH - OT.jar libs/ribbon-core-2.3.0.jar libs/log4j-api-2.13.2.jar libs/lucene - -queryparser-7.4.0.jar libs/joda-time-2.10.1.jar libs/servo-internal-0. - 10.1.jar libs/pagehelper-5.1.4.jar libs/annotations-2.0.0.jar libs/spri - ng-boot-starter-2.3.0.RELEASE.jar libs/lucene-core-7.4.0.jar libs/dom4j - -1.6.1.jar libs/feign-hystrix-10.9.jar libs/javassist-3.18.1-GA.jar lib - s/logback-classic-1.2.3.jar libs/observable-toogles-0.1.jar libs/DmJdbc - Driver-1.0.0.jar libs/jfoenix-8.0.10.jar libs/tomcat-embed-core-9.0.35. - jar libs/ikonli-javafx-2.4.0.jar libs/spring-security-config-5.3.2.RELE - ASE.jar libs/spring-boot-autoconfigure-2.3.0.RELEASE.jar libs/jakarta.e - l-3.0.3.jar libs/rxjava-1.3.8.jar libs/snakeyaml-1.26.jar libs/spring-s - ecurity-core-5.3.2.RELEASE.jar libs/spring-jdbc-5.2.6.RELEASE.jar libs/ - lucene-sandbox-7.4.0.jar libs/pagehelper-spring-boot-starter-1.2.5.jar - libs/log4j-to-slf4j-2.13.2.jar libs/HdrHistogram-2.1.9.jar libs/jjwt-0. - 7.0.jar libs/jersey-apache-client4-1.19.1.jar libs/spring-expression-5. - 2.6.RELEASE.jar libs/lucene-queries-7.4.0.jar libs/spring-security-web- - 5.3.2.RELEASE.jar libs/commons-logging-1.1.1.jar libs/feign-ribbon-10.9 - .jar libs/feign-okhttp-10.9.jar libs/ikonli-fontawesome5-pack-2.4.0.jar - libs/feign-core-10.9.jar libs/druid-1.1.14.jar libs/spring-core-5.2.6. - RELEASE.jar libs/commons-configuration-1.8.jar libs/spring-boot-starter - -tomcat-2.3.0.RELEASE.jar libs/logback-core-1.2.3.jar libs/lucene-group - ing-7.4.0.jar libs/spring-beans-5.2.6.RELEASE.jar libs/datafx-eventsyst - em-8.0.2-SNAPSHOT.jar libs/spring-boot-starter-web-2.3.0.RELEASE.jar li - bs/jackson-datatype-jdk8-2.11.0.jar libs/togglz-core-2.0.1.Final.jar li - bs/mysql-connector-java-8.0.20.jar libs/spring-webmvc-5.2.6.RELEASE.jar - libs/jul-to-slf4j-1.7.30.jar libs/spring-jcl-5.2.6.RELEASE.jar libs/ne - tflix-commons-util-0.1.1.jar libs/spring-boot-2.3.0.RELEASE.jar libs/co - mmons-lang-2.6.jar libs/jackson-annotations-2.11.0.jar libs/jackson-dat - abind-2.11.0.jar libs/jersey-client-1.19.1.jar libs/fontawesomefx-8.9.j - ar libs/ribbon-httpclient-2.2.0.jar libs/ikonli-core-2.4.0.jar libs/myb - atis-3.5.5.jar libs/jersey-core-1.19.1.jar libs/guava-16.0.1.jar libs/s - pring-aop-5.2.6.RELEASE.jar libs/commons-codec-1.14.jar libs/mybatis-sp - ring-boot-starter-2.1.3.jar libs/httpclient-4.5.12.jar libs/feign-slf4j - -10.9.jar libs/jsqlparser-1.0.jar +Main-Class: com.fx.client.AppStartup +Class-Path: . libs/annotations-2.0.0.jar libs/feign-slf4j-10.9.jar libs/se + rvo-core-0.10.1.jar libs/jackson-databind-2.10.0.pr3.jar libs/netflix-c + ommons-util-0.1.1.jar libs/ribbon-loadbalancer-2.3.0.jar libs/pagehelpe + r-5.1.4.jar libs/spring-boot-starter-websocket-2.4.1.jar libs/fontaweso + mefx-8.9.jar libs/httpcore-4.2.1.jar libs/HikariCP-3.4.5.jar libs/log4j + -to-slf4j-2.13.3.jar libs/javafx-graphics-11.0.2-mac.jar libs/log4j-api + -2.13.3.jar libs/spring-boot-starter-jdbc-2.4.0.jar libs/feign-okhttp-1 + 0.9.jar libs/druid-spring-boot-starter-1.1.14.jar libs/spring-web-5.3.2 + .jar libs/spring-security-config-5.4.2.jar libs/spring-boot-starter-2.4 + .1.jar libs/ribbon-core-2.3.0.jar libs/jackson-datatype-jsr310-2.11.3.j + ar libs/spring-aop-5.3.2.jar libs/junit-4.12.jar libs/spring-boot-start + er-quartz-2.4.1.jar libs/logback-core-1.1.7.jar libs/hamcrest-core-1.3. + jar libs/feign-core-10.9.jar libs/spring-security-core-5.4.2.jar libs/j + ersey-core-1.19.1.jar libs/spring-boot-2.4.1.jar libs/mybatis-spring-bo + ot-autoconfigure-2.1.4.jar libs/feign-jackson-10.9.jar libs/okio-1.17.2 + .jar libs/mybatis-spring-2.0.6.jar libs/jakarta.annotation-api-1.3.5.ja + r libs/tomcat-embed-websocket-9.0.41.jar libs/feign-ribbon-10.9.jar lib + s/datafx-flow-8.0.2-SNAPSHOT.jar libs/snakeyaml-1.27.jar libs/javassist + -3.18.1-GA.jar libs/joda-time-2.10.1.jar libs/spring-boot-starter-secur + ity-2.4.1.jar libs/okhttp-3.14.6.jar libs/DmJdbcDriver-1.0.0.jar libs/d + ruid-1.1.14.jar libs/jackson-annotations-2.10.0.pr3.jar libs/ikonli-jav + afx-2.4.0.jar libs/Java-WebSocket-1.5.1.jar libs/jsr305-3.0.1.jar libs/ + mybatis-spring-boot-starter-2.1.4.jar libs/commons-lang-2.6.jar libs/sp + ring-context-support-5.3.2.jar libs/spring-context-5.3.2.jar libs/jacks + on-module-parameter-names-2.11.3.jar libs/spring-boot-autoconfigure-1.5 + .12.RELEASE.jar libs/javafx-base-11.0.2.jar libs/ikonli-core-2.4.0.jar + libs/feign-hystrix-10.9.jar libs/spring-security-web-5.4.2.jar libs/spr + ing-expression-5.2.11.RELEASE.jar libs/rxjava-1.2.0.jar libs/slf4j-api- + 1.7.21.jar libs/spring-boot-starter-json-2.4.1.jar libs/lombok-1.18.16. + jar libs/javafx-media-11.0.2.jar libs/c3p0-0.9.5.4.jar libs/datafx-inje + ction-8.0.2-SNAPSHOT.jar libs/jul-to-slf4j-1.7.30.jar libs/jersey-apach + e-client4-1.19.1.jar libs/jfoenix-8.0.10.jar libs/jjwt-0.7.0.jar libs/c + ommons-lang3-3.4.jar libs/tomcat-embed-core-9.0.41.jar libs/netflix-sta + tistics-0.1.1.jar libs/controlsfx-11.0.3.jar libs/spring-messaging-5.3. + 2.jar libs/spring-tx-5.3.2.jar libs/spring-boot-starter-web-2.4.1.jar l + ibs/spring-boot-starter-tomcat-2.4.1.jar libs/spring-jcl-5.3.2.jar libs + /HikariCP-java7-2.4.13.jar libs/spring-beans-5.3.2.jar libs/HdrHistogra + m-2.1.9.jar libs/guava-16.0.1.jar libs/pinyin4j-2.5.0.jar libs/spring-w + ebsocket-5.3.2.jar libs/commons-collections-3.2.1.jar libs/datafx-event + system-8.0.2-SNAPSHOT.jar libs/httpclient-4.2.1.jar libs/mchange-common + s-java-0.2.15.jar libs/jakarta.el-3.0.3.jar libs/pagehelper-spring-boot + -autoconfigure-1.2.5.jar libs/javafx-base-11.0.2-mac.jar libs/jackson-c + ore-2.10.0.pr3.jar libs/ribbon-httpclient-2.2.0.jar libs/spring-boot-st + arter-cache-2.4.1.jar libs/commons-logging-1.1.1.jar libs/javafx-media- + 11.0.2-mac.jar libs/jsqlparser-1.0.jar libs/javafx-controls-11.0.2-mac. + jar libs/archaius-core-0.7.6.jar libs/spring-boot-starter-logging-2.4.1 + .jar libs/mysql-connector-java-8.0.20.jar libs/javafx-graphics-11.0.2.j + ar libs/javafx-controls-11.0.2.jar libs/javax.inject-1.jar libs/datafx- + core-8.0.2-SNAPSHOT.jar libs/quartz-2.3.2.jar libs/logback-classic-1.1. + 7.jar libs/spring-jdbc-5.3.1.jar libs/ikonli-fontawesome5-pack-2.4.0.ja + r libs/hystrix-core-1.5.18.jar libs/jersey-client-1.19.1.jar libs/commo + ns-configuration-1.8.jar libs/jsr311-api-1.1.1.jar libs/mybatis-3.5.6.j + ar libs/spring-webmvc-5.3.2.jar libs/servo-internal-0.10.1.jar libs/spr + ing-core-5.3.2.jar libs/jackson-datatype-jdk8-2.11.3.jar libs/pagehelpe + r-spring-boot-starter-1.2.5.jar libs/commons-codec-1.6.jar diff --git a/falsework-client/src/main/java/com/epri/fx/client/websocket/Session.java b/falsework-client/src/main/java/com/epri/fx/client/websocket/Session.java deleted file mode 100644 index 19cebbc..0000000 --- a/falsework-client/src/main/java/com/epri/fx/client/websocket/Session.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.epri.fx.client.websocket; - -import io.datafx.controller.injection.scopes.ApplicationScoped; -import io.datafx.controller.injection.scopes.FlowScoped; - -/** - * @description: - * @className: Session - * @author: liwen - * @date: 2020/6/24 16:17 - */ -@ApplicationScoped -public class Session { - - private int counter = 0; - - public Session() { - - } - - public void print(String from) { - System.out.println(from + ": counter = " + counter++); - } -} diff --git a/falsework-client/src/main/java/com/epri/fx/client/AppStartup.java b/falsework-client/src/main/java/com/fx/client/AppStartup.java similarity index 62% rename from falsework-client/src/main/java/com/epri/fx/client/AppStartup.java rename to falsework-client/src/main/java/com/fx/client/AppStartup.java index 48c7a98..466468c 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/AppStartup.java +++ b/falsework-client/src/main/java/com/fx/client/AppStartup.java @@ -1,8 +1,9 @@ -package com.epri.fx.client; +package com.fx.client; -import com.epri.fx.client.gui.uicomponents.control.LFXDecorator; -import com.epri.fx.client.gui.uicomponents.login.LoginController; -import com.epri.fx.client.store.ApplicatonStore; +import com.fx.client.gui.uicomponents.control.LFXDecorator; +import com.fx.client.gui.uicomponents.login.LoginController; +import com.fx.client.store.ApplicatonStore; +import com.fx.client.websocket.WSClient; import com.jfoenix.assets.JFoenixResources; import com.jfoenix.svg.SVGGlyph; import com.jfoenix.svg.SVGGlyphLoader; @@ -12,9 +13,10 @@ import io.datafx.controller.flow.Flow; import io.datafx.controller.flow.FlowHandler; import io.datafx.controller.flow.container.AnimatedFlowContainer; import io.datafx.controller.flow.container.ContainerAnimations; +import io.datafx.controller.flow.context.FXMLViewFlowContext; +import io.datafx.controller.flow.context.ViewFlowContext; import javafx.application.Application; import javafx.scene.Scene; -import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.stage.Stage; @@ -32,7 +34,10 @@ import java.io.InputStream; */ public class AppStartup extends Application { + @FXMLViewFlowContext + private ViewFlowContext flowContext; + private ApplicationContext applicationContext = ApplicationContext.getInstance(); @Override public void init() throws Exception { @@ -40,7 +45,7 @@ public class AppStartup extends Application { InputStream in = AppStartup.class.getClassLoader().getResourceAsStream("fonts/msyh.ttf"); Font font1 = Font.loadFont(in, 12); - System.err.println(font1.getName()+"\t"+font1.getFamily()); + System.err.println(font1.getName() + "\t" + font1.getFamily()); ConfigurationManager.loadPropertiesFromResources("sample-client.properties"); // @@ -66,20 +71,20 @@ public class AppStartup extends Application { } }).start(); + Flow contentFlow = new Flow(LoginController.class); + AnimatedFlowContainer container = new AnimatedFlowContainer(Duration.millis(320), ContainerAnimations.SWIPE_LEFT); + flowContext = new ViewFlowContext(); + final FlowHandler contentFlowHandler = contentFlow.createHandler(flowContext); + applicationContext.register(stage, Stage.class); + applicationContext.register("ContentFlowHandler", contentFlowHandler); + contentFlowHandler.start(container); - ApplicationContext.getInstance().register(stage, Stage.class); - - Flow flow = new Flow(LoginController.class); - FlowHandler flowHandler = flow.createHandler(); - StackPane rootPane = flowHandler.start(new AnimatedFlowContainer(Duration.millis(320), ContainerAnimations.SWIPE_LEFT)); - - ApplicationContext.getInstance().register("mainFlowHandler", flowHandler); - ApplicationContext.getInstance().register(rootPane, StackPane.class); - - LFXDecorator wfxDecorator = new LFXDecorator(stage, rootPane, false, true, true); + LFXDecorator wfxDecorator = new LFXDecorator(stage, container.getView(), false, true, true); wfxDecorator.setCustomMaximize(true); wfxDecorator.setGraphic(new SVGGlyph("")); + + Scene scene = new Scene(wfxDecorator, 1000, 750); stage.setTitle("JavaFX Welcome"); scene.setFill(Color.TRANSPARENT); @@ -87,13 +92,13 @@ public class AppStartup extends Application { stage.show(); - scene.getStylesheets().addAll(JFoenixResources.load("/css/app-fonts.css").toExternalForm(),AppStartup.class.getResource("/css/login.css").toExternalForm(),AppStartup.class.getResource("/css/app-light.css").toExternalForm()); + scene.getStylesheets().addAll(JFoenixResources.load("/css/app-fonts.css").toExternalForm(), AppStartup.class.getResource("/css/login.css").toExternalForm(), AppStartup.class.getResource("/css/app-light.css").toExternalForm()); } @Override public void stop() throws Exception { - + WSClient.getInstance().close(); } } diff --git a/falsework-client/src/main/java/com/epri/fx/client/bean/CountryPath.java b/falsework-client/src/main/java/com/fx/client/bean/CountryPath.java similarity index 98% rename from falsework-client/src/main/java/com/epri/fx/client/bean/CountryPath.java rename to falsework-client/src/main/java/com/fx/client/bean/CountryPath.java index f76c003..ffac112 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/bean/CountryPath.java +++ b/falsework-client/src/main/java/com/fx/client/bean/CountryPath.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.epri.fx.client.bean; +package com.fx.client.bean; import javafx.scene.control.Tooltip; import javafx.scene.shape.SVGPath; diff --git a/falsework-client/src/main/java/com/epri/fx/client/bean/MenuVoCell.java b/falsework-client/src/main/java/com/fx/client/bean/MenuVoCell.java similarity index 88% rename from falsework-client/src/main/java/com/epri/fx/client/bean/MenuVoCell.java rename to falsework-client/src/main/java/com/fx/client/bean/MenuVoCell.java index fe553f9..fc73639 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/bean/MenuVoCell.java +++ b/falsework-client/src/main/java/com/fx/client/bean/MenuVoCell.java @@ -1,8 +1,6 @@ -package com.epri.fx.client.bean; +package com.fx.client.bean; -import com.epri.fx.server.entity.Menu; -import com.epri.fx.server.vo.MenuVO; -import javafx.beans.property.ListProperty; +import com.fx.server.vo.MenuVO; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleListProperty; import javafx.beans.property.SimpleObjectProperty; diff --git a/falsework-client/src/main/java/com/epri/fx/client/exception/AppRunException.java b/falsework-client/src/main/java/com/fx/client/exception/AppRunException.java similarity index 97% rename from falsework-client/src/main/java/com/epri/fx/client/exception/AppRunException.java rename to falsework-client/src/main/java/com/fx/client/exception/AppRunException.java index 6ca762f..c508ea8 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/exception/AppRunException.java +++ b/falsework-client/src/main/java/com/fx/client/exception/AppRunException.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.exception; +package com.fx.client.exception; import javafx.application.Platform; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/feature/DisabledByFeature.java b/falsework-client/src/main/java/com/fx/client/gui/feature/DisabledByFeature.java similarity index 87% rename from falsework-client/src/main/java/com/epri/fx/client/gui/feature/DisabledByFeature.java rename to falsework-client/src/main/java/com/fx/client/gui/feature/DisabledByFeature.java index e271497..7b70ae0 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/feature/DisabledByFeature.java +++ b/falsework-client/src/main/java/com/fx/client/gui/feature/DisabledByFeature.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.feature; +package com.fx.client.gui.feature; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/feature/FeatureHandler.java b/falsework-client/src/main/java/com/fx/client/gui/feature/FeatureHandler.java similarity index 90% rename from falsework-client/src/main/java/com/epri/fx/client/gui/feature/FeatureHandler.java rename to falsework-client/src/main/java/com/fx/client/gui/feature/FeatureHandler.java index 5599322..35525ff 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/feature/FeatureHandler.java +++ b/falsework-client/src/main/java/com/fx/client/gui/feature/FeatureHandler.java @@ -1,6 +1,6 @@ -package com.epri.fx.client.gui.feature; +package com.fx.client.gui.feature; -import com.epri.fx.client.store.ApplicatonStore; +import com.fx.client.store.ApplicatonStore; import javafx.beans.property.SimpleBooleanProperty; import javafx.scene.Node; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/feature/FeatureResourceConsumer.java b/falsework-client/src/main/java/com/fx/client/gui/feature/FeatureResourceConsumer.java similarity index 97% rename from falsework-client/src/main/java/com/epri/fx/client/gui/feature/FeatureResourceConsumer.java rename to falsework-client/src/main/java/com/fx/client/gui/feature/FeatureResourceConsumer.java index a08d0c3..a3af79b 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/feature/FeatureResourceConsumer.java +++ b/falsework-client/src/main/java/com/fx/client/gui/feature/FeatureResourceConsumer.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.feature; +package com.fx.client.gui.feature; import io.datafx.controller.ViewNode; import io.datafx.controller.injection.scopes.ApplicationScoped; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/feature/HideByFeature.java b/falsework-client/src/main/java/com/fx/client/gui/feature/HideByFeature.java similarity index 87% rename from falsework-client/src/main/java/com/epri/fx/client/gui/feature/HideByFeature.java rename to falsework-client/src/main/java/com/fx/client/gui/feature/HideByFeature.java index 55763b8..e04199d 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/feature/HideByFeature.java +++ b/falsework-client/src/main/java/com/fx/client/gui/feature/HideByFeature.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.feature; +package com.fx.client.gui.feature; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/group/GroupManagementController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/group/GroupManagementController.java similarity index 90% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/group/GroupManagementController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/group/GroupManagementController.java index 9b80f22..8cce094 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/group/GroupManagementController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/group/GroupManagementController.java @@ -1,10 +1,10 @@ -package com.epri.fx.client.gui.uicomponents.admin.group; +package com.fx.client.gui.uicomponents.admin.group; -import com.epri.fx.client.gui.uicomponents.admin.group.components.GroupDetailController; -import com.epri.fx.client.model.GroupDataModel; -import com.epri.fx.client.request.Request; -import com.epri.fx.client.request.feign.admin.GroupTypeFeign; -import com.epri.fx.server.vo.GroupTypeVO; +import com.fx.client.gui.uicomponents.admin.group.components.GroupDetailController; +import com.fx.client.model.GroupDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.GroupTypeFeign; +import com.fx.server.vo.GroupTypeVO; import com.jfoenix.controls.JFXSpinner; import com.jfoenix.controls.JFXTabPane; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/group/components/GroupDetailController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/group/components/GroupDetailController.java similarity index 97% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/group/components/GroupDetailController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/group/components/GroupDetailController.java index a03bbe4..9896690 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/group/components/GroupDetailController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/group/components/GroupDetailController.java @@ -1,18 +1,17 @@ -package com.epri.fx.client.gui.uicomponents.admin.group.components; +package com.fx.client.gui.uicomponents.admin.group.components; -import com.epri.fx.client.gui.uicomponents.control.FilterableCheckBoxTreeItem; -import com.epri.fx.client.gui.uicomponents.control.FilterableTreeItem; -import com.epri.fx.client.gui.uicomponents.control.TreeItemPredicate; -import com.epri.fx.client.model.GroupDataModel; -import com.epri.fx.client.request.Request; -import com.epri.fx.client.request.feign.admin.GroupFeign; -import com.epri.fx.client.request.feign.admin.MenuFeign; -import com.epri.fx.client.store.ApplicatonStore; -import com.epri.fx.client.utils.Pinyin4jUtil; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.vo.ElementVO; -import com.epri.fx.server.vo.GroupVO; -import com.epri.fx.server.vo.MenuVO; +import com.fx.client.gui.uicomponents.control.TreeItemPredicate; +import com.fx.client.gui.uicomponents.control.FilterableCheckBoxTreeItem; +import com.fx.client.gui.uicomponents.control.FilterableTreeItem; +import com.fx.client.model.GroupDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.GroupFeign; +import com.fx.client.store.ApplicatonStore; +import com.fx.client.utils.Pinyin4jUtil; +import com.fx.server.entity.User; +import com.fx.server.vo.ElementVO; +import com.fx.server.vo.GroupVO; +import com.fx.server.vo.MenuVO; import com.jfoenix.controls.*; import com.jfoenix.svg.SVGGlyphLoader; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/grouptype/GroupTypeManagementController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/grouptype/GroupTypeManagementController.java similarity index 96% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/grouptype/GroupTypeManagementController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/grouptype/GroupTypeManagementController.java index 1e1f718..affea83 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/grouptype/GroupTypeManagementController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/grouptype/GroupTypeManagementController.java @@ -1,12 +1,11 @@ -package com.epri.fx.client.gui.uicomponents.admin.grouptype; +package com.fx.client.gui.uicomponents.admin.grouptype; -import com.epri.fx.client.model.GroupTypeDataModel; -import com.epri.fx.client.request.Request; -import com.epri.fx.client.request.feign.admin.GroupTypeFeign; -import com.epri.fx.client.request.feign.admin.UserFeign; -import com.epri.fx.client.store.ApplicatonStore; -import com.epri.fx.client.utils.Pinyin4jUtil; -import com.epri.fx.server.vo.GroupTypeVO; +import com.fx.client.model.GroupTypeDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.GroupTypeFeign; +import com.fx.client.store.ApplicatonStore; +import com.fx.client.utils.Pinyin4jUtil; +import com.fx.server.vo.GroupTypeVO; import com.jfoenix.controls.*; import com.jfoenix.svg.SVGGlyphLoader; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/logManagement/LoginLogController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/logManagement/LoginLogController.java new file mode 100644 index 0000000..d2d2f2e --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/logManagement/LoginLogController.java @@ -0,0 +1,229 @@ +package com.fx.client.gui.uicomponents.admin.logManagement; + +import com.fx.client.model.LoginLogDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.LoginLogFeign; +import com.fx.client.utils.Pinyin4jUtil; +import com.fx.server.entity.log.SysLoginInfor; +import com.fx.server.util.DateUtils; +import com.jfoenix.controls.JFXDatePicker; +import com.jfoenix.controls.JFXSpinner; +import io.datafx.controller.ViewController; +import io.datafx.controller.flow.action.ActionMethod; +import io.datafx.controller.flow.action.ActionTrigger; +import io.datafx.core.concurrent.ProcessChain; +import javafx.collections.transformation.FilteredList; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.layout.VBox; +import javafx.util.Callback; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @description: + * @className: LoginLogController + * @author: liwen + * @date: 2021/1/4 14:06 + */ +@ViewController("/fxml/admin/logManagement/login_log.fxml") +public class LoginLogController { + + @FXML + private VBox contentPane; + + @FXML + private TextField loginNameTextfield; + @FXML + private TextField addrTextfield; + @FXML + private ComboBox statusComboBox; + + @FXML + private TableView tableView; + @FXML + private Pagination pagination; + @FXML + private JFXSpinner spinner; + @FXML + @ActionTrigger("rest") + private Button restButton; + @FXML + @ActionTrigger("search") + private Button searchButton; + @FXML + private JFXDatePicker startDatePicker; + @FXML + private JFXDatePicker endDatePicker; + + @FXML + private TableColumn infoIdColumn; + @FXML + private TableColumn loginNameColumn; + @FXML + private TableColumn ipaddrColumn; + @FXML + private TableColumn statusColumn; + @FXML + private TableColumn msgColumn; + @FXML + private TableColumn loginTimeColumn; + + @Inject + private LoginLogDataModel loginLogDataModel; + + @PostConstruct + private void init() { + spinner.setVisible(false); + statusComboBox.getSelectionModel().select(0); + infoIdColumn.setCellValueFactory(new PropertyValueFactory<>("infoId")); + loginNameColumn.setCellValueFactory(new PropertyValueFactory<>("loginName")); + ipaddrColumn.setCellValueFactory(new PropertyValueFactory<>("ipaddr")); + statusColumn.setCellValueFactory(new PropertyValueFactory<>("status")); + statusColumn.setCellFactory(col -> { + TableCell cell = new TableCell() { + private Label label = new Label(""); + + @Override + protected void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + this.setText(null); + this.setGraphic(null); + if (!empty) { + + if (item.equals("0")) { + label.setId("status-success-label"); + label.setText("成功"); + } else { + label.setId("status-error-label"); + label.setText("失败"); + } + setGraphic(label); + } + } + }; + return cell; + }); + msgColumn.setCellValueFactory(new PropertyValueFactory<>("msg")); + loginTimeColumn.setCellValueFactory(new PropertyValueFactory<>("loginTime")); + loginTimeColumn.setCellFactory(col -> { + + TableCell cell = new TableCell() { + @Override + protected void updateItem(Date item, boolean empty) { + super.updateItem(item, empty); + this.setText(null); + this.setGraphic(null); + if (!empty && item != null) { + setText(DateUtils.formatDate(item, DateUtils.DATETIME_FORMAT)); + } + } + }; + return cell; + }); + + FilteredList filteredData = new FilteredList<>(loginLogDataModel.getSysLoginInfors(), p -> true); + tableView.setItems(filteredData); + loginNameTextfield.textProperty().addListener((o, oldVal, newVal) -> { + filteredData.setPredicate(elementProp -> { + if (newVal == null || newVal.isEmpty()) { + return true; + } + String val = Pinyin4jUtil.toPinYinLowercase(newVal); + return Pinyin4jUtil.toPinYinLowercase(elementProp.getLoginName()).contains(val); + }); + }); + + loginLogDataModel.selectedPersonIndexProperty().bind(tableView.getSelectionModel().selectedIndexProperty()); + pagination.pageCountProperty().bind(loginLogDataModel.pageCountProperty()); + pagination.setPageFactory(new Callback() { + @Override + public Node call(Integer param) { + showPage(param + 1); + return tableView; + } + }); + + + } + + + private void showPage(Integer page) { + + + Map queryMap = getQueryMap(); + queryMap.put("page", page); + queryMap.put("limit", 20); + query(queryMap); + + } + + private Map getQueryMap() { + String loginName = loginNameTextfield.getText(); + String ipaddr = addrTextfield.getText(); + String status = statusComboBox.getSelectionModel().selectedIndexProperty().getValue() == 0 ? null : (statusComboBox.getSelectionModel().selectedIndexProperty().getValue() == 1 ? "0" : "1"); + LocalDate beginDate = startDatePicker.getValue(); + LocalDate endDate = endDatePicker.getValue(); + + Map queryMap = new HashMap<>(); + queryMap.put("page", 0); + queryMap.put("limit", 20); + queryMap.put("loginName", loginName); + queryMap.put("ipaddr", ipaddr); + queryMap.put("status", status); + queryMap.put("startTime", beginDate != null ? beginDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")) : null); + queryMap.put("endTime", endDate != null ? endDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")) : null); + return queryMap; + } + + private void query(Map queryMap) { + + ProcessChain.create() + .addRunnableInPlatformThread(() -> { + loginLogDataModel.getSysLoginInfors().clear(); + spinner.setVisible(true); + contentPane.setDisable(true); + }) + .addSupplierInExecutor( + () -> Request.connector(LoginLogFeign.class).getSysLoginInfor(queryMap) + ) + .addConsumerInPlatformThread(result -> { + + List gateLogs = result.getDatas(); + loginLogDataModel.setPageCount((int) result.getTotal()); + loginLogDataModel.getSysLoginInfors().addAll(gateLogs); + + }) + .withFinal(() -> { + spinner.setVisible(false); + contentPane.setDisable(false); + }) + .onException(e -> e.printStackTrace()) + .run(); + } + + @ActionMethod("search") + private void search() { + pagination.currentPageIndexProperty().setValue(0); + query(getQueryMap()); + } + + @ActionMethod("rest") + private void rest() { + loginNameTextfield.setText(""); + addrTextfield.setText(""); + statusComboBox.getSelectionModel().select(0); + startDatePicker.valueProperty().set(null); + endDatePicker.valueProperty().set(null); + searchButton.fire(); + } +} diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/log/LogManagementController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/logManagement/OperationLogController.java similarity index 86% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/log/LogManagementController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/logManagement/OperationLogController.java index c65a23c..beafab4 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/log/LogManagementController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/logManagement/OperationLogController.java @@ -1,43 +1,28 @@ -package com.epri.fx.client.gui.uicomponents.admin.log; +package com.fx.client.gui.uicomponents.admin.logManagement; -import com.epri.fx.client.gui.feature.FeatureResourceConsumer; -import com.epri.fx.client.gui.feature.HideByFeature; -import com.epri.fx.client.gui.uicomponents.admin.user.components.UserAddController; -import com.epri.fx.client.gui.uicomponents.admin.user.components.UserEditController; -import com.epri.fx.client.model.LogDataModel; -import com.epri.fx.client.model.UserDataModel; -import com.epri.fx.client.request.Request; -import com.epri.fx.client.request.feign.admin.LogFeign; -import com.epri.fx.client.request.feign.admin.UserFeign; -import com.epri.fx.client.request.feign.login.LoginFeign; -import com.epri.fx.client.store.ApplicatonStore; -import com.epri.fx.client.utils.Pinyin4jUtil; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.entity.log.GateLog; -import com.epri.fx.server.entity.log.LogInfo; -import com.epri.fx.server.util.DateUtils; -import com.epri.fx.server.vo.UserVO; +import com.fx.client.gui.feature.FeatureResourceConsumer; +import com.fx.client.model.LogDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.LogFeign; +import com.fx.client.request.feign.admin.UserFeign; +import com.fx.client.utils.Pinyin4jUtil; +import com.fx.server.entity.log.GateLog; import com.jfoenix.controls.JFXAlert; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXDialogLayout; -import com.jfoenix.svg.SVGGlyphLoader; import io.datafx.controller.ViewController; -import io.datafx.controller.flow.FlowException; import io.datafx.controller.flow.action.ActionMethod; import io.datafx.controller.flow.action.ActionTrigger; import io.datafx.controller.flow.context.ActionHandler; import io.datafx.controller.flow.context.FlowActionHandler; -import io.datafx.controller.util.VetoException; import io.datafx.core.concurrent.ProcessChain; import io.datafx.eventsystem.Event; import io.datafx.eventsystem.OnEvent; import javafx.collections.transformation.FilteredList; import javafx.fxml.FXML; -import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.control.cell.PropertyValueFactory; -import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.stage.Modality; @@ -57,8 +42,8 @@ import java.util.Map; * @author: liwen * @date: 2020/3/4 21:05 */ -@ViewController(value = "/fxml/admin/log/log_management.fxml", title = "操作日志") -public class LogManagementController { +@ViewController(value = "/fxml/admin/logManagement/operation_log.fxml", title = "操作日志") +public class OperationLogController { public static final String CONTENT_PANE = "ContentPane"; @@ -220,6 +205,7 @@ public class LogManagementController { @ActionMethod("search") private void search() { + pagination.currentPageIndexProperty().setValue(0); Map queryMap = new HashMap<>(); queryMap.put("keyId", searchField.getText()); query(queryMap); diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/menu/MenuManagementController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/menu/MenuManagementController.java similarity index 97% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/menu/MenuManagementController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/menu/MenuManagementController.java index 9585c6f..d57c943 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/menu/MenuManagementController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/menu/MenuManagementController.java @@ -1,18 +1,17 @@ -package com.epri.fx.client.gui.uicomponents.admin.menu; +package com.fx.client.gui.uicomponents.admin.menu; -import com.epri.fx.client.gui.uicomponents.control.FilterableTreeItem; -import com.epri.fx.client.gui.uicomponents.control.TreeItemPredicate; -import com.epri.fx.client.model.MenuDataModel; -import com.epri.fx.client.request.Request; -import com.epri.fx.client.request.feign.admin.ElementFeign; -import com.epri.fx.client.request.feign.admin.MenuFeign; -import com.epri.fx.client.request.feign.admin.UserFeign; -import com.epri.fx.client.store.ApplicatonStore; -import com.epri.fx.client.utils.Pinyin4jUtil; -import com.epri.fx.server.entity.Element; -import com.epri.fx.server.msg.TableResultResponse; -import com.epri.fx.server.vo.ElementVO; -import com.epri.fx.server.vo.MenuVO; +import com.fx.client.gui.uicomponents.control.TreeItemPredicate; +import com.fx.client.gui.uicomponents.control.FilterableTreeItem; +import com.fx.client.model.MenuDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.ElementFeign; +import com.fx.client.request.feign.admin.MenuFeign; +import com.fx.client.store.ApplicatonStore; +import com.fx.client.utils.Pinyin4jUtil; +import com.fx.server.entity.Element; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.vo.ElementVO; +import com.fx.server.vo.MenuVO; import com.jfoenix.controls.*; import com.jfoenix.svg.SVGGlyphLoader; import io.datafx.controller.ViewController; @@ -170,6 +169,7 @@ public class MenuManagementController { @PostConstruct private void init() { + final ToggleGroup group = new ToggleGroup(); addButton.setToggleGroup(group); editButton.setToggleGroup(group); diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/user/UserManagementController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/user/UserManagementController.java similarity index 93% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/user/UserManagementController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/user/UserManagementController.java index 88189a9..e732fb5 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/user/UserManagementController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/user/UserManagementController.java @@ -1,21 +1,20 @@ -package com.epri.fx.client.gui.uicomponents.admin.user; +package com.fx.client.gui.uicomponents.admin.user; -import com.epri.fx.client.gui.feature.FeatureResourceConsumer; -import com.epri.fx.client.gui.feature.HideByFeature; -import com.epri.fx.client.gui.uicomponents.admin.user.components.UserAddController; -import com.epri.fx.client.gui.uicomponents.admin.user.components.UserEditController; -import com.epri.fx.client.model.UserDataModel; -import com.epri.fx.client.request.Request; -import com.epri.fx.client.request.feign.admin.UserFeign; -import com.epri.fx.client.store.ApplicatonStore; -import com.epri.fx.client.utils.Pinyin4jUtil; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.util.DateUtils; -import com.epri.fx.server.vo.UserVO; +import com.fx.client.gui.feature.FeatureResourceConsumer; +import com.fx.client.gui.feature.HideByFeature; +import com.fx.client.gui.uicomponents.admin.user.components.UserAddController; +import com.fx.client.gui.uicomponents.admin.user.components.UserEditController; +import com.fx.client.model.UserDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.UserFeign; +import com.fx.client.store.ApplicatonStore; +import com.fx.client.utils.Pinyin4jUtil; +import com.fx.server.entity.User; +import com.fx.server.util.DateUtils; +import com.fx.server.vo.UserVO; import com.jfoenix.controls.JFXAlert; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXDialogLayout; -import com.jfoenix.svg.SVGGlyph; import com.jfoenix.svg.SVGGlyphLoader; import io.datafx.controller.ViewController; import io.datafx.controller.flow.FlowException; @@ -336,6 +335,8 @@ public class UserManagementController { @ActionMethod("search") private void search() { + pagination.currentPageIndexProperty().setValue(0); + Map queryMap = new HashMap<>(); queryMap.put("keyId", searchField.getText()); query(queryMap); @@ -357,7 +358,7 @@ public class UserManagementController { dataModel.setPageCount((int) result.getTotal()); for (User user : userList) { - dataModel.getUsers().add(new UserVO(user.getId(), user.getName(), user.getUsername(), DateUtils.format(user.getUpdTime(), DateUtils.DATE_TIME_PATTERN), user.getUpdUser(), user.getSex(), user.getDescription())); + dataModel.getUsers().add(new UserVO(user.getId(), user.getName(), user.getUsername(), DateUtils.formatDate(user.getUpdTime(), DateUtils.DATETIME_FORMAT), user.getUpdUser(), user.getSex(), user.getDescription())); } }) .withFinal(() -> { diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/user/components/UserAddController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/user/components/UserAddController.java similarity index 88% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/user/components/UserAddController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/user/components/UserAddController.java index 1202f15..46f58df 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/user/components/UserAddController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/user/components/UserAddController.java @@ -1,10 +1,10 @@ -package com.epri.fx.client.gui.uicomponents.admin.user.components; +package com.fx.client.gui.uicomponents.admin.user.components; -import com.epri.fx.client.gui.uicomponents.admin.user.UserManagementController; -import com.epri.fx.client.model.UserDataModel; -import com.epri.fx.client.request.Request; -import com.epri.fx.client.request.feign.admin.UserFeign; -import com.epri.fx.server.entity.User; +import com.fx.client.gui.uicomponents.admin.user.UserManagementController; +import com.fx.client.model.UserDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.UserFeign; +import com.fx.server.entity.User; import com.jfoenix.controls.*; import io.datafx.controller.ViewController; import io.datafx.controller.flow.FlowException; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/user/components/UserEditController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/user/components/UserEditController.java similarity index 91% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/user/components/UserEditController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/user/components/UserEditController.java index db9fa27..d9fa311 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/admin/user/components/UserEditController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/admin/user/components/UserEditController.java @@ -1,11 +1,11 @@ -package com.epri.fx.client.gui.uicomponents.admin.user.components; +package com.fx.client.gui.uicomponents.admin.user.components; -import com.epri.fx.client.gui.uicomponents.admin.user.UserManagementController; -import com.epri.fx.client.model.UserDataModel; -import com.epri.fx.client.request.Request; -import com.epri.fx.client.request.feign.admin.UserFeign; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.vo.UserVO; +import com.fx.client.gui.uicomponents.admin.user.UserManagementController; +import com.fx.client.model.UserDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.UserFeign; +import com.fx.server.entity.User; +import com.fx.server.vo.UserVO; import com.jfoenix.controls.*; import io.datafx.controller.ViewController; import io.datafx.controller.flow.FlowException; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/BasicDataSetController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/BasicDataSetController.java similarity index 84% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/BasicDataSetController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/BasicDataSetController.java index b43b2be..244dfb0 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/BasicDataSetController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/BasicDataSetController.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.basicInfo; +package com.fx.client.gui.uicomponents.basicInfo; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/CoalPriceDiffController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/CoalPriceDiffController.java similarity index 84% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/CoalPriceDiffController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/CoalPriceDiffController.java index de621da..8cd05b4 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/CoalPriceDiffController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/CoalPriceDiffController.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.basicInfo; +package com.fx.client.gui.uicomponents.basicInfo; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/CurrentFreightController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/CurrentFreightController.java similarity index 84% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/CurrentFreightController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/CurrentFreightController.java index 2448246..8624936 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/CurrentFreightController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/CurrentFreightController.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.basicInfo; +package com.fx.client.gui.uicomponents.basicInfo; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/MainConclusionController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/MainConclusionController.java similarity index 84% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/MainConclusionController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/MainConclusionController.java index a947f27..b1173ce 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/MainConclusionController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/MainConclusionController.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.basicInfo; +package com.fx.client.gui.uicomponents.basicInfo; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/RailwayCostController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/RailwayCostController.java similarity index 84% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/RailwayCostController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/RailwayCostController.java index 32883d5..407ff88 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/basicInfo/RailwayCostController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/RailwayCostController.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.basicInfo; +package com.fx.client.gui.uicomponents.basicInfo; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/container/TabPaneFlowContainer.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/container/TabPaneFlowContainer.java similarity index 97% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/container/TabPaneFlowContainer.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/container/TabPaneFlowContainer.java index ebd8d22..b83c03f 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/container/TabPaneFlowContainer.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/container/TabPaneFlowContainer.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.container; +package com.fx.client.gui.uicomponents.container; import com.jfoenix.controls.JFXTabPane; import de.jensd.fx.glyphs.materialdesignicons.MaterialDesignIcon; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/FilterableCheckBoxTreeItem.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/FilterableCheckBoxTreeItem.java similarity index 98% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/FilterableCheckBoxTreeItem.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/FilterableCheckBoxTreeItem.java index aae2588..9f34e00 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/FilterableCheckBoxTreeItem.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/FilterableCheckBoxTreeItem.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.control; +package com.fx.client.gui.uicomponents.control; import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/FilterableTreeItem.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/FilterableTreeItem.java similarity index 98% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/FilterableTreeItem.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/FilterableTreeItem.java index e8c3e11..3ef502f 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/FilterableTreeItem.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/FilterableTreeItem.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.control; +package com.fx.client.gui.uicomponents.control; import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/LFXDecorator.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/LFXDecorator.java similarity index 99% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/LFXDecorator.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/LFXDecorator.java index 2914d1b..9d04923 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/LFXDecorator.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/LFXDecorator.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.control; +package com.fx.client.gui.uicomponents.control; import com.jfoenix.controls.JFXButton; import com.jfoenix.svg.SVGGlyph; @@ -21,8 +21,6 @@ import javafx.geometry.Rectangle2D; import javafx.scene.Cursor; import javafx.scene.Node; import javafx.scene.control.Tooltip; -import javafx.scene.effect.DropShadow; -import javafx.scene.effect.Shadow; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Background; import javafx.scene.layout.BackgroundFill; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/TreeItemPredicate.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/TreeItemPredicate.java similarity index 85% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/TreeItemPredicate.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/TreeItemPredicate.java index ccf7a5d..d7e7e93 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/control/TreeItemPredicate.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/TreeItemPredicate.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.control; +package com.fx.client.gui.uicomponents.control; import javafx.scene.control.TreeItem; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/home/HomeController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/home/HomeController.java similarity index 97% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/home/HomeController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/home/HomeController.java index 3135a4c..7c1f5ff 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/home/HomeController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/home/HomeController.java @@ -1,7 +1,7 @@ -package com.epri.fx.client.gui.uicomponents.home; +package com.fx.client.gui.uicomponents.home; -import com.epri.fx.client.bean.CountryPath; -import com.epri.fx.client.store.ApplicatonStore; +import com.fx.client.bean.CountryPath; +import com.fx.client.store.ApplicatonStore; import eu.hansolo.tilesfx.Tile; import eu.hansolo.tilesfx.TileBuilder; import eu.hansolo.tilesfx.TimeSection; @@ -10,13 +10,9 @@ import eu.hansolo.tilesfx.addons.Indicator; import eu.hansolo.tilesfx.chart.ChartData; import eu.hansolo.tilesfx.chart.RadarChart; import eu.hansolo.tilesfx.chart.TilesFXSeries; -import eu.hansolo.tilesfx.colors.Bright; -import eu.hansolo.tilesfx.colors.Dark; import eu.hansolo.tilesfx.skins.BarChartItem; import eu.hansolo.tilesfx.skins.LeaderBoardItem; import eu.hansolo.tilesfx.tools.Country; -import eu.hansolo.tilesfx.tools.FlowGridPane; -import eu.hansolo.tilesfx.tools.Helper; import eu.hansolo.tilesfx.tools.Location; import eu.hansolo.tilesfx.weather.DarkSky; import io.datafx.controller.ViewController; @@ -27,28 +23,23 @@ import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.collections.ObservableList; import javafx.fxml.FXML; -import javafx.geometry.Insets; -import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.chart.XYChart; -import javafx.scene.layout.*; +import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; import javafx.scene.paint.CycleMethod; import javafx.scene.paint.LinearGradient; import javafx.scene.paint.Stop; -import javafx.scene.text.TextAlignment; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.time.LocalTime; -import java.time.ZonedDateTime; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Random; import java.util.concurrent.ConcurrentHashMap; -import static javafx.scene.layout.Region.USE_COMPUTED_SIZE; -import static javafx.scene.layout.Region.USE_PREF_SIZE; - /** * @description: * @className: HomeController diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/login/LoadingController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoadingController.java similarity index 82% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/login/LoadingController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoadingController.java index 41110d4..464ea85 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/login/LoadingController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoadingController.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.login; +package com.fx.client.gui.uicomponents.login; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/login/LoginController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java similarity index 91% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/login/LoginController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java index 12c314c..46c8e1a 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/login/LoginController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java @@ -1,18 +1,19 @@ -package com.epri.fx.client.gui.uicomponents.login; +package com.fx.client.gui.uicomponents.login; -import com.epri.fx.client.bean.MenuVoCell; -import com.epri.fx.client.gui.uicomponents.main.MainController; -import com.epri.fx.client.request.Request; -import com.epri.fx.client.request.feign.admin.MenuFeign; -import com.epri.fx.client.request.feign.login.LoginFeign; -import com.epri.fx.client.store.ApplicatonStore; -import com.epri.fx.client.utils.AlertUtil; -import com.epri.fx.client.websocket.Session; -import com.epri.fx.server.util.EncryptUtil; -import com.epri.fx.server.util.user.JwtAuthenticationRequest; -import com.epri.fx.server.vo.FrontUser; -import com.epri.fx.server.vo.MenuVO; -import com.epri.fx.server.vo.PermissionInfo; +import com.fx.client.bean.MenuVoCell; +import com.fx.client.gui.uicomponents.main.MainController; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.MenuFeign; +import com.fx.client.request.feign.login.LoginFeign; +import com.fx.client.store.ApplicatonStore; +import com.fx.client.utils.AlertUtil; +import com.fx.client.websocket.WSClient; +import com.fx.server.msg.ObjectRestResponse; +import com.fx.server.util.EncryptUtil; +import com.fx.server.util.user.JwtAuthenticationRequest; +import com.fx.server.vo.FrontUser; +import com.fx.server.vo.MenuVO; +import com.fx.server.vo.PermissionInfo; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXPasswordField; import com.jfoenix.controls.JFXProgressBar; @@ -21,14 +22,10 @@ import com.jfoenix.svg.SVGGlyph; import com.jfoenix.svg.SVGGlyphLoader; import com.jfoenix.validation.RegexValidator; import io.datafx.controller.ViewController; -import io.datafx.controller.flow.FlowException; import io.datafx.controller.flow.action.ActionMethod; import io.datafx.controller.flow.action.ActionTrigger; import io.datafx.controller.flow.context.ActionHandler; -import io.datafx.controller.flow.context.FXMLViewFlowContext; import io.datafx.controller.flow.context.FlowActionHandler; -import io.datafx.controller.flow.context.ViewFlowContext; -import io.datafx.controller.util.VetoException; import io.datafx.core.concurrent.ProcessChain; import javafx.animation.*; import javafx.beans.binding.Bindings; @@ -49,10 +46,10 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.StackPane; import javafx.util.Duration; +import lombok.SneakyThrows; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; -import javax.inject.Inject; import java.io.File; import java.util.Arrays; import java.util.Comparator; @@ -69,6 +66,9 @@ import java.util.stream.Collectors; @ViewController("/fxml/login/login.fxml") public class LoginController { + @ActionHandler + private FlowActionHandler actionHandler; + @FXML private StackPane rootPane; @FXML @@ -122,17 +122,14 @@ public class LoginController { private Timeline frontTimeLine = new Timeline(); private Timeline backTimeLine = new Timeline(); - @ActionHandler - private FlowActionHandler actionHandler; - private SequentialTransition sequentialTransition = new SequentialTransition(); private DoubleProperty imageWidth = new SimpleDoubleProperty(); private DoubleProperty imageHeiht = new SimpleDoubleProperty(); - @Inject - private Session session; +// @Inject +// private WebSocketManagement webSocketManagement; @FXML @ActionTrigger("login") @@ -140,8 +137,6 @@ public class LoginController { @FXML private JFXButton registeredBut; - @FXMLViewFlowContext - private ViewFlowContext flowContext; @PostConstruct public void init() { @@ -209,6 +204,9 @@ public class LoginController { translateTransition ); parallelTransition.setCycleCount(1); + parallelTransition.setOnFinished(event -> { + userNameTextField.requestFocus(); + }); parallelTransition.play(); @@ -255,6 +253,7 @@ public class LoginController { pt.setLly(height + Math.cos(t) * back); } + @SneakyThrows private void loadingImage() { ImageView logBack = new ImageView("/images/login.jpg"); @@ -262,7 +261,9 @@ public class LoginController { logBack.fitWidthProperty().bind(imageWidth); imagePane.getChildren().add(new Label("", logBack)); - List files = Arrays.asList(new File(this.getClass().getResource("/images/login/").getPath()).listFiles()); + String imgUrl=this.getClass().getClassLoader().getResource("").toURI().getPath()+"images/login"; + System.err.println(imgUrl); + List files = Arrays.asList(new File(imgUrl).listFiles()); sequentialTransition.setAutoReverse(true); sequentialTransition.setCycleCount(Timeline.INDEFINITE); @@ -403,7 +404,16 @@ public class LoginController { centerPane.setDisable(true); loginBut.setText("正在登录..."); }) - .addSupplierInExecutor(() -> Request.connector(LoginFeign.class).login(jwtAuthenticationRequest)) + .addSupplierInExecutor(() -> { + ObjectRestResponse rel = Request.connector(LoginFeign.class).login(jwtAuthenticationRequest); + if (rel.getStatus() == 200) { + WSClient.getInstance().addHeader("Authorization", rel.getData()); + WSClient.getInstance().addHeader("userName",userNameTextField.getText()); + WSClient.getInstance().connect(); + + } + return rel; + }) .addConsumerInPlatformThread(rel -> { if (rel.getStatus() == 200) { @@ -432,10 +442,12 @@ public class LoginController { public void loadApplicatonStore() { ProcessChain.create() .addRunnableInPlatformThread(() -> { + + try { actionHandler.navigate(LoadingController.class); } catch (Exception e) { - throw new RuntimeException(e); + e.printStackTrace(); } ApplicatonStore.setName(""); ApplicatonStore.getAllMenu().clear(); @@ -473,6 +485,7 @@ public class LoginController { .addConsumerInPlatformThread(rel -> { ApplicatonStore.getPermissionMenus().addAll(rel); + }) .addSupplierInExecutor(() -> { @@ -507,6 +520,7 @@ public class LoginController { try { actionHandler.navigate(MainController.class); + } catch (Exception e) { throw new RuntimeException(e); } @@ -515,9 +529,7 @@ public class LoginController { e.printStackTrace(); try { actionHandler.navigate(LoginController.class); - } catch (VetoException vetoException) { - vetoException.printStackTrace(); - } catch (FlowException flowException) { + } catch (Exception flowException) { flowException.printStackTrace(); } }) diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/main/MainController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/MainController.java similarity index 79% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/main/MainController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/MainController.java index 34407e9..e3471e2 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/main/MainController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/MainController.java @@ -1,19 +1,18 @@ -package com.epri.fx.client.gui.uicomponents.main; +package com.fx.client.gui.uicomponents.main; -import com.epri.fx.client.AppStartup; -import com.epri.fx.client.bean.MenuVoCell; -import com.epri.fx.client.gui.feature.FeatureResourceConsumer; -import com.epri.fx.client.gui.uicomponents.home.HomeController; -import com.epri.fx.client.gui.uicomponents.login.LoginController; -import com.epri.fx.client.gui.uicomponents.main.components.UserInfoController; -import com.epri.fx.client.store.ApplicatonStore; -import com.epri.fx.server.vo.MenuVO; -import com.jfoenix.assets.JFoenixResources; +import com.fx.client.AppStartup; +import com.fx.client.bean.MenuVoCell; +import com.fx.client.gui.feature.FeatureResourceConsumer; +import com.fx.client.gui.uicomponents.home.HomeController; +import com.fx.client.gui.uicomponents.login.LoginController; +import com.fx.client.gui.uicomponents.main.components.UserInfoController; +import com.fx.client.store.ApplicatonStore; +import com.fx.client.websocket.WSClient; +import com.fx.server.vo.MenuVO; import com.jfoenix.controls.*; import com.jfoenix.svg.SVGGlyphLoader; import io.datafx.controller.ViewController; import io.datafx.controller.context.ApplicationContext; -import io.datafx.controller.context.FXMLApplicationContext; import io.datafx.controller.flow.Flow; import io.datafx.controller.flow.FlowException; import io.datafx.controller.flow.FlowHandler; @@ -31,6 +30,8 @@ import io.datafx.eventsystem.EventTrigger; import io.datafx.eventsystem.OnEvent; import javafx.animation.Transition; import javafx.beans.property.ListProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.geometry.Insets; @@ -61,13 +62,10 @@ import java.util.HashMap; @ViewController("/fxml/main/main.fxml") public class MainController { - @FXMLApplicationContext - private ApplicationContext context; - + private ObjectProperty selectItemProperty = new SimpleObjectProperty<>(); @ActionHandler private FlowActionHandler actionHandler; - @FXML private StackPane rootPane; @FXML @@ -87,7 +85,7 @@ public class MainController { private JFXButton homeButton; @FXML @ActionTrigger("showSkinPane") - private JFXToggleButton styleBut; + private JFXToggleNode styleNode; //刷新按钮 @FXML @EventTrigger("refresh") @@ -104,7 +102,7 @@ public class MainController { @ActionTrigger("userInfo") private JFXButton userButton; @FXML - private JFXButton rolesBut; + private JFXButton bellButton; @FXML @@ -131,6 +129,8 @@ public class MainController { @PostConstruct public void init() throws FlowException { + + ApplicationContext.getInstance().register(this, MainController.class); rootPane.getChildren().removeAll(navigationList); rootPane.getChildren().removeAll(leftDrawer); rootPane.getChildren().removeAll(tabPane); @@ -140,13 +140,15 @@ public class MainController { try { homeButton.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".home-outline")); refreshButton.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".shuaxin1")); - rolesBut.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".admin")); + bellButton.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".cc-bell-o")); userButton.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".ChevronDownCircle")); + styleNode.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".moon-fill")); + } catch (Exception e) { e.printStackTrace(); } datePicker.setEditable(false); - datePicker.valueProperty().addListener((observable, oldValue, newValue) ->{ + datePicker.valueProperty().addListener((observable, oldValue, newValue) -> { refreshButton.fire(); }); leftDrawer.setSidePane(navigationList); @@ -172,15 +174,35 @@ public class MainController { }); tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS); + tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { + Object value = newValue.getUserData(); + for (Object item : navigationList.getItems()) { + if (item instanceof MenuVO) { + if (item == value) { + navigationList.getSelectionModel().select(value); + break; + } + + } else if (item instanceof JFXListView) { + JFXListView jfxListView = (JFXListView) item; + for (MenuVO menuVO : jfxListView.getItems()) { + if (menuVO == value) { + navigationList.getSelectionModel().select(2); + jfxListView.getSelectionModel().select(menuVO); + + break; + } + } + } + + } + + }); drawersStack.setContent(tabPane); drawersStack.toggle(leftDrawer); drawersStack.setEffect(null); - try { - addTab("主页", SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".home-outline"), HomeController.class); - } catch (Exception e) { - e.printStackTrace(); - } - styleBut.selectedProperty().bindBidirectional(ApplicatonStore.styleProperty()); + + styleNode.selectedProperty().bindBidirectional(ApplicatonStore.styleProperty()); featureResourceConsumer.consumeResource(this); navigationList.setCellFactory(listView -> new JFXListCell() { @@ -206,13 +228,14 @@ public class MainController { navigationList.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { if (newValue instanceof MenuVO) { try { - addTab(((MenuVO) newValue).getTitle(), SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + "." + ((MenuVO) newValue).getIcon()), Class.forName(((MenuVO) newValue).getHref())); + addTab(((MenuVO) newValue).getTitle(), SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + "." + ((MenuVO) newValue).getIcon()), Class.forName(((MenuVO) newValue).getHref()), newValue); } catch (Exception e) { e.printStackTrace(); } } }); + navigationList.depthProperty().setValue(0); navigationList.expandedProperty().set(true); initData(); @@ -220,6 +243,7 @@ public class MainController { private JFXPopup getPopOver() { if (popOver == null) { + try { popOver = new JFXPopup(new Flow(UserInfoController.class).start()); } catch (FlowException e) { @@ -235,7 +259,6 @@ public class MainController { } - private void initData() { ListProperty listProperty = ApplicatonStore.getMenuVoCells(); @@ -260,7 +283,7 @@ public class MainController { listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { if (newValue instanceof MenuVO) { try { - addTab(newValue.getTitle(), SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + "." + newValue.getIcon()), Class.forName(newValue.getHref())); + addTab(newValue.getTitle(), SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + "." + newValue.getIcon()), Class.forName(newValue.getHref()), newValue); } catch (Exception e) { e.printStackTrace(); } @@ -298,7 +321,7 @@ public class MainController { } } - + navigationList.getSelectionModel().select(0); } @@ -309,8 +332,8 @@ public class MainController { * @auther: liwen * @date: 2020/6/28 9:57 上午 */ - private void addTab(String title, Node icon, Class controllerClass) { - addTab(title, icon, new Flow(controllerClass)); + public void addTab(String title, Node icon, Class controllerClass, Object userData) { + addTab(title, icon, new Flow(controllerClass), userData); } /** @@ -320,13 +343,14 @@ public class MainController { * @auther: liwen * @date: 2020/6/28 9:57 上午 */ - private void addTab(String title, Node icon, Flow flow) { + public void addTab(String title, Node icon, Flow flow, Object userData) { FlowHandler flowHandler = flow.createHandler(); Tab tab = tabsMap.get(title); if (tab == null) { tab = new Tab(title); + tab.setUserData(userData); tab.setGraphic(icon); try { @@ -363,7 +387,7 @@ public class MainController { @ActionMethod("goHome") private void goHome() { try { - addTab("主页", SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".home-outline"), HomeController.class); + addTab("主页", SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".home-outline"), HomeController.class, null); } catch (Exception e) { e.printStackTrace(); } @@ -372,6 +396,8 @@ public class MainController { @ActionMethod("userInfo") private void userInfo() throws VetoException, FlowException { + + getPopOver().show(userButton, JFXPopup.PopupVPosition.TOP, JFXPopup.PopupHPosition.RIGHT, 0, userButton.getHeight()); } @@ -380,14 +406,24 @@ public class MainController { ProcessChain.create().addRunnableInPlatformThread(() -> { String style1 = AppStartup.class.getResource("/css/app-light.css").toExternalForm(); String style2 = AppStartup.class.getResource("/css/app-dark.css").toExternalForm(); - if (styleBut.isSelected()) { - styleBut.setText("明亮"); - styleBut.getScene().getStylesheets().removeAll(style1); - styleBut.getScene().getStylesheets().addAll(style2); + if (styleNode.isSelected()) { + + try { + styleNode.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".taiyang")); + } catch (Exception e) { + e.printStackTrace(); + } + styleNode.getScene().getStylesheets().removeAll(style1); + styleNode.getScene().getStylesheets().addAll(style2); } else { - styleBut.setText("黑暗"); - styleBut.getScene().getStylesheets().removeAll(style2); - styleBut.getScene().getStylesheets().addAll(style1); + try { + styleNode.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".moon-fill")); + } catch (Exception e) { + e.printStackTrace(); + } + + styleNode.getScene().getStylesheets().removeAll(style2); + styleNode.getScene().getStylesheets().addAll(style1); } }).run(); @@ -396,7 +432,6 @@ public class MainController { @PreDestroy public void destroy() { - } /** @@ -417,6 +452,7 @@ public class MainController { } catch (FlowException e) { e.printStackTrace(); } + WSClient.getInstance().close(); } diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/main/components/SkinInfoController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/components/SkinInfoController.java similarity index 84% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/main/components/SkinInfoController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/components/SkinInfoController.java index 1a9b03d..d82516b 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/main/components/SkinInfoController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/components/SkinInfoController.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.gui.uicomponents.main.components; +package com.fx.client.gui.uicomponents.main.components; import io.datafx.controller.ViewController; diff --git a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/main/components/UserInfoController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/components/UserInfoController.java similarity index 90% rename from falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/main/components/UserInfoController.java rename to falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/components/UserInfoController.java index 48a9406..c4f8bc0 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/gui/uicomponents/main/components/UserInfoController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/components/UserInfoController.java @@ -1,6 +1,6 @@ -package com.epri.fx.client.gui.uicomponents.main.components; +package com.fx.client.gui.uicomponents.main.components; -import com.epri.fx.client.store.ApplicatonStore; +import com.fx.client.store.ApplicatonStore; import com.jfoenix.controls.JFXListView; import io.datafx.controller.ViewController; import io.datafx.eventsystem.EventProducer; diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/onlineuser/OnlineUserController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/onlineuser/OnlineUserController.java new file mode 100644 index 0000000..a718ae4 --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/onlineuser/OnlineUserController.java @@ -0,0 +1,284 @@ +package com.fx.client.gui.uicomponents.monitor.onlineuser; + +import com.fx.client.model.OnlineUserDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.UserFeign; +import com.fx.client.store.ApplicatonStore; +import com.fx.client.utils.Pinyin4jUtil; +import com.fx.server.entity.log.SysLoginInfor; +import com.fx.server.util.DateUtils; +import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXSnackbar; +import com.jfoenix.controls.JFXSnackbarLayout; +import com.jfoenix.controls.JFXSpinner; +import com.jfoenix.svg.SVGGlyphLoader; +import io.datafx.controller.ViewController; +import io.datafx.controller.flow.action.ActionMethod; +import io.datafx.controller.flow.action.ActionTrigger; +import io.datafx.core.concurrent.ProcessChain; +import javafx.collections.transformation.FilteredList; +import javafx.fxml.FXML; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.util.Callback; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.util.Date; + +/** + * @description: + * @className: OnlineUserController + * @author: liwen + * @date: 2021/1/1 13:24 + */ +@ViewController(value = "/fxml/monitor/onlineuser/online_user.fxml", title = "在线用户") +public class OnlineUserController { + @FXML + private StackPane rootPane; + @FXML + private VBox contentPane; + + @FXML + private TextField userNameTextField; + @FXML + private TextField ipTextfiled; + @FXML + private TableView tableView; + + @FXML + private JFXSpinner spinner; + @FXML + @ActionTrigger("rest") + private Button restButton; + @FXML + @ActionTrigger("search") + private Button searchButton; + + @FXML + private TableColumn numberColumn; + @FXML + private TableColumn sessionNumberColumn; + @FXML + private TableColumn loginNameColumn; + @FXML + private TableColumn ipaddrColumn; + @FXML + private TableColumn sessionStatusColumn; + @FXML + private TableColumn loginTimeColumn; + @FXML + private TableColumn optColumn; + + @Inject + private OnlineUserDataModel onlineUserDataModel; + + private JFXSnackbar snackbar; + + @PostConstruct + private void init() { + spinner.setVisible(false); + snackbar = new JFXSnackbar(rootPane); + snackbar.setPrefWidth(500); + numberColumn.setCellFactory((col) -> { + TableCell cell = new TableCell() { + @Override + public void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + this.setText(null); + this.setGraphic(null); + + if (!empty) { + int rowIndex = this.getIndex() + 1; + this.setText(String.valueOf(rowIndex)); + } + } + }; + return cell; + }); + sessionNumberColumn.setCellValueFactory(new PropertyValueFactory<>("infoId")); + loginNameColumn.setCellValueFactory(new PropertyValueFactory<>("loginName")); + ipaddrColumn.setCellValueFactory(new PropertyValueFactory<>("ipaddr")); + sessionStatusColumn.setCellValueFactory(new PropertyValueFactory<>("status")); + sessionStatusColumn.setCellFactory(col -> { + TableCell cell = new TableCell() { + private Label label = new Label(""); + + @Override + protected void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + this.setText(null); + this.setGraphic(null); + if (!empty) { + + if (item.equals("0")) { + label.setId("status-success-label"); + label.setText("在线"); + } else { + label.setId("status-error-label"); + label.setText("离线"); + } + setGraphic(label); + } + } + }; + return cell; + }); + loginTimeColumn.setCellValueFactory(new PropertyValueFactory<>("loginTime")); + loginTimeColumn.setCellFactory(col -> { + + TableCell cell = new TableCell() { + @Override + protected void updateItem(Date item, boolean empty) { + super.updateItem(item, empty); + this.setText(null); + this.setGraphic(null); + if (!empty && item != null) { + setText(DateUtils.formatDate(item, DateUtils.DATETIME_FORMAT)); + } + } + }; + return cell; + }); + + Callback, TableCell> cellFactory = new Callback, TableCell>() { + @Override + public TableCell call(TableColumn param) { + + final TableCell cell = new TableCell() { + + private final JFXButton retreatBut = new JFXButton("强退"); + + { + retreatBut.setStyle("-fx-background-color: #e63c53"); + try { + retreatBut.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".tuichu")); + } catch (Exception e) { + e.printStackTrace(); + } + + retreatBut.setOnAction(event -> { + + tableView.getSelectionModel().select(getIndex()); + retreat(); + + }); + + } + + @Override + protected void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + if (empty) { + setGraphic(null); + } else { + setGraphic(retreatBut); + } + } + }; + return cell; + } + }; + + optColumn.setCellFactory(cellFactory); + + FilteredList filteredData = new FilteredList<>(onlineUserDataModel.getOnlineUsers(), p -> true); + tableView.setItems(filteredData); + userNameTextField.textProperty().addListener((o, oldVal, newVal) -> { + filteredData.setPredicate(elementProp -> { + if (newVal == null || newVal.isEmpty()) { + return true; + } + String val = Pinyin4jUtil.toPinYinLowercase(newVal); + return Pinyin4jUtil.toPinYinLowercase(elementProp.getLoginName()).contains(val); + }); + }); + ipTextfiled.textProperty().addListener((o, oldVal, newVal) -> { + filteredData.setPredicate(elementProp -> { + if (newVal == null || newVal.isEmpty()) { + return true; + } + String val = Pinyin4jUtil.toPinYinLowercase(newVal); + return Pinyin4jUtil.toPinYinLowercase(elementProp.getIpaddr()).contains(val); + }); + }); + + onlineUserDataModel.selectedIndexProperty().bind(tableView.getSelectionModel().selectedIndexProperty()); + + + query(); + + } + + + private void query() { + + ProcessChain.create() + .addRunnableInPlatformThread(() -> { + onlineUserDataModel.getOnlineUsers().clear(); + spinner.setVisible(true); + contentPane.setDisable(true); + }) + .addSupplierInExecutor( + () -> Request.connector(UserFeign.class).getOnlineUsers() + ) + .addConsumerInPlatformThread(result -> { + + onlineUserDataModel.getOnlineUsers().addAll(result); + + }) + .withFinal(() -> { + spinner.setVisible(false); + contentPane.setDisable(false); + }) + .onException(e -> e.printStackTrace()) + .run(); + } + + @ActionMethod("search") + private void search() { + query(); + } + + @ActionMethod("rest") + private void rest() { + userNameTextField.setText(""); + ipTextfiled.setText(""); + searchButton.fire(); + } + + /** + * @Description:强退 + * @param: [] + * @return: void + * @auther: liwen + * @date: 2021/1/4 4:38 下午 + */ + private void retreat() { + ProcessChain.create() + .addSupplierInExecutor( + () -> Request.connector(UserFeign.class).retreat(onlineUserDataModel.getOnlineUsers().get(onlineUserDataModel.getSelectedIndex()).getLoginName()) + ) + .addConsumerInPlatformThread(result -> { + + if (result.isRel() == true) { + snackbar.fireEvent(new JFXSnackbar.SnackbarEvent(new JFXSnackbarLayout("强退成功! "))); + query(); + } + + }) + .withFinal(() -> { + spinner.setVisible(false); + contentPane.setDisable(false); + }) + .onException(e -> { + e.printStackTrace(); + snackbar.fireEvent(new JFXSnackbar.SnackbarEvent(new JFXSnackbarLayout("强退失败! "))); + + }) + .run(); + } +} + diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/quartz/SysJobController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/quartz/SysJobController.java new file mode 100644 index 0000000..f658834 --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/quartz/SysJobController.java @@ -0,0 +1,494 @@ +package com.fx.client.gui.uicomponents.monitor.quartz; + +import com.fx.client.gui.uicomponents.main.MainController; +import com.fx.client.model.SysJobDataModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.SysJobFeign; +import com.fx.client.store.ApplicatonStore; +import com.fx.client.utils.Pinyin4jUtil; +import com.fx.server.entity.SysJob; +import com.jfoenix.controls.*; +import com.jfoenix.svg.SVGGlyphLoader; +import io.datafx.controller.ViewController; +import io.datafx.controller.context.ApplicationContext; +import io.datafx.controller.flow.action.ActionMethod; +import io.datafx.controller.flow.action.ActionTrigger; +import io.datafx.core.concurrent.ProcessChain; +import javafx.collections.transformation.FilteredList; +import javafx.fxml.FXML; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; +import javafx.stage.Modality; +import javafx.stage.Stage; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.util.*; + +/** + * @description: + * @className: JobController + * @author: liwen + * @date: 2020/12/25 09:28 + */ +@ViewController(value = "/fxml/monitor/quartz/job.fxml", title = "定时任务") +public class SysJobController { + + @FXML + private JFXDialog dialog; + @FXML + private Label dialogTitle; + @FXML + private JFXTextField jobNameTextField; + @FXML + private JFXComboBox jobGroupNameComboBox; + @FXML + private JFXTextField jobClassTextField; + @FXML + private JFXTextField jobTimeTextField; + @FXML + private JFXTextField searchField; + @FXML + private JFXTextField parameterTextField; + @FXML + private JFXTextArea detailedTextArea; + @FXML + private JFXComboBox jobGroupComboBox; + @FXML + private JFXComboBox jobStatusCommboBox; + @FXML + @ActionTrigger("updateJob") + private JFXButton updateButton; + @FXML + @ActionTrigger("showJobLog") + private JFXButton jobLogButton; + @FXML + @ActionTrigger("saveJob") + private JFXButton saveButton; + @FXML + @ActionTrigger("closeDialog") + private JFXButton cancelButton; + + @FXML + private StackPane rootPane; + @FXML + private GridPane jobDetailPane; + @FXML + private HBox operatButPane; + + @FXML + @ActionTrigger("showAddJobDialog") + private JFXButton addJobButton; + + @FXML + @ActionTrigger("restSearch") + private JFXButton resetButton; + @FXML + @ActionTrigger("search") + private JFXButton searchButton; + + @FXML + private TableView tableView; + @FXML + private TableColumn jobIdColumn; + @FXML + private TableColumn jobNameColumn; + @FXML + private TableColumn jobGroupNameColumn; + @FXML + private TableColumn jobClassColumn; + @FXML + private TableColumn jobTimeColumn; + @FXML + private TableColumn jobDataColumn; + @FXML + private TableColumn jobStatusColumn; + @FXML + private TableColumn operatingColumn; + private JFXSnackbar snackbar; + + @Inject + private SysJobDataModel sysJobDataModel; + + private FilteredList filteredData; + + @PostConstruct + private void init() { + + updateButton.visibleProperty().bind(saveButton.visibleProperty().not()); + updateButton.managedProperty().bind(updateButton.visibleProperty()); + saveButton.managedProperty().bind(saveButton.visibleProperty()); + snackbar = new JFXSnackbar(rootPane); + snackbar.setPrefWidth(500); + operatingColumn.setCellFactory(col -> { + TableCell cell = new TableCell() { + + private final ToggleButton editBut = new ToggleButton(); + private final ToggleButton detailsBut = new ToggleButton(); + private final ToggleButton playBut = new ToggleButton(); + private final ToggleButton logBut = new ToggleButton(); + private final ToggleButton delBut = new ToggleButton(); + private HBox hBox = new HBox(editBut, detailsBut, playBut, logBut, delBut); + + { + editBut.setTooltip(new Tooltip("编辑")); + detailsBut.setTooltip(new Tooltip("查看详细")); + playBut.setTooltip(new Tooltip("立即执行一次")); + logBut.setTooltip(new Tooltip("调度日志")); + delBut.setTooltip(new Tooltip("删除")); + + editBut.getStyleClass().add("left-pill"); + detailsBut.getStyleClass().add("center-pill"); + playBut.getStyleClass().add("center-pill"); + logBut.getStyleClass().add("center-pill"); + delBut.getStyleClass().add("right-pill"); + + try { + editBut.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".create-outline")); + detailsBut.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".chakan-copy")); + playBut.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".zhihing")); + logBut.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".diaodurizhi-copy")); + delBut.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".trash-outline")); + } catch (Exception e) { + e.printStackTrace(); + } + editBut.setOnAction(event -> { + tableView.getSelectionModel().select(getIndex()); + showEditJobDialog(); + }); + delBut.setOnAction(event -> { + tableView.getSelectionModel().select(getIndex()); + deleteJob(); + }); + detailsBut.setOnAction(event -> { + tableView.getSelectionModel().select(getIndex()); + showJobDialog(); + }); + playBut.setOnAction(event -> { + tableView.getSelectionModel().select(getIndex()); + runJob(); + }); + + } + + @Override + protected void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + if (empty) { + setGraphic(null); + } else { + + hBox.setSpacing(0); + hBox.setAlignment(Pos.CENTER); + setGraphic(hBox); + } + } + }; + return cell; + }); + jobIdColumn.setCellFactory(col -> { + TableCell cell = new TableCell() { + @Override + protected void updateItem(Integer item, boolean empty) { + super.updateItem(item, empty); + this.setText(null); + this.setGraphic(null); + if (!empty) { + setText((getIndex() + 1) + ""); + } + } + }; + return cell; + }); + jobNameColumn.setCellValueFactory(new PropertyValueFactory<>("jobName")); + jobGroupNameColumn.setCellValueFactory(new PropertyValueFactory<>("jobGroupName")); + jobClassColumn.setCellValueFactory(new PropertyValueFactory<>("jobClass")); + jobTimeColumn.setCellValueFactory(new PropertyValueFactory<>("jobTime")); + jobDataColumn.setCellValueFactory(new PropertyValueFactory<>("parames")); + jobStatusColumn.setCellValueFactory(new PropertyValueFactory<>("jobStatus")); + jobStatusColumn.setCellFactory(col -> { + TableCell cell = new TableCell() { + private final JFXToggleButton statusButton = new JFXToggleButton(); + + { + statusButton.setOnAction(event -> { + tableView.getSelectionModel().select(getIndex()); + + if (statusButton.isSelected()) { + resumeJob(); + } else { + pauseJob(); + } + }); + + } + + @Override + protected void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + if (empty) { + setGraphic(null); + } else { + statusButton.setSelected(item.equals("NORMAL") ? true : false); + setGraphic(statusButton); + } + } + }; + return cell; + }); + + sysJobDataModel.selectedPersonIndexProperty().bind(tableView.getSelectionModel().selectedIndexProperty()); + filteredData = new FilteredList<>(sysJobDataModel.getSysJobs(), p -> true); + tableView.setItems(filteredData); + searchField.textProperty().addListener((o, oldVal, newVal) -> { + filteredData(); + }); + jobGroupComboBox.getSelectionModel().select(0); + jobGroupComboBox.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> { + + filteredData(); + }); + jobStatusCommboBox.getSelectionModel().select(0); + jobStatusCommboBox.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> { + + filteredData(); + }); + + query(); + } + + private void filteredData() { + String jobName = searchField.getText(); + String jobGroup = jobGroupComboBox.getSelectionModel().selectedIndexProperty().getValue() == 0 ? null : (jobGroupComboBox.getSelectionModel().selectedIndexProperty().getValue() == 1 ? "默认" : "系统"); + String jobStatus = jobStatusCommboBox.getSelectionModel().selectedIndexProperty().getValue() == 0 ? null : (jobStatusCommboBox.getSelectionModel().selectedIndexProperty().getValue() == 1 ? "NORMAL" : "PAUSED"); + filteredData.setPredicate(elementProp -> { + + boolean a = false; + boolean b = false; + boolean c = false; + if (StringUtils.isBlank(jobName)) { + a = true; + } else { + a = Pinyin4jUtil.toPinYinLowercase(elementProp.getJobName()).contains(Pinyin4jUtil.toPinYinLowercase(jobName)); + } + if (StringUtils.isBlank(jobGroup)) { + b = true; + } else { + b = elementProp.getJobGroupName().toLowerCase().equalsIgnoreCase(jobGroup); + } + if (StringUtils.isBlank(jobStatus)) { + c = true; + } else { + c = elementProp.getJobStatus().toLowerCase().equalsIgnoreCase(jobStatus); + } + + + return a && b && c; + }); + } + + @ActionMethod("search") + private void query() { + String jobName = searchField.getText(); + String jobGroup = jobGroupComboBox.getSelectionModel().selectedIndexProperty().getValue() == 0 ? null : (jobGroupComboBox.getSelectionModel().selectedIndexProperty().getValue() == 1 ? "默认" : "系统"); + String jobStatus = jobStatusCommboBox.getSelectionModel().selectedIndexProperty().getValue() == 0 ? null : (jobStatusCommboBox.getSelectionModel().selectedIndexProperty().getValue() == 1 ? "NORMAL" : "PAUSED"); + + + Map map = new HashMap(); + map.put("jobName", jobName); + map.put("jobGroup", jobGroup); + map.put("jobStatus", jobStatus); + ProcessChain.create().addRunnableInPlatformThread(() -> { + sysJobDataModel.getSysJobs().clear(); + }).addSupplierInExecutor( + () -> Request.connector(SysJobFeign.class).getSysJobAll(map) + ).addConsumerInPlatformThread( + rel -> sysJobDataModel.getSysJobs().addAll(rel) + ).run(); + } + + @ActionMethod("showAddJobDialog") + private void showAddJobDialog() { + saveButton.setVisible(true); + dialogTitle.setText("新增定时任务"); + dialog.setTransitionType(JFXDialog.DialogTransition.TOP); + operatButPane.setVisible(true); + + dialog.show(rootPane); + + } + + private void showEditJobDialog() { + SysJob sysJob = sysJobDataModel.selectSysJob(); + jobNameTextField.setText(sysJob.getJobName()); + jobGroupNameComboBox.getSelectionModel().select(sysJob.getJobGroupName()); + jobTimeTextField.setText(sysJob.getJobTime()); + jobClassTextField.setText(sysJob.getJobClass()); + detailedTextArea.setText(sysJob.getDescription()); + parameterTextField.setText(sysJob.getParames()); + operatButPane.setVisible(true); + saveButton.setVisible(false); + dialogTitle.setText("编辑定时任务"); + dialog.setTransitionType(JFXDialog.DialogTransition.TOP); + dialog.show(rootPane); + + } + + private void showJobDialog() { + SysJob sysJob = sysJobDataModel.selectSysJob(); + jobNameTextField.setText(sysJob.getJobName()); + jobGroupNameComboBox.getSelectionModel().select(sysJob.getJobGroupName()); + jobTimeTextField.setText(sysJob.getJobTime()); + jobClassTextField.setText(sysJob.getJobClass()); + detailedTextArea.setText(sysJob.getDescription()); + parameterTextField.setText(sysJob.getParames()); + operatButPane.setVisible(false); + dialogTitle.setText("任务详情"); + dialog.setTransitionType(JFXDialog.DialogTransition.TOP); + dialog.show(rootPane); + + } + + + @ActionMethod("closeDialog") + private void closeDialog() { + dialog.close(); + } + + @ActionMethod("saveJob") + private void saveJob() { + SysJob sysJob = new SysJob(); + sysJob.setJobName(jobNameTextField.getText()); + sysJob.setJobGroupName(jobGroupNameComboBox.getSelectionModel().getSelectedIndex() == 0 ? "默认" : "系统"); + sysJob.setJobTime(jobTimeTextField.getText()); + sysJob.setJobClass(jobClassTextField.getText()); + String parames = parameterTextField.getText(); + sysJob.setParames(parames); + + ProcessChain.create().addSupplierInExecutor( + () -> Request.connector(SysJobFeign.class).addJob(sysJob) + ).addConsumerInPlatformThread(rel -> { + if (rel == 0) { + snackbar.fireEvent(new JFXSnackbar.SnackbarEvent(new JFXSnackbarLayout("添加成功! "))); + } + query(); + }).withFinal(() -> dialog.close()).run(); + + } + + @ActionMethod("updateJob") + private void updateJob() { + SysJob sysJob = new SysJob(); + sysJob.setJobName(jobNameTextField.getText()); + sysJob.setJobGroupName(jobGroupNameComboBox.getSelectionModel().getSelectedIndex() == 0 ? "默认" : "系统"); + sysJob.setJobTime(jobTimeTextField.getText()); + sysJob.setJobClass(jobClassTextField.getText()); + sysJob.setDescription(detailedTextArea.getText()); + sysJob.setParames(parameterTextField.getText()); + + ProcessChain.create().addSupplierInExecutor( + () -> Request.connector(SysJobFeign.class).updateJob(sysJob) + ).addConsumerInPlatformThread(rel -> { + if (rel == 0) { + snackbar.fireEvent(new JFXSnackbar.SnackbarEvent(new JFXSnackbarLayout("更新成功! "))); + } + }).withFinal(() -> dialog.close()).run(); + + } + + @ActionMethod("showJobLog") + private void showJobLog() { + MainController mainController = ApplicationContext.getInstance().getRegisteredObject(MainController.class); + try { + mainController.addTab("调度日志", SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".diaodurizhi-copy"), SysJobLogController.class,null); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @ActionMethod("restSearch") + private void restSearch() { + searchField.setText(""); + jobStatusCommboBox.getSelectionModel().select(0); + jobGroupComboBox.getSelectionModel().select(0); + query(); + } + + + private void runJob() { + ProcessChain.create() + .addSupplierInExecutor(() -> Request.connector(SysJobFeign.class).runJob(sysJobDataModel.selectSysJob().getJobName(), sysJobDataModel.selectSysJob().getJobGroupName())) + .addConsumerInPlatformThread(rel -> { + if (rel == 0) { + snackbar.fireEvent(new JFXSnackbar.SnackbarEvent(new JFXSnackbarLayout("执行成功! "))); + } + }).withFinal(() -> { + + }).onException(e -> e.printStackTrace()) + .run(); + + } + + private void pauseJob() { + ProcessChain.create() + .addSupplierInExecutor(() -> Request.connector(SysJobFeign.class).pauseJob(sysJobDataModel.selectSysJob().getJobName(), sysJobDataModel.selectSysJob().getJobGroupName())) + .addConsumerInPlatformThread(rel -> { + if (rel == 0) { + snackbar.fireEvent(new JFXSnackbar.SnackbarEvent(new JFXSnackbarLayout("执行成功! "))); + } + }).withFinal(() -> { + + }).onException(e -> e.printStackTrace()) + .run(); + + } + + private void resumeJob() { + ProcessChain.create() + .addSupplierInExecutor(() -> Request.connector(SysJobFeign.class).resumeJob(sysJobDataModel.selectSysJob().getJobName(), sysJobDataModel.selectSysJob().getJobGroupName())) + .addConsumerInPlatformThread(rel -> { + if (rel == 0) { + snackbar.fireEvent(new JFXSnackbar.SnackbarEvent(new JFXSnackbarLayout("执行成功! "))); + } + }).withFinal(() -> { + + }).onException(e -> e.printStackTrace()) + .run(); + + } + + private void deleteJob() { + + JFXAlert alert = new JFXAlert((Stage) rootPane.getScene().getWindow()); + alert.initModality(Modality.APPLICATION_MODAL); + alert.setOverlayClose(false); + JFXDialogLayout layout = new JFXDialogLayout(); + layout.setHeading(new Label("消息提示")); + layout.setBody(new Label("确实删除【" + sysJobDataModel.selectSysJob().getJobName() + "】吗?")); + JFXButton closeButton = new JFXButton("取消"); + closeButton.setOnAction(event -> alert.hideWithAnimation()); + JFXButton determineButton = new JFXButton("确定"); + determineButton.setOnAction(event -> { + alert.hideWithAnimation(); + ProcessChain.create() + .addSupplierInExecutor(() -> Request.connector(SysJobFeign.class).deleteJob(sysJobDataModel.selectSysJob().getJobName(), sysJobDataModel.selectSysJob().getJobGroupName())) + .addConsumerInPlatformThread(rel -> { + if (rel == 0) { + query(); + } + }).withFinal(() -> { + + }).onException(e -> e.printStackTrace()) + .run(); + }); + layout.setActions(closeButton, determineButton); + alert.setContent(layout); + alert.show(); + + } +} diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/quartz/SysJobLogController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/quartz/SysJobLogController.java new file mode 100644 index 0000000..bc6bee1 --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/monitor/quartz/SysJobLogController.java @@ -0,0 +1,289 @@ +package com.fx.client.gui.uicomponents.monitor.quartz; + +import com.fx.client.model.SysJobLogModel; +import com.fx.client.request.Request; +import com.fx.client.request.feign.admin.SysJobFeign; +import com.fx.client.utils.Pinyin4jUtil; +import com.fx.server.entity.log.SysJobLog; +import com.fx.server.util.DateUtils; +import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXComboBox; +import com.jfoenix.controls.JFXDatePicker; +import com.jfoenix.controls.JFXSpinner; +import io.datafx.controller.ViewController; +import io.datafx.controller.flow.action.ActionMethod; +import io.datafx.controller.flow.action.ActionTrigger; +import io.datafx.core.concurrent.ProcessChain; +import io.datafx.eventsystem.Event; +import io.datafx.eventsystem.OnEvent; +import javafx.collections.transformation.FilteredList; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.util.Callback; +import javafx.util.StringConverter; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.inject.Inject; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @description: + * @className: JobController + * @author: liwen + * @date: 2020/12/25 09:28 + */ +@ViewController(value = "/fxml/monitor/quartz/job_log.fxml", title = "调度日志") +public class SysJobLogController { + + @FXML + private StackPane root; + @FXML + private VBox centPane; + @FXML + private JFXSpinner spinner; + @FXML + private TextField jobNameField; + @FXML + private JFXComboBox jobGroupComboBox; + @FXML + private JFXComboBox jobStatusComboBox; + @FXML + private JFXDatePicker beginDatePicker; + @FXML + private JFXDatePicker endDatePicker; + + @FXML + @ActionTrigger("search") + private Button searchButton; + @FXML + @ActionTrigger("reset") + private Button resetButton; + + @FXML + private Pagination pagination; + + @FXML + private TableView tableView; + @FXML + private TableColumn sysJobNumberColumn; + @FXML + private TableColumn jobNameColumn; + @FXML + private TableColumn jobGroupColumn; + @FXML + private TableColumn jobClassColumn; + @FXML + private TableColumn jobInfoColumn; + @FXML + private TableColumn jobStatusColumn; + @FXML + private TableColumn createTimeColumn; + @FXML + private TableColumn optIpColumn; + + @Inject + private SysJobLogModel logModel; + + private StringConverter dateConverter = new StringConverter() { + @Override + public String toString(Date date) { + if (date == null) { + return ""; + } + return DateUtils.formatDate(date, DateUtils.DATETIME_FORMAT); + } + + @Override + public Date fromString(String string) { + return DateUtils.parseDate(string); + } + }; + + @PostConstruct + public void init() { + spinner.setVisible(false); + jobGroupComboBox.getSelectionModel().select(0); + jobStatusComboBox.getSelectionModel().select(0); + + sysJobNumberColumn.setCellValueFactory(new PropertyValueFactory<>("jobLogId")); + jobNameColumn.setCellValueFactory(new PropertyValueFactory<>("jobName")); + jobGroupColumn.setCellValueFactory(new PropertyValueFactory<>("jobGroup")); + jobClassColumn.setCellValueFactory(new PropertyValueFactory<>("invokeTarget")); + jobInfoColumn.setCellValueFactory(new PropertyValueFactory<>("jobMessage")); + jobStatusColumn.setCellValueFactory(new PropertyValueFactory<>("status")); + jobStatusColumn.setCellFactory(col -> { + TableCell cell = new TableCell() { + private Label label = new Label(""); + + @Override + protected void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + this.setText(null); + this.setGraphic(null); + if (!empty) { + + if (item.equals("0")) { + label.setId("status-success-label"); + label.setText("成功"); + } else { + label.setId("status-error-label"); + label.setText("失败"); + } + setGraphic(label); + } + } + }; + return cell; + }); + createTimeColumn.setCellValueFactory(new PropertyValueFactory<>("createTime")); + createTimeColumn.setCellFactory(col -> { + + TableCell cell = new TableCell() { + @Override + protected void updateItem(Date item, boolean empty) { + super.updateItem(item, empty); + this.setText(null); + this.setGraphic(null); + if (!empty && item != null) { + setText(dateConverter.toString(item)); + } + } + }; + return cell; + }); + optIpColumn.setCellFactory(col -> { + TableCell cell = new TableCell() { + private JFXButton button = new JFXButton("详细"); + + @Override + protected void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + this.setText(null); + this.setGraphic(null); + if (!empty) { + setGraphic(button); + } + } + }; + return cell; + }); + + FilteredList filteredData = new FilteredList<>(logModel.getSysJobLogs(), p -> true); + tableView.setItems(filteredData); + jobNameField.textProperty().addListener((o, oldVal, newVal) -> { + filteredData.setPredicate(elementProp -> { + if (newVal == null || newVal.isEmpty()) { + return true; + } + String val = Pinyin4jUtil.toPinYinLowercase(newVal); + return Pinyin4jUtil.toPinYinLowercase(elementProp.getJobName()).contains(val); + + }); + }); + + logModel.selectedPersonIndexProperty().bind(tableView.getSelectionModel().selectedIndexProperty()); + pagination.pageCountProperty().bindBidirectional(logModel.pageCountProperty()); + pagination.setPageFactory(new Callback() { + @Override + public Node call(Integer param) { + showPage(param + 1); + return tableView; + } + }); + + } + + private void showPage(Integer page) { + + + Map queryMap = getQueryMap(); + queryMap.put("page", page); + queryMap.put("limit", 20); + query(queryMap); + + } + + private Map getQueryMap() { + String jobName = jobNameField.getText(); + String jobGroup = jobGroupComboBox.getSelectionModel().selectedIndexProperty().getValue() == 0 ? null : (jobGroupComboBox.getSelectionModel().selectedIndexProperty().getValue() == 1 ? "默认" : "系统"); + String jobStatus = jobStatusComboBox.getSelectionModel().selectedIndexProperty().getValue() == 0 ? null : (jobStatusComboBox.getSelectionModel().selectedIndexProperty().getValue() == 1 ? "0" : "1"); + LocalDate beginDate = beginDatePicker.getValue(); + LocalDate endDate = endDatePicker.getValue(); + + Map queryMap = new HashMap<>(); + queryMap.put("page", 0); + queryMap.put("limit", 20); + queryMap.put("jobName", jobName); + queryMap.put("jobName", jobName); + queryMap.put("jobGroup", jobGroup); + queryMap.put("status", jobStatus); + queryMap.put("startTime", beginDate != null ? beginDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")) : null); + queryMap.put("endTime", endDate != null ? endDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")) : null); + return queryMap; + } + + @ActionMethod("search") + private void search() { + query(getQueryMap()); + } + + @ActionMethod("reset") + private void reset() { + jobNameField.setText(""); + jobGroupComboBox.getSelectionModel().select(0); + jobStatusComboBox.getSelectionModel().select(0); + beginDatePicker.setValue(null); + endDatePicker.setValue(null); + searchButton.fire(); + } + + private void query(Map queryMap) { + + ProcessChain.create() + .addRunnableInPlatformThread(() -> { + spinner.setVisible(true); + centPane.setDisable(true); + }) + .addSupplierInExecutor(() -> Request.connector(SysJobFeign.class).getSysJobLogList(queryMap) + ) + .addConsumerInPlatformThread(result -> { + logModel.getSysJobLogs().clear(); + List gateLogs = result.getDatas(); + logModel.setPageCount((int) result.getTotal()); + logModel.getSysJobLogs().addAll(gateLogs); + + }) + .withFinal(() -> { + spinner.setVisible(false); + centPane.setDisable(false); + }) + .onException(e -> e.printStackTrace()) + .run(); + } + + + @PreDestroy + private void destroy() { + System.err.println("destroy " + this); + } + + + @OnEvent("refresh") + private void onRefresh(Event e) { + System.err.println(this.getClass() + "\t" + e.getContent()); + + search(); + + } + +} diff --git a/falsework-client/src/main/java/com/epri/fx/client/model/GroupDataModel.java b/falsework-client/src/main/java/com/fx/client/model/GroupDataModel.java similarity index 92% rename from falsework-client/src/main/java/com/epri/fx/client/model/GroupDataModel.java rename to falsework-client/src/main/java/com/fx/client/model/GroupDataModel.java index 4b039ea..6eea620 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/model/GroupDataModel.java +++ b/falsework-client/src/main/java/com/fx/client/model/GroupDataModel.java @@ -1,8 +1,8 @@ -package com.epri.fx.client.model; +package com.fx.client.model; -import com.epri.fx.server.vo.ElementVO; -import com.epri.fx.server.vo.GroupVO; -import com.epri.fx.server.vo.MenuVO; +import com.fx.server.vo.ElementVO; +import com.fx.server.vo.GroupVO; +import com.fx.server.vo.MenuVO; import io.datafx.controller.FxmlLoadException; import io.datafx.controller.injection.scopes.ViewScoped; import javafx.beans.property.ListProperty; diff --git a/falsework-client/src/main/java/com/epri/fx/client/model/GroupTypeDataModel.java b/falsework-client/src/main/java/com/fx/client/model/GroupTypeDataModel.java similarity index 89% rename from falsework-client/src/main/java/com/epri/fx/client/model/GroupTypeDataModel.java rename to falsework-client/src/main/java/com/fx/client/model/GroupTypeDataModel.java index a1418ca..e1e1cfc 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/model/GroupTypeDataModel.java +++ b/falsework-client/src/main/java/com/fx/client/model/GroupTypeDataModel.java @@ -1,7 +1,8 @@ -package com.epri.fx.client.model; +package com.fx.client.model; -import com.epri.fx.server.vo.GroupTypeVO; +import com.fx.server.vo.GroupTypeVO; import io.datafx.controller.injection.scopes.FlowScoped; +import io.datafx.controller.injection.scopes.ViewScoped; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ListProperty; import javafx.beans.property.SimpleIntegerProperty; @@ -9,7 +10,7 @@ import javafx.beans.property.SimpleListProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; -@FlowScoped +@ViewScoped public class GroupTypeDataModel { private int counter = 0; private ListProperty groupTypes; diff --git a/falsework-client/src/main/java/com/epri/fx/client/model/LogDataModel.java b/falsework-client/src/main/java/com/fx/client/model/LogDataModel.java similarity index 91% rename from falsework-client/src/main/java/com/epri/fx/client/model/LogDataModel.java rename to falsework-client/src/main/java/com/fx/client/model/LogDataModel.java index 885b19b..0f97794 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/model/LogDataModel.java +++ b/falsework-client/src/main/java/com/fx/client/model/LogDataModel.java @@ -1,7 +1,8 @@ -package com.epri.fx.client.model; +package com.fx.client.model; -import com.epri.fx.server.entity.log.GateLog; +import com.fx.server.entity.log.GateLog; import io.datafx.controller.injection.scopes.FlowScoped; +import io.datafx.controller.injection.scopes.ViewScoped; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ListProperty; import javafx.beans.property.SimpleIntegerProperty; @@ -9,7 +10,7 @@ import javafx.beans.property.SimpleListProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; -@FlowScoped +@ViewScoped public class LogDataModel { private int counter = 0; private ListProperty gateLogs; diff --git a/falsework-client/src/main/java/com/fx/client/model/LoginLogDataModel.java b/falsework-client/src/main/java/com/fx/client/model/LoginLogDataModel.java new file mode 100644 index 0000000..25e03f1 --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/model/LoginLogDataModel.java @@ -0,0 +1,58 @@ +package com.fx.client.model; + +import com.fx.server.entity.log.SysLoginInfor; +import io.datafx.controller.injection.scopes.ViewScoped; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.ListProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +@ViewScoped +public class LoginLogDataModel { + private int counter = 0; + private ListProperty sysLoginInfors; + + private IntegerProperty pageCount; + private IntegerProperty selectedPersonIndex; + + + public ListProperty getSysLoginInfors() { + if (sysLoginInfors == null) { + ObservableList innerList = FXCollections.observableArrayList(); + sysLoginInfors = new SimpleListProperty<>(innerList); + } + return sysLoginInfors; + } + + public int getSelectedPersonIndex() { + return selectedPersonIndexProperty().get(); + } + + public void setSelectedPersonIndex(int selectedPersonIndex) { + this.selectedPersonIndex.set(selectedPersonIndex); + } + + public IntegerProperty selectedPersonIndexProperty() { + if (selectedPersonIndex == null) { + selectedPersonIndex = new SimpleIntegerProperty(); + } + return selectedPersonIndex; + } + + public int getPageCount() { + return pageCount.get(); + } + + public IntegerProperty pageCountProperty() { + if (pageCount == null) { + pageCount = new SimpleIntegerProperty(); + } + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount.set(pageCount); + } +} \ No newline at end of file diff --git a/falsework-client/src/main/java/com/epri/fx/client/model/MenuDataModel.java b/falsework-client/src/main/java/com/fx/client/model/MenuDataModel.java similarity index 92% rename from falsework-client/src/main/java/com/epri/fx/client/model/MenuDataModel.java rename to falsework-client/src/main/java/com/fx/client/model/MenuDataModel.java index b37b120..437656c 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/model/MenuDataModel.java +++ b/falsework-client/src/main/java/com/fx/client/model/MenuDataModel.java @@ -1,7 +1,7 @@ -package com.epri.fx.client.model; +package com.fx.client.model; -import com.epri.fx.server.vo.ElementVO; -import com.epri.fx.server.vo.MenuVO; +import com.fx.server.vo.ElementVO; +import com.fx.server.vo.MenuVO; import io.datafx.controller.injection.scopes.ViewScoped; import javafx.beans.property.*; import javafx.collections.FXCollections; diff --git a/falsework-client/src/main/java/com/fx/client/model/OnlineUserDataModel.java b/falsework-client/src/main/java/com/fx/client/model/OnlineUserDataModel.java new file mode 100644 index 0000000..7de6012 --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/model/OnlineUserDataModel.java @@ -0,0 +1,41 @@ +package com.fx.client.model; + +import com.fx.server.entity.log.SysLoginInfor; +import io.datafx.controller.injection.scopes.ViewScoped; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.ListProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +@ViewScoped +public class OnlineUserDataModel { + private ListProperty onlineUsers; + private IntegerProperty selectedIndex; + + + public ListProperty getOnlineUsers() { + if (onlineUsers == null) { + ObservableList innerList = FXCollections.observableArrayList(); + onlineUsers = new SimpleListProperty<>(innerList); + } + return onlineUsers; + } + + + public int getSelectedIndex() { + return selectedIndexProperty().get(); + } + + public IntegerProperty selectedIndexProperty() { + if (selectedIndex == null) { + selectedIndex = new SimpleIntegerProperty(); + } + return selectedIndex; + } + + public void setSelectedIndex(int selectedIndex) { + selectedIndexProperty().set(selectedIndex); + } +} \ No newline at end of file diff --git a/falsework-client/src/main/java/com/fx/client/model/SysJobDataModel.java b/falsework-client/src/main/java/com/fx/client/model/SysJobDataModel.java new file mode 100644 index 0000000..be59091 --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/model/SysJobDataModel.java @@ -0,0 +1,46 @@ +package com.fx.client.model; + +import com.fx.server.entity.SysJob; +import com.fx.server.vo.UserVO; +import io.datafx.controller.ViewController; +import io.datafx.controller.injection.scopes.FlowScoped; +import io.datafx.controller.injection.scopes.ViewScoped; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.ListProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +@ViewScoped +public class SysJobDataModel { + private int counter = 0; + private ListProperty sysJobs; + + private IntegerProperty selectedPersonIndex = new SimpleIntegerProperty(-1); + + public ListProperty getSysJobs() { + if (sysJobs == null) { + ObservableList innerList = FXCollections.observableArrayList(); + sysJobs = new SimpleListProperty<>(innerList); + } + return sysJobs; + } + + public int getSelectedPersonIndex() { + return selectedPersonIndex.get(); + } + + public IntegerProperty selectedPersonIndexProperty() { + return selectedPersonIndex; + } + + public void setSelectedPersonIndex(int selectedPersonIndex) { + this.selectedPersonIndex.set(selectedPersonIndex); + } + + public SysJob selectSysJob() { + return getSysJobs().get(selectedPersonIndex.getValue()); + + } +} \ No newline at end of file diff --git a/falsework-client/src/main/java/com/fx/client/model/SysJobLogModel.java b/falsework-client/src/main/java/com/fx/client/model/SysJobLogModel.java new file mode 100644 index 0000000..351c3d2 --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/model/SysJobLogModel.java @@ -0,0 +1,58 @@ +package com.fx.client.model; + +import com.fx.server.entity.log.SysJobLog; +import io.datafx.controller.injection.scopes.ViewScoped; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.ListProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +@ViewScoped +public class SysJobLogModel { + private int counter = 0; + private ListProperty sysJobLogs; + + private IntegerProperty pageCount; + private IntegerProperty selectedPersonIndex; + + + public ListProperty getSysJobLogs() { + if (sysJobLogs == null) { + ObservableList innerList = FXCollections.observableArrayList(); + sysJobLogs = new SimpleListProperty<>(innerList); + } + return sysJobLogs; + } + + public int getSelectedPersonIndex() { + return selectedPersonIndexProperty().get(); + } + + public void setSelectedPersonIndex(int selectedPersonIndex) { + this.selectedPersonIndex.set(selectedPersonIndex); + } + + public IntegerProperty selectedPersonIndexProperty() { + if (selectedPersonIndex == null) { + selectedPersonIndex = new SimpleIntegerProperty(); + } + return selectedPersonIndex; + } + + public int getPageCount() { + return pageCount.get(); + } + + public IntegerProperty pageCountProperty() { + if (pageCount == null) { + pageCount = new SimpleIntegerProperty(); + } + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount.set(pageCount); + } +} \ No newline at end of file diff --git a/falsework-client/src/main/java/com/epri/fx/client/model/UserDataModel.java b/falsework-client/src/main/java/com/fx/client/model/UserDataModel.java similarity index 92% rename from falsework-client/src/main/java/com/epri/fx/client/model/UserDataModel.java rename to falsework-client/src/main/java/com/fx/client/model/UserDataModel.java index 73a2238..2a13fab 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/model/UserDataModel.java +++ b/falsework-client/src/main/java/com/fx/client/model/UserDataModel.java @@ -1,7 +1,8 @@ -package com.epri.fx.client.model; +package com.fx.client.model; -import com.epri.fx.server.vo.UserVO; +import com.fx.server.vo.UserVO; import io.datafx.controller.injection.scopes.FlowScoped; +import io.datafx.controller.injection.scopes.ViewScoped; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ListProperty; import javafx.beans.property.SimpleIntegerProperty; @@ -9,7 +10,7 @@ import javafx.beans.property.SimpleListProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; -@FlowScoped +@ViewScoped public class UserDataModel { private int counter = 0; private ListProperty users; diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/Request.java b/falsework-client/src/main/java/com/fx/client/request/Request.java similarity index 94% rename from falsework-client/src/main/java/com/epri/fx/client/request/Request.java rename to falsework-client/src/main/java/com/fx/client/request/Request.java index 6253995..dfa5097 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/Request.java +++ b/falsework-client/src/main/java/com/fx/client/request/Request.java @@ -1,8 +1,8 @@ -package com.epri.fx.client.request; +package com.fx.client.request; -import com.epri.fx.client.request.feign.AppRequestErrorDecoder; -import com.epri.fx.client.request.feign.AppRequestInterceptor; -import com.epri.fx.client.request.feign.FeignAPI; +import com.fx.client.request.feign.AppRequestErrorDecoder; +import com.fx.client.request.feign.AppRequestInterceptor; +import com.fx.client.request.feign.FeignAPI; import com.netflix.client.ClientFactory; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.BestAvailableRule; @@ -16,7 +16,6 @@ import feign.jackson.JacksonEncoder; import feign.okhttp.OkHttpClient; import feign.ribbon.LBClient; import feign.ribbon.LBClientFactory; -import feign.ribbon.LoadBalancingTarget; import feign.ribbon.RibbonClient; import feign.slf4j.Slf4jLogger; import okhttp3.ConnectionPool; diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/AppRequestErrorDecoder.java b/falsework-client/src/main/java/com/fx/client/request/feign/AppRequestErrorDecoder.java similarity index 57% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/AppRequestErrorDecoder.java rename to falsework-client/src/main/java/com/fx/client/request/feign/AppRequestErrorDecoder.java index e41300f..f9b2320 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/AppRequestErrorDecoder.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/AppRequestErrorDecoder.java @@ -1,9 +1,9 @@ -package com.epri.fx.client.request.feign; +package com.fx.client.request.feign; -import com.epri.fx.client.store.ApplicatonStore; -import com.epri.fx.client.utils.AlertUtil; +import com.fx.client.utils.AlertUtil; import feign.Response; import feign.codec.ErrorDecoder; +import io.datafx.core.concurrent.ProcessChain; /** * @description: @@ -14,7 +14,10 @@ import feign.codec.ErrorDecoder; public class AppRequestErrorDecoder implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { - AlertUtil.show(response); + ProcessChain.create().addRunnableInPlatformThread(() -> { + AlertUtil.show(response); + }).run(); + return null; } } diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/AppRequestInterceptor.java b/falsework-client/src/main/java/com/fx/client/request/feign/AppRequestInterceptor.java similarity index 74% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/AppRequestInterceptor.java rename to falsework-client/src/main/java/com/fx/client/request/feign/AppRequestInterceptor.java index 16a0ea9..10d259c 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/AppRequestInterceptor.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/AppRequestInterceptor.java @@ -1,6 +1,6 @@ -package com.epri.fx.client.request.feign; +package com.fx.client.request.feign; -import com.epri.fx.client.store.ApplicatonStore; +import com.fx.client.store.ApplicatonStore; import feign.RequestInterceptor; import feign.RequestTemplate; diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/FeignAPI.java b/falsework-client/src/main/java/com/fx/client/request/feign/FeignAPI.java similarity index 70% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/FeignAPI.java rename to falsework-client/src/main/java/com/fx/client/request/feign/FeignAPI.java index b642dda..8baa1cc 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/FeignAPI.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/FeignAPI.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.request.feign; +package com.fx.client.request.feign; import feign.Headers; diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/ElementFeign.java b/falsework-client/src/main/java/com/fx/client/request/feign/admin/ElementFeign.java similarity index 75% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/ElementFeign.java rename to falsework-client/src/main/java/com/fx/client/request/feign/admin/ElementFeign.java index 887eb98..cb58330 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/ElementFeign.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/admin/ElementFeign.java @@ -1,8 +1,8 @@ -package com.epri.fx.client.request.feign.admin; +package com.fx.client.request.feign.admin; -import com.epri.fx.client.request.feign.FeignAPI; -import com.epri.fx.server.entity.Element; -import com.epri.fx.server.msg.TableResultResponse; +import com.fx.client.request.feign.FeignAPI; +import com.fx.server.entity.Element; +import com.fx.server.msg.TableResultResponse; import feign.Param; import feign.RequestLine; diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/GroupFeign.java b/falsework-client/src/main/java/com/fx/client/request/feign/admin/GroupFeign.java similarity index 82% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/GroupFeign.java rename to falsework-client/src/main/java/com/fx/client/request/feign/admin/GroupFeign.java index c408c5e..3980f60 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/GroupFeign.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/admin/GroupFeign.java @@ -1,9 +1,9 @@ -package com.epri.fx.client.request.feign.admin; +package com.fx.client.request.feign.admin; -import com.epri.fx.client.request.feign.FeignAPI; -import com.epri.fx.server.vo.GroupUsers; -import com.epri.fx.server.vo.GroupVO; -import com.epri.fx.server.vo.MenuVO; +import com.fx.client.request.feign.FeignAPI; +import com.fx.server.vo.GroupUsers; +import com.fx.server.vo.GroupVO; +import com.fx.server.vo.MenuVO; import feign.Param; import feign.QueryMap; import feign.RequestLine; @@ -41,6 +41,6 @@ public interface GroupFeign extends FeignAPI { public GroupUsers getUsers(@Param("id") int id); @RequestLine(value = "PUT /group/{id}/user") - public Integer modifiyUsers(@Param("id") int id, @QueryMap Map map); + public Integer modifiyUsers(@Param("id") int id, @QueryMap Map map); } diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/GroupTypeFeign.java b/falsework-client/src/main/java/com/fx/client/request/feign/admin/GroupTypeFeign.java similarity index 81% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/GroupTypeFeign.java rename to falsework-client/src/main/java/com/fx/client/request/feign/admin/GroupTypeFeign.java index bd7602d..8f3adfc 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/GroupTypeFeign.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/admin/GroupTypeFeign.java @@ -1,7 +1,7 @@ -package com.epri.fx.client.request.feign.admin; +package com.fx.client.request.feign.admin; -import com.epri.fx.client.request.feign.FeignAPI; -import com.epri.fx.server.vo.GroupTypeVO; +import com.fx.client.request.feign.FeignAPI; +import com.fx.server.vo.GroupTypeVO; import feign.Param; import feign.RequestLine; diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/LogFeign.java b/falsework-client/src/main/java/com/fx/client/request/feign/admin/LogFeign.java similarity index 57% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/LogFeign.java rename to falsework-client/src/main/java/com/fx/client/request/feign/admin/LogFeign.java index cb1630f..affa358 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/LogFeign.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/admin/LogFeign.java @@ -1,11 +1,10 @@ -package com.epri.fx.client.request.feign.admin; +package com.fx.client.request.feign.admin; -import com.epri.fx.client.request.feign.FeignAPI; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.entity.log.GateLog; -import com.epri.fx.server.entity.log.LogInfo; -import com.epri.fx.server.msg.ObjectRestResponse; -import com.epri.fx.server.msg.TableResultResponse; +import com.fx.client.request.feign.FeignAPI; +import com.fx.server.entity.log.GateLog; +import com.fx.server.msg.ObjectRestResponse; +import com.fx.server.msg.TableResultResponse; +import feign.Headers; import feign.Param; import feign.QueryMap; import feign.RequestLine; @@ -18,6 +17,7 @@ import java.util.Map; * @author: liwen * @date: 2020/4/1 17:31 */ +@Headers("Content-Type: application/json") public interface LogFeign extends FeignAPI { @RequestLine("GET /log/page") TableResultResponse getPageList(@QueryMap Map map); diff --git a/falsework-client/src/main/java/com/fx/client/request/feign/admin/LoginLogFeign.java b/falsework-client/src/main/java/com/fx/client/request/feign/admin/LoginLogFeign.java new file mode 100644 index 0000000..9313b6a --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/request/feign/admin/LoginLogFeign.java @@ -0,0 +1,24 @@ +package com.fx.client.request.feign.admin; + +import com.fx.client.request.feign.FeignAPI; +import com.fx.server.entity.log.SysLoginInfor; +import com.fx.server.msg.TableResultResponse; +import feign.Headers; +import feign.QueryMap; +import feign.RequestLine; + +import java.util.Map; + +/** + * @description: + * @className: SysJobController + * @author: liwen + * @date: 2020/12/25 09:23 + */ +@Headers("Content-Type: application/json") +public interface LoginLogFeign extends FeignAPI { + + @RequestLine("GET /log/login/list") + TableResultResponse getSysLoginInfor(@QueryMap Map map); + +} diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/MenuFeign.java b/falsework-client/src/main/java/com/fx/client/request/feign/admin/MenuFeign.java similarity index 82% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/MenuFeign.java rename to falsework-client/src/main/java/com/fx/client/request/feign/admin/MenuFeign.java index 2ec5694..6de445f 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/MenuFeign.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/admin/MenuFeign.java @@ -1,7 +1,7 @@ -package com.epri.fx.client.request.feign.admin; +package com.fx.client.request.feign.admin; -import com.epri.fx.client.request.feign.FeignAPI; -import com.epri.fx.server.vo.MenuVO; +import com.fx.client.request.feign.FeignAPI; +import com.fx.server.vo.MenuVO; import feign.Headers; import feign.RequestLine; diff --git a/falsework-client/src/main/java/com/fx/client/request/feign/admin/SysJobFeign.java b/falsework-client/src/main/java/com/fx/client/request/feign/admin/SysJobFeign.java new file mode 100644 index 0000000..e88cc1f --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/request/feign/admin/SysJobFeign.java @@ -0,0 +1,44 @@ +package com.fx.client.request.feign.admin; + +import com.fx.client.request.feign.FeignAPI; +import com.fx.server.entity.SysJob; +import com.fx.server.entity.log.SysJobLog; +import com.fx.server.msg.TableResultResponse; +import feign.Param; +import feign.QueryMap; +import feign.RequestLine; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @className: SysJobController + * @author: liwen + * @date: 2020/12/25 09:23 + */ +public interface SysJobFeign extends FeignAPI { + + @RequestLine("GET /job/list") + List getSysJobAll(@QueryMap Map map); + @RequestLine("GET /job/log/list") + TableResultResponse getSysJobLogList(@QueryMap Map map); + + @RequestLine("POST /job") + Integer addJob(SysJob sysJob); + + @RequestLine("PUT /job") + Integer updateJob(SysJob sysJob); + + @RequestLine("DELETE /job/{jobName}/{jobGroupName}") + Integer deleteJob(@Param("jobName") String jobName,@Param("jobGroupName") String jobGroupName); + + @RequestLine("PUT /job/pause/{jobName}/{jobGroupName}") + Integer pauseJob(@Param("jobName") String jobName,@Param("jobGroupName") String jobGroupName); + + @RequestLine("PUT /job/resume/{jobName}/{jobGroupName}") + Integer resumeJob(@Param("jobName") String jobName,@Param("jobGroupName") String jobGroupName); + + @RequestLine("PUT /job/run/{jobName}/{jobGroupName}") + Integer runJob(@Param("jobName") String jobName,@Param("jobGroupName") String jobGroupName); +} diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/UserFeign.java b/falsework-client/src/main/java/com/fx/client/request/feign/admin/UserFeign.java similarity index 55% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/UserFeign.java rename to falsework-client/src/main/java/com/fx/client/request/feign/admin/UserFeign.java index 06c56d1..b6da364 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/admin/UserFeign.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/admin/UserFeign.java @@ -1,14 +1,15 @@ -package com.epri.fx.client.request.feign.admin; +package com.fx.client.request.feign.admin; -import com.epri.fx.client.request.feign.FeignAPI; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.msg.ObjectRestResponse; -import com.epri.fx.server.msg.TableResultResponse; -import com.epri.fx.server.vo.UserVO; +import com.fx.client.request.feign.FeignAPI; +import com.fx.server.entity.User; +import com.fx.server.entity.log.SysLoginInfor; +import com.fx.server.msg.ObjectRestResponse; +import com.fx.server.msg.TableResultResponse; import feign.Param; import feign.QueryMap; import feign.RequestLine; +import java.util.List; import java.util.Map; /** @@ -21,6 +22,12 @@ public interface UserFeign extends FeignAPI { @RequestLine("GET /user/page") TableResultResponse getPageList(@QueryMap Map map); + @RequestLine("GET /user/online/list") + List getOnlineUsers(); + + @RequestLine("POST /user/retreat/{userId}") + ObjectRestResponse retreat(@Param("userId") String userId); + @RequestLine("PUT /user/{id}") ObjectRestResponse update(@Param("id") Integer id, User user); @@ -28,7 +35,7 @@ public interface UserFeign extends FeignAPI { ObjectRestResponse delete(@Param("id") Integer id); @RequestLine("PUT /user/password/{id}") - ObjectRestResponse restPassword(@Param("id")Integer id); + ObjectRestResponse restPassword(@Param("id") Integer id); @RequestLine("POST /user") ObjectRestResponse add(User user); diff --git a/falsework-client/src/main/java/com/epri/fx/client/request/feign/login/LoginFeign.java b/falsework-client/src/main/java/com/fx/client/request/feign/login/LoginFeign.java similarity index 73% rename from falsework-client/src/main/java/com/epri/fx/client/request/feign/login/LoginFeign.java rename to falsework-client/src/main/java/com/fx/client/request/feign/login/LoginFeign.java index 69284ac..f93dc5c 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/request/feign/login/LoginFeign.java +++ b/falsework-client/src/main/java/com/fx/client/request/feign/login/LoginFeign.java @@ -1,10 +1,10 @@ -package com.epri.fx.client.request.feign.login; +package com.fx.client.request.feign.login; -import com.epri.fx.client.request.feign.FeignAPI; -import com.epri.fx.server.msg.ObjectRestResponse; -import com.epri.fx.server.util.user.JwtAuthenticationRequest; -import com.epri.fx.server.vo.FrontUser; -import com.epri.fx.server.vo.MenuVO; +import com.fx.client.request.feign.FeignAPI; +import com.fx.server.msg.ObjectRestResponse; +import com.fx.server.util.user.JwtAuthenticationRequest; +import com.fx.server.vo.FrontUser; +import com.fx.server.vo.MenuVO; import feign.Param; import feign.RequestLine; diff --git a/falsework-client/src/main/java/com/epri/fx/client/store/ApplicatonStore.java b/falsework-client/src/main/java/com/fx/client/store/ApplicatonStore.java similarity index 96% rename from falsework-client/src/main/java/com/epri/fx/client/store/ApplicatonStore.java rename to falsework-client/src/main/java/com/fx/client/store/ApplicatonStore.java index 273a78e..088b69c 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/store/ApplicatonStore.java +++ b/falsework-client/src/main/java/com/fx/client/store/ApplicatonStore.java @@ -1,16 +1,15 @@ -package com.epri.fx.client.store; +package com.fx.client.store; -import com.epri.fx.client.bean.MenuVoCell; -import com.epri.fx.server.vo.GroupVO; -import com.epri.fx.server.vo.MenuVO; -import com.epri.fx.server.vo.PermissionInfo; +import com.fx.client.bean.MenuVoCell; +import com.fx.server.vo.GroupVO; +import com.fx.server.vo.MenuVO; +import com.fx.server.vo.PermissionInfo; import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.ObservableMap; import java.util.HashMap; -import java.util.Map; /** * @description: diff --git a/falsework-client/src/main/java/com/epri/fx/client/utils/AlertUtil.java b/falsework-client/src/main/java/com/fx/client/utils/AlertUtil.java similarity index 95% rename from falsework-client/src/main/java/com/epri/fx/client/utils/AlertUtil.java rename to falsework-client/src/main/java/com/fx/client/utils/AlertUtil.java index bbaec03..b1e33e7 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/utils/AlertUtil.java +++ b/falsework-client/src/main/java/com/fx/client/utils/AlertUtil.java @@ -1,6 +1,6 @@ -package com.epri.fx.client.utils; +package com.fx.client.utils; -import com.epri.fx.server.msg.BaseResponse; +import com.fx.server.msg.BaseResponse; import com.jfoenix.controls.JFXAlert; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXDialogLayout; diff --git a/falsework-client/src/main/java/com/epri/fx/client/utils/Helper.java b/falsework-client/src/main/java/com/fx/client/utils/Helper.java similarity index 85% rename from falsework-client/src/main/java/com/epri/fx/client/utils/Helper.java rename to falsework-client/src/main/java/com/fx/client/utils/Helper.java index ba35a49..da33488 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/utils/Helper.java +++ b/falsework-client/src/main/java/com/fx/client/utils/Helper.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.utils; +package com.fx.client.utils; /** * @description: diff --git a/falsework-client/src/main/java/com/epri/fx/client/utils/Pinyin4jUtil.java b/falsework-client/src/main/java/com/fx/client/utils/Pinyin4jUtil.java similarity index 99% rename from falsework-client/src/main/java/com/epri/fx/client/utils/Pinyin4jUtil.java rename to falsework-client/src/main/java/com/fx/client/utils/Pinyin4jUtil.java index f4e6ae2..76cc2be 100644 --- a/falsework-client/src/main/java/com/epri/fx/client/utils/Pinyin4jUtil.java +++ b/falsework-client/src/main/java/com/fx/client/utils/Pinyin4jUtil.java @@ -1,4 +1,4 @@ -package com.epri.fx.client.utils; +package com.fx.client.utils; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; diff --git a/falsework-client/src/main/java/com/fx/client/websocket/WSClient.java b/falsework-client/src/main/java/com/fx/client/websocket/WSClient.java new file mode 100644 index 0000000..fff7b9a --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/websocket/WSClient.java @@ -0,0 +1,91 @@ +package com.fx.client.websocket; + +import com.fx.client.gui.uicomponents.login.LoginController; +import com.fx.client.store.ApplicatonStore; +import io.datafx.controller.context.ApplicationContext; +import io.datafx.controller.flow.FlowException; +import io.datafx.controller.flow.FlowHandler; +import io.datafx.controller.injection.scopes.ApplicationScoped; +import io.datafx.controller.util.VetoException; +import io.datafx.core.concurrent.ProcessChain; +import lombok.extern.slf4j.Slf4j; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.handshake.ServerHandshake; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.HashMap; +import java.util.Map; + +/** + * @description: + * @className: Session + * @author: liwen + * @date: 2020/6/24 16:17 + */ +@ApplicationScoped +@Slf4j +public class WSClient extends WebSocketClient { + + private static WSClient instance; + + + public static synchronized WSClient getInstance() { + if (instance == null) { + Map httpHeaders = new HashMap<>(); + try { + instance = new WSClient(new URI("ws://localhost:8080/websocket/test")); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + } + + return instance; + } + + + public WSClient(URI serverUri) { + super(serverUri); + } + + + @Override + public void onOpen(ServerHandshake handshakedata) { + log.info("[websocket] 连接成功"); + System.err.println(instance.isOpen()); + } + + @Override + public void onMessage(String message) { + log.info("[websocket] 收到消息={}", message); + + } + + @Override + public void onClose(int code, String reason, boolean remote) { + log.info("[websocket] 退出连接"); + instance = null; + + ProcessChain.create().addRunnableInPlatformThread(() -> { + ApplicatonStore.clearPermissionInfo(); + FlowHandler flowHandler= (FlowHandler) ApplicationContext.getInstance().getRegisteredObject("ContentFlowHandler"); + try { + flowHandler.navigateTo(LoginController.class); + } catch (VetoException e) { + e.printStackTrace(); + } catch (FlowException e) { + e.printStackTrace(); + } + }).run(); + + + } + + @Override + public void onError(Exception ex) { + log.info("[websocket] 连接错误={}", ex.getMessage()); + instance = null; + } + + +} diff --git a/falsework-client/src/main/resources/META-INF/datafx.xml b/falsework-client/src/main/resources/META-INF/datafx.xml deleted file mode 100644 index 1c0aa57..0000000 --- a/falsework-client/src/main/resources/META-INF/datafx.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - com.epri.fx.client.gui.uicomponents.feature.UserGroupFeatures - - - \ No newline at end of file diff --git a/falsework-client/src/main/resources/css/app-dark.css b/falsework-client/src/main/resources/css/app-dark.css index c4fe154..816453c 100644 --- a/falsework-client/src/main/resources/css/app-dark.css +++ b/falsework-client/src/main/resources/css/app-dark.css @@ -26,7 +26,12 @@ -fx-icon-svg-color: rgb(3,115,248) } - +#waring{ + -fx-background-color: #06488a; +} +.waringbut{ + -fx-background-color: #6e57e5; +} .backgroundPane { -fx-background-color: -fx-card-base; } @@ -320,6 +325,8 @@ -fx-background-color: TRANSPARENT } + + .tool-bar-button > .jfx-svg-glyph { -fx-fill: -fx-text-color; -fx-text-fill: -fx-text-color; @@ -334,6 +341,22 @@ .tool-bar-button:focused { -fx-background-color: TRANSPARENT } +.tool-bar-toggle { + -fx-fill: -fx-text-color; + -fx-text-fill: -fx-text-color; + -fx-pref-height: 32; + -fx-pref-width: 32; + -fx-background-radius: 16; + -fx-background-color: derive(-fx-main-base, 10%) +} + + +.tool-bar-toggle > .jfx-svg-glyph { + -fx-fill: -fx-text-color; + -fx-text-fill: -fx-text-color; + -fx-prompt-text-fill: -fx-text-color; + -jfx-size: 20px; +} /******************************************************************************* * * @@ -387,7 +410,7 @@ } .jfx-tab-pane .headers-region .tab .tab-container .tab-close-button:hover { - -fx-background-color: derive(-fx-text-color, -20%) + -fx-background-color: derive(-fx-text-color, -50%) } @@ -977,6 +1000,30 @@ } +#status-success-label { + -fx-text-fill: #ffffff; + -fx-background-color: #1ea681; + -fx-background-radius: 10; + -fx-padding: 5 10 5 10; +} +#status-error-label { + -fx-background-color: #e63c53; + -fx-background-radius: 10; + -fx-text-fill: #ffffff; + -fx-padding: 5 10 5 10; +} +.icons-badge .badge-pane { + -fx-background-color: #ff4081; + -fx-background-radius: 20; + -fx-pref-width: 20; + -fx-pref-height: 20; + -fx-alignment: center; +} + +.icons-badge Label { + -fx-font-size: 14.0px; + -fx-text-fill: WHITE; +} diff --git a/falsework-client/src/main/resources/css/app-light.css b/falsework-client/src/main/resources/css/app-light.css index 487d3de..2285798 100644 --- a/falsework-client/src/main/resources/css/app-light.css +++ b/falsework-client/src/main/resources/css/app-light.css @@ -33,7 +33,7 @@ -fx-background-color: -fx-card-base; } -.tool-pane{ +.tool-pane { -fx-border-color: -fx-border-base; -fx-border-width: 0 0 0.45 0; } @@ -57,12 +57,12 @@ } -. - /******************************************************************************* - * * - * text和label * - * * - *******************************************************************************/ + +/******************************************************************************* +* * +* text和label * +* * +*******************************************************************************/ .label { -fx-text-fill: -fx-text-color; -fx-font-family: "Microsoft YaHei"; @@ -111,9 +111,8 @@ .jfx-button { -fx-padding: 0.47em 0.47em; -fx-background-color: -fx-accent-color; - -fx-text-fill: -fx-text-color; + -fx-text-fill: #ffffff; -jfx-button-type: RAISED; - } .jfx-button > MaterialDesignIconView, .toggle-button > MaterialDesignIconView { @@ -338,6 +337,22 @@ -fx-background-color: TRANSPARENT } +.tool-bar-toggle { + -fx-fill: -fx-text-color; + -fx-text-fill: -fx-text-color; + -fx-pref-height: 32; + -fx-pref-width: 32; + -fx-background-radius: 16; + -fx-background-color: ladder(-fx-main-base, rgba(255, 255, 255, .2) 29%, rgba(0, 0, 0, .2) 30%); +} + +.tool-bar-toggle > .jfx-svg-glyph { + -fx-fill: -fx-text-color; + -fx-text-fill: -fx-text-color; + -fx-prompt-text-fill: -fx-text-color; + -jfx-size: 20px; +} + /******************************************************************************* * * * JFX TabPane * @@ -390,7 +405,7 @@ } .jfx-tab-pane .headers-region .tab .tab-container .tab-close-button:hover { - -fx-background-color: derive(-fx-text-color, 20%) + -fx-background-color: derive(-fx-text-color, 90%) } @@ -439,7 +454,7 @@ .jfx-list-cell:filled:hover, .jfx-list-cell:selected .label { - -fx-text-fill: -fx-text-color; + -fx-text-fill: #ffffff; } .jfx-list-cell .jfx-rippler { @@ -634,9 +649,9 @@ -fx-background-color: transparent; } -.table-row-cell .text { - -fx-fill: -fx-text-color; -} +/*.table-row-cell .text {*/ +/* -fx-fill: -fx-text-color;*/ +/*}*/ /*TableView的单元之间去掉没有数据的竖线 */ .table-view .table-row-cell:empty, .table-view .table-row-cell:empty .table-cell { @@ -980,10 +995,33 @@ -fx-tick-label-fill: #454545; } - - - - +#status-success-label { + -fx-text-fill: #ffffff; + -fx-background-color: #1ea681; + -fx-background-radius: 10; + -fx-padding: 5 10 5 10; +} + +#status-error-label { + -fx-background-color: #e63c53; + -fx-background-radius: 10; + -fx-text-fill: #ffffff; + -fx-padding: 5 10 5 10; +} + + +.icons-badge .badge-pane { + -fx-background-color: #ff4081; + -fx-background-radius: 20; + -fx-pref-width: 20; + -fx-pref-height: 20; + -fx-alignment: center; +} + +.icons-badge Label { + -fx-font-size: 14.0px; + -fx-text-fill: WHITE; +} diff --git a/falsework-client/src/main/resources/fonts/icon_font/iconfont.svg b/falsework-client/src/main/resources/fonts/icon_font/iconfont.svg index f75a2dc..a8ff077 100644 --- a/falsework-client/src/main/resources/fonts/icon_font/iconfont.svg +++ b/falsework-client/src/main/resources/fonts/icon_font/iconfont.svg @@ -20,6 +20,39 @@ Created by iconfont /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/falsework-client/src/main/resources/fxml/admin/logManagement/login_log.fxml b/falsework-client/src/main/resources/fxml/admin/logManagement/login_log.fxml new file mode 100644 index 0000000..a9aff0d --- /dev/null +++ b/falsework-client/src/main/resources/fxml/admin/logManagement/login_log.fxml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/falsework-client/src/main/resources/fxml/admin/log/log_management.fxml b/falsework-client/src/main/resources/fxml/admin/logManagement/operation_log.fxml similarity index 100% rename from falsework-client/src/main/resources/fxml/admin/log/log_management.fxml rename to falsework-client/src/main/resources/fxml/admin/logManagement/operation_log.fxml diff --git a/falsework-client/src/main/resources/fxml/admin/quartz/job.fxml b/falsework-client/src/main/resources/fxml/admin/quartz/job.fxml deleted file mode 100644 index e65ac94..0000000 --- a/falsework-client/src/main/resources/fxml/admin/quartz/job.fxml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/falsework-client/src/main/resources/fxml/admin/quartz/job_log.fxml b/falsework-client/src/main/resources/fxml/admin/quartz/job_log.fxml deleted file mode 100644 index 9ed3796..0000000 --- a/falsework-client/src/main/resources/fxml/admin/quartz/job_log.fxml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/falsework-client/src/main/resources/fxml/main/main.fxml b/falsework-client/src/main/resources/fxml/main/main.fxml index c50aaf2..7b5bd64 100644 --- a/falsework-client/src/main/resources/fxml/main/main.fxml +++ b/falsework-client/src/main/resources/fxml/main/main.fxml @@ -1,5 +1,6 @@ + @@ -7,7 +8,7 @@ - + @@ -54,12 +55,25 @@ - - - + + + + + + + + + + + + + diff --git a/falsework-client/src/main/resources/fxml/monitor/onlineuser/online_user.fxml b/falsework-client/src/main/resources/fxml/monitor/onlineuser/online_user.fxml new file mode 100644 index 0000000..83f5bb4 --- /dev/null +++ b/falsework-client/src/main/resources/fxml/monitor/onlineuser/online_user.fxml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/falsework-client/src/main/resources/fxml/monitor/quartz/job.fxml b/falsework-client/src/main/resources/fxml/monitor/quartz/job.fxml new file mode 100644 index 0000000..485c82f --- /dev/null +++ b/falsework-client/src/main/resources/fxml/monitor/quartz/job.fxml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/falsework-client/src/main/resources/fxml/monitor/quartz/job_detail.fxml b/falsework-client/src/main/resources/fxml/monitor/quartz/job_detail.fxml new file mode 100644 index 0000000..99c5af8 --- /dev/null +++ b/falsework-client/src/main/resources/fxml/monitor/quartz/job_detail.fxml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/falsework-client/src/main/resources/fxml/monitor/quartz/job_log.fxml b/falsework-client/src/main/resources/fxml/monitor/quartz/job_log.fxml new file mode 100644 index 0000000..a8c6fde --- /dev/null +++ b/falsework-client/src/main/resources/fxml/monitor/quartz/job_log.fxml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/falsework-client/src/main/resources/fxml/test/test.fxml b/falsework-client/src/main/resources/fxml/test/test.fxml new file mode 100644 index 0000000..b1c9fd7 --- /dev/null +++ b/falsework-client/src/main/resources/fxml/test/test.fxml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/falsework-client/src/main/resources/sample-client.properties b/falsework-client/src/main/resources/sample-client.properties index 3dbb7cd..113b332 100644 --- a/falsework-client/src/main/resources/sample-client.properties +++ b/falsework-client/src/main/resources/sample-client.properties @@ -17,7 +17,7 @@ sample-client.ribbon.ConnectTimeout = 60000 sample-client.ribbon.ReadTimeout = 60000 #初始服务器列表,可以在运行时通过Archaius动态属性进行更改 -sample-client.ribbon.listOfServers =localhost:8080,localhost:9080 +sample-client.ribbon.listOfServers =localhost:8080 #启用主要连接 diff --git a/falsework-client/src/test/java/MyStackedAreaChart.java b/falsework-client/src/test/java/MyStackedAreaChart.java index b302e15..2e213fd 100644 --- a/falsework-client/src/test/java/MyStackedAreaChart.java +++ b/falsework-client/src/test/java/MyStackedAreaChart.java @@ -104,6 +104,7 @@ public class MyStackedAreaChart extends LineChart { VBox vBox = new VBox(); vBox.setSpacing(5); + vBox.getChildren().add(new Label(xValue.toString())); for (int i = 0; i < getData().size(); i++) { Series series = getData().get(i); series.getNode().getStyle(); diff --git a/falsework-client/src/test/java/StackedAreaChartApp.java b/falsework-client/src/test/java/StackedAreaChartApp.java index 3c16880..3392804 100644 --- a/falsework-client/src/test/java/StackedAreaChartApp.java +++ b/falsework-client/src/test/java/StackedAreaChartApp.java @@ -29,10 +29,7 @@ public class StackedAreaChartApp extends Application { private StackPane pane; private CategoryAxis xAxis; private NumberAxis yAxis; - private Circle selector; private Line selectorLine; - private List strokePaths; - private Tooltip selectorTooltip; public MyStackedAreaChart createContent() { @@ -70,18 +67,11 @@ public class StackedAreaChartApp extends Application { )) ); chart = new MyStackedAreaChart(xAxis, yAxis, areaChartData); - chart.setCreateSymbols(true); + chart.setCreateSymbols(false); return chart; } - private StackPane createPane(){ - selectorLine = new Line(); - selectorLine.setFill(Color.WHEAT); - selectorLine.setStrokeWidth(5f); - pane = new StackPane(); - pane.getChildren().addAll(createContent(),selectorLine); - return pane; - } + diff --git a/falsework-client/src/test/java/TableViewSample.java b/falsework-client/src/test/java/TableViewSample.java index e2a1a6d..60deb76 100644 --- a/falsework-client/src/test/java/TableViewSample.java +++ b/falsework-client/src/test/java/TableViewSample.java @@ -1,4 +1,4 @@ -import com.epri.fx.server.vo.UserVO; +import com.fx.server.vo.UserVO; import javafx.application.Application; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ListProperty; diff --git a/falsework-sever/pom.xml b/falsework-sever/pom.xml index 73fc7e8..c593c60 100644 --- a/falsework-sever/pom.xml +++ b/falsework-sever/pom.xml @@ -8,7 +8,7 @@ 2.4.1 - com.epri + com.fx falsework-sever 0.0.1-SNAPSHOT falsework-sever @@ -106,11 +106,7 @@ system ${basedir}/libs/DmJdbcDriver-1.0.0.jar - - commons-codec - commons-codec - 1.14 - + pinyin4j pinyin4j diff --git a/falsework-sever/sql/mysql/fx_falsework_db.sql b/falsework-sever/sql/mysql/fx_falsework_db.sql new file mode 100644 index 0000000..82cbe0c --- /dev/null +++ b/falsework-sever/sql/mysql/fx_falsework_db.sql @@ -0,0 +1,803 @@ +/* + Navicat MySQL Data Transfer + + Source Server : localhost_3306 + Source Server Type : MySQL + Source Server Version : 80022 + Source Host : localhost:3306 + Source Schema : fx_falsework_db + + Target Server Type : MySQL + Target Server Version : 80022 + File Encoding : 65001 + + Date: 14/01/2021 16:38:46 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for auth_client_service +-- ---------------------------- +DROP TABLE IF EXISTS `auth_client_service`; +CREATE TABLE `auth_client_service` ( + `id` int NOT NULL AUTO_INCREMENT, + `service_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `client_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` timestamp NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id_13178295930045`(`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 20 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of auth_client_service +-- ---------------------------- +INSERT INTO `auth_client_service` VALUES (1, '3', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `auth_client_service` VALUES (2, '2', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `auth_client_service` VALUES (3, '2', '3', NULL, '2017-12-31 08:58:03', 'null', 'null', 'null', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `auth_client_service` VALUES (16, '1', '7', NULL, '2018-11-15 19:50:50', '9', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `auth_client_service` VALUES (17, '2', '7', NULL, '2018-11-15 19:50:50', '9', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `auth_client_service` VALUES (18, '3', '7', NULL, '2018-11-15 19:50:50', '9', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `auth_client_service` VALUES (19, '7', '7', NULL, '2018-11-15 19:50:50', '9', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for base_element +-- ---------------------------- +DROP TABLE IF EXISTS `base_element`; +CREATE TABLE `base_element` ( + `id` int NOT NULL AUTO_INCREMENT, + `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `uri` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `menu_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `parent_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `path` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `method` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` timestamp NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id_13178345917581`(`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 43 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of base_element +-- ---------------------------- +INSERT INTO `base_element` VALUES (4, 'menuManager:element', 'uri', '按钮页面', '/admin/element', '6', NULL, NULL, 'GET', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (5, 'menuManager:btn_add', 'button', '新增', '/menu/{*}', '6', NULL, NULL, 'POST', '', '2020-12-03 13:25:44', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (6, 'menuManager:btn_edit', 'button', '编辑', '/menu', '6', '', '', 'PUT', '', '2020-12-03 13:26:03', '1', 'admin', '127.0.0.1', '', '', '', '', '', '', '', ''); +INSERT INTO `base_element` VALUES (7, 'menuManager:btn_del', 'button', '删除', '/menu/{*}', '6', '', '', 'DELETE', '', '2020-12-03 13:26:12', '1', 'admin', '127.0.0.1', '', '', '', '', '', '', '', ''); +INSERT INTO `base_element` VALUES (8, 'menuManager:btn_element_add', 'button', '新增元素', '/element', '6', NULL, NULL, 'POST', '', '2020-12-03 13:26:26', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (9, 'menuManager:btn_element_edit', 'button', '编辑元素', '/element', '6', NULL, NULL, 'PUT', '', '2020-12-03 13:26:37', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (10, 'menuManager:btn_element_del', 'button', '删除元素', '/element/{*}', '6', NULL, NULL, 'DELETE', '', '2020-12-03 13:26:43', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (12, 'groupManager:btn_edit', 'button', '编辑', '/group', '7', NULL, NULL, 'PUT', '', '2020-12-03 13:46:59', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (14, 'groupManager:btn_userManager', 'button', '分配用户', '/group/{*}/user', '7', NULL, NULL, 'PUT', '', '2020-12-03 13:26:58', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (15, 'groupManager:btn_resourceManager', 'button', '分配权限', '/group/{*}/authority/menu', '7', NULL, NULL, 'PUT', '', '2020-12-03 13:48:31', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (19, 'menuManager:view', 'uri', '查看', '/admin/menu/{*}', '6', '', '', 'GET', '', '2017-06-26 00:00:00', '', '', '', '', '', '', '', '', '', '', ''); +INSERT INTO `base_element` VALUES (20, 'menuManager:element_view', 'uri', '查看', '/admin/element/{*}', '6', NULL, NULL, 'GET', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (22, 'groupTypeManager:view', 'uri', '查看', '/admin/groupType/{*}', '8', NULL, NULL, 'GET', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (23, 'groupTypeManager:btn_add', 'button', '新增', '/groupType', '8', NULL, NULL, 'POST', NULL, '2020-12-03 13:17:51', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (24, 'groupTypeManager:btn_edit', 'button', '编辑', '/groupType', '8', NULL, NULL, 'PUT', NULL, '2020-12-03 13:22:14', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (25, 'groupTypeManager:btn_del', 'button', '删除', '/groupType/{*}', '8', NULL, NULL, 'DELETE', NULL, '2020-12-03 13:18:12', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (27, 'serviceManager:view', 'URI', '查看', '/auth/service/{*}', '10', NULL, NULL, 'GET', NULL, '2017-12-26 20:17:42', '1', 'Mr.AG', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (28, 'serviceManager:btn_add', 'button', '新增', '/auth/service', '10', NULL, NULL, 'POST', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (29, 'serviceManager:btn_edit', 'button', '编辑', '/auth/service/{*}', '10', NULL, NULL, 'PUT', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (30, 'serviceManager:btn_del', 'button', '删除', '/auth/service/{*}', '10', NULL, NULL, 'DELETE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (31, 'serviceManager:btn_clientManager', 'button', '服务授权', '/auth/service/{*}/client', '10', NULL, NULL, 'POST', NULL, '2017-12-30 16:32:48', '1', 'Mr.AG', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (34, 'home', 'uri', '查看', 'home/', '16', NULL, NULL, 'GET', NULL, '2018-11-08 17:50:05', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (37, 'userManager:btn_add', 'button', '添加', '/user', '1', NULL, NULL, 'POST', '', '2020-12-03 13:23:40', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (38, 'userManager:btn_del', 'button', '删除', '/user/{*}', '1', NULL, NULL, 'DELETE', '', '2020-12-03 13:24:35', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (39, 'userManager:btn_edit', 'button', '修改', '/user/{*}', '1', NULL, NULL, 'PUT', '', '2020-12-03 13:35:36', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (42, 'groupManager:btn_del', 'button', '删除', '/group', '7', NULL, NULL, 'DELETE', '', '2020-12-03 13:48:03', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (41, 'groupManager:btn_add', 'button', '新增', '/group', '7', NULL, NULL, 'POST', '', '2020-12-03 13:47:29', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_element` VALUES (40, 'userManage:rest', 'button', '重置密码', '/user/password/{*}', '1', NULL, NULL, 'PUT', '', '2020-12-03 13:42:38', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for base_group +-- ---------------------------- +DROP TABLE IF EXISTS `base_group`; +CREATE TABLE `base_group` ( + `id` int NOT NULL AUTO_INCREMENT, + `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `parent_id` int NOT NULL, + `path` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `group_type` int NOT NULL, + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` timestamp NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_time` timestamp NULL DEFAULT NULL, + `upd_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id_13178352287356`(`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of base_group +-- ---------------------------- +INSERT INTO `base_group` VALUES (7, 'financeDepart', '财务部', 6, '/company/financeDepart', NULL, 2, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group` VALUES (8, 'hrDepart', '人力资源部', 6, '/company/hrDepart', NULL, 2, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group` VALUES (9, 'admin', '管理员', -1, NULL, NULL, 1, '管理员', '2020-09-16 16:52:18', '1', 'admin', '127.0.0.1', '2020-09-16 16:52:18', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group` VALUES (10, 'youke', '游客', -1, NULL, NULL, 1, 'aaa', '2020-10-26 16:10:37', '1', 'admin', '127.0.0.1', '2020-10-26 16:10:37', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for base_group_leader +-- ---------------------------- +DROP TABLE IF EXISTS `base_group_leader`; +CREATE TABLE `base_group_leader` ( + `id` int NOT NULL AUTO_INCREMENT, + `group_id` int NULL DEFAULT NULL, + `user_id` int NULL DEFAULT NULL, + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` timestamp NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_time` timestamp NULL DEFAULT NULL, + `upd_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id_13178357041319`(`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 39 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of base_group_leader +-- ---------------------------- +INSERT INTO `base_group_leader` VALUES (32, 4, 29, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_leader` VALUES (35, 3, 29, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_leader` VALUES (36, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_leader` VALUES (38, 9, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for base_group_member +-- ---------------------------- +DROP TABLE IF EXISTS `base_group_member`; +CREATE TABLE `base_group_member` ( + `id` int NOT NULL AUTO_INCREMENT, + `group_id` int NULL DEFAULT NULL, + `user_id` int NULL DEFAULT NULL, + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` timestamp NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_time` timestamp NULL DEFAULT NULL, + `upd_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id_13178361150862`(`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 63 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of base_group_member +-- ---------------------------- +INSERT INTO `base_group_member` VALUES (54, 4, 29, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_member` VALUES (57, 3, 29, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_member` VALUES (58, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_member` VALUES (59, 1, 4, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_member` VALUES (60, 1, 29, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_member` VALUES (62, 9, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for base_group_type +-- ---------------------------- +DROP TABLE IF EXISTS `base_group_type`; +CREATE TABLE `base_group_type` ( + `id` int NOT NULL AUTO_INCREMENT, + `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` timestamp NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_time` timestamp NULL DEFAULT NULL, + `upd_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id_13178366074910`(`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of base_group_type +-- ---------------------------- +INSERT INTO `base_group_type` VALUES (1, 'role', '角色类型', 'role', NULL, NULL, NULL, NULL, '2017-08-25 17:52:37', '1', 'Mr.AG', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_type` VALUES (2, 'depart', '部门类型', '部门类型', NULL, NULL, NULL, NULL, '2020-08-01 19:25:34', '1', 'Mr.AG', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_group_type` VALUES (3, 'freeaa', '自定义类型', 'sadf', NULL, NULL, NULL, NULL, '2020-12-03 19:57:40', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for base_menu +-- ---------------------------- +DROP TABLE IF EXISTS `base_menu`; +CREATE TABLE `base_menu` ( + `id` int NOT NULL AUTO_INCREMENT, + `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `parent_id` int NOT NULL, + `href` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `type` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `order_num` int NOT NULL DEFAULT 0, + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `path` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `enabled` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` timestamp NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_time` timestamp NULL DEFAULT NULL, + `upd_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id_13178377753991`(`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 50 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of base_menu +-- ---------------------------- +INSERT INTO `base_menu` VALUES (1, 'userManager', '用户管理', 5, 'com.fx.client.gui.uicomponents.admin.user.UserManagementController', 'yonghuguanli_huaban', 'menu', 11, 'aaaa', '/adminSys/baseManager/userManager', NULL, '2020-12-03 13:43:21', '1', 'admin', '127.0.0.1', '2020-12-03 13:43:21', '1', 'admin', '127.0.0.1', 'admin/user/index', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (5, 'baseManager', '基础配置管理', 13, '/admin', 'jichupeizhi', 'dirt', 4, '', '/adminSys/baseManager', NULL, '2021-01-14 16:29:13', '1', 'admin', '127.0.0.1', '2021-01-14 16:29:13', '1', 'admin', '127.0.0.1', 'Layout', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (6, 'menuManager', '菜单管理', 5, 'com.fx.client.gui.uicomponents.admin.menu.MenuManagementController', 'jiaoyixulie', 'menu', 12, '你大爷', '/adminSys/baseManager/menuManager', NULL, '2020-09-18 16:53:22', '1', 'admin', '127.0.0.1', '2020-09-18 16:53:22', '1', 'admin', '127.0.0.1', 'admin/menu/index', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (7, 'groupManager', '角色权限管理', 5, 'com.fx.client.gui.uicomponents.admin.group.GroupManagementController', 'gongnengjiaosequanxianguanli', 'menu', 13, '', '/adminSys/baseManager/groupManager', NULL, '2020-08-20 15:45:42', '1', 'admin', '127.0.0.1', '2020-08-20 15:45:42', '1', 'admin', '127.0.0.1', 'admin/group/index', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (8, 'groupTypeManager', '角色类型管理', 5, 'com.fx.client.gui.uicomponents.admin.grouptype.GroupTypeManagementController', 'jiaoseleixing', 'menu', 14, '', '/adminSys/baseManager/groupTypeManager', NULL, '2020-08-20 15:45:49', '1', 'admin', '127.0.0.1', '2020-08-20 15:45:49', '1', 'admin', '127.0.0.1', 'admin/groupType/index', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (13, 'adminSys', '系统菜单', -1, '/base', 'align-justify', 'dirt', 0, '', '/adminSys', NULL, '2020-08-02 18:39:35', '1', 'admin', '127.0.0.1', '2020-08-02 18:39:35', '1', 'admin', '127.0.0.1', 'Layout', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (44, 'home', '主页', 13, 'com.fx.client.gui.uicomponents.home.HomeController', 'home-outline', NULL, 0, '', 'com.epri.fx.client.gui.uicomponents.home.HomeController', NULL, '2020-08-03 15:51:48', '1', 'admin', '127.0.0.1', '2020-08-03 15:51:48', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (45, 'baseInfo', '基础信息录入', 13, '', 'jichuxinxi', NULL, 1, '基础信息录入', NULL, NULL, '2020-10-14 17:20:25', '1', 'admin', '127.0.0.1', '2020-10-14 17:20:25', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (46, 'base', '基础参数', 45, 'com.fx.client.gui.uicomponents.basicInfo.BasicDataSetController', 'jichucanshu', NULL, 0, '', NULL, NULL, '2020-10-14 17:20:04', '1', 'admin', '127.0.0.1', '2020-10-14 17:20:04', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (47, '', '煤价差', 45, 'com.fx.client.gui.uicomponents.basicInfo.CoalPriceDiffController', 'Energy-', NULL, 1, '', NULL, NULL, '2020-10-14 17:19:47', '1', 'admin', '127.0.0.1', '2020-10-14 17:19:47', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (48, '', '铁路成本', 45, 'com.fx.client.gui.uicomponents.basicInfo.RailwayCostController', 'tieluyunshu', NULL, 2, '', NULL, NULL, '2020-10-14 17:20:41', '1', 'admin', '127.0.0.1', '2020-10-14 17:20:41', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (49, '', '现行运价', 45, 'com.fx.client.gui.uicomponents.basicInfo.CurrentFreightController', 'hangzheng', NULL, 3, '', NULL, NULL, '2020-10-14 17:21:09', '1', 'admin', '127.0.0.1', '2020-10-14 17:21:09', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (50, 'Systemmonitoring', '系统监控', 13, '', 'jiankong', NULL, 2, '', NULL, NULL, '2021-01-14 16:29:04', '1', 'admin', '127.0.0.1', '2021-01-14 16:29:04', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (51, 'log', '日志管理', 13, '', 'rizhiguanli', NULL, 3, '', NULL, NULL, '2021-01-14 16:29:09', '1', 'admin', '127.0.0.1', '2021-01-14 16:29:09', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (52, 'online_user', '在线用户', 50, 'com.fx.client.gui.uicomponents.monitor.onlineuser.OnlineUserController', 'ic_user_zx', NULL, 0, '', NULL, NULL, '2021-01-14 16:29:57', '1', 'admin', '127.0.0.1', '2021-01-14 16:29:57', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (53, 'job', '定时任务', 50, 'com.fx.client.gui.uicomponents.monitor.quartz.SysJobController', 'time', NULL, 1, '', NULL, NULL, '2021-01-14 16:30:45', '1', 'admin', '127.0.0.1', '2021-01-14 16:30:45', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (54, 'login_log', '登录日志', 51, 'com.fx.client.gui.uicomponents.admin.logManagement.LoginLogController', 'denglurizhi', NULL, 1, '', NULL, NULL, '2021-01-14 16:31:29', '1', 'admin', '127.0.0.1', '2021-01-14 16:31:29', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_menu` VALUES (55, 'opt_log', '操作日志', 51, 'com.fx.client.gui.uicomponents.admin.logManagement.OperationLogController', 'caozuorizhi', NULL, 0, '', NULL, NULL, '2021-01-14 16:32:07', '1', 'admin', '127.0.0.1', '2021-01-14 16:32:07', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for base_resource_authority +-- ---------------------------- +DROP TABLE IF EXISTS `base_resource_authority`; +CREATE TABLE `base_resource_authority` ( + `id` int NOT NULL AUTO_INCREMENT, + `authority_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `authority_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `resource_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `resource_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `parent_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `path` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` timestamp NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id_13178383042404`(`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 2516 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of base_resource_authority +-- ---------------------------- +INSERT INTO `base_resource_authority` VALUES (2165, '1', 'group', '1', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2166, '1', 'group', '5', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2167, '1', 'group', '4', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2168, '1', 'group', '5', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2169, '1', 'group', '6', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2170, '1', 'group', '7', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2171, '1', 'group', '8', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2172, '1', 'group', '9', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2173, '1', 'group', '10', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2174, '1', 'group', '19', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2175, '1', 'group', '20', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2176, '1', 'group', '6', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2177, '1', 'group', '11', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2178, '1', 'group', '12', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2179, '1', 'group', '13', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2180, '1', 'group', '14', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2181, '1', 'group', '15', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2182, '1', 'group', '16', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2183, '1', 'group', '17', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2184, '1', 'group', '21', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2185, '1', 'group', '26', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2186, '1', 'group', '7', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2187, '1', 'group', '22', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2188, '1', 'group', '23', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2189, '1', 'group', '24', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2190, '1', 'group', '25', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2191, '1', 'group', '8', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2193, '1', 'group', '44', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2545, '9', 'group', '45', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2544, '9', 'group', '44', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2542, '9', 'group', '8', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2541, '9', 'group', '25', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2540, '9', 'group', '24', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2539, '9', 'group', '23', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2538, '9', 'group', '22', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2537, '9', 'group', '7', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2536, '9', 'group', '41', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2535, '9', 'group', '42', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2534, '9', 'group', '15', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2533, '9', 'group', '14', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2532, '9', 'group', '12', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2531, '9', 'group', '6', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2530, '9', 'group', '20', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2529, '9', 'group', '19', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2528, '9', 'group', '10', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2527, '9', 'group', '9', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2526, '9', 'group', '8', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2525, '9', 'group', '7', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2524, '9', 'group', '6', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2523, '9', 'group', '5', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2522, '9', 'group', '4', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2521, '9', 'group', '5', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2520, '9', 'group', '1', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2519, '9', 'group', '40', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2518, '9', 'group', '39', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2517, '9', 'group', '38', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2516, '9', 'group', '37', 'button', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2546, '9', 'group', '46', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2547, '9', 'group', '47', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2548, '9', 'group', '48', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2549, '9', 'group', '49', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2550, '9', 'group', '50', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2551, '9', 'group', '51', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2552, '9', 'group', '52', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2553, '9', 'group', '53', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2554, '9', 'group', '54', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_resource_authority` VALUES (2555, '9', 'group', '55', 'menu', '-1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for base_rsa_key +-- ---------------------------- +DROP TABLE IF EXISTS `base_rsa_key`; +CREATE TABLE `base_rsa_key` ( + `rsa_key` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `key_value` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`rsa_key`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of base_rsa_key +-- ---------------------------- +INSERT INTO `base_rsa_key` VALUES ('IPSM:AUTH:JWT:PRI', 'MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIaPvusxk+x8KcVONjFUo+ursfLx\nSwOIvci5q0xPa+nUm3C0uu3jX1RQP+s3hWqCb7KgR67HDcZUS8bn2pNzJJWJ352lrpVrb1wftOot\nmrWPhnrdr9sdcgE2pLV8HAy18pq+agXmjWnkf+T558zo5k3I8VBVcTfzsL6HLc5mFt/dAgMBAAEC\ngYAYkZpsWwsFPM5rphIjA69CUoEVOJVXudndEnmCX2X2tckD1RvkX4WCYXyqN+L2RYabeMRd1x5e\nvflwAdlY3sco+otA0Ld9vP9yadlbfjuxzA8XyuvomaZPeJjMxL3dZnEvy29SMkNx3358ILp3BwGg\ne16GYPNZAjbB9fF+9YcggQJBAMs67m65cu2/h9Fe8+kevU32VVF6WZ3+506tYJFmsEbNILp+HFMK\nyp/OXX5DIMJIVA5f9ZYzG9GIgyaNMaKaFlECQQCpgEkflrwhwMkyOqJ0bJDB6GDk6iql2onR4bzF\n2sExbwYh5FjKdSQay+UIvrxLDvJOHyiySKL3rHxQggrgtbHNAkBVfQSvLvNZbygCup5/gZ7AHM7m\n50CrZX6HagclIr0kC0WpLUNc6z0w2+4YHsS49RPmuBbmh7k7+uCwZtRqQccBAkAeFunkM6v+Ce0t\nf38rT8J6ybe5q2AaxSrGGV6bePPmxKDAD3s7pYPdRejInqNqZ6LX/2wICiDz+qiu2gb4UQjZAkAx\nRtRw7QzNu/5aLnU5pxdD33lE+fubQSkq17y3JfeLO2/HsIl0BnKUQGg4TaKpYOaEoHZpgyd2pwlm\nUuNuRalU\n'); +INSERT INTO `base_rsa_key` VALUES ('IPSM:AUTH:JWT:PUB', 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGj77rMZPsfCnFTjYxVKPrq7Hy8UsDiL3IuatM\nT2vp1JtwtLrt419UUD/rN4Vqgm+yoEeuxw3GVEvG59qTcySVid+dpa6Va29cH7TqLZq1j4Z63a/b\nHXIBNqS1fBwMtfKavmoF5o1p5H/k+efM6OZNyPFQVXE387C+hy3OZhbf3QIDAQAB\n'); + +-- ---------------------------- +-- Table structure for base_user +-- ---------------------------- +DROP TABLE IF EXISTS `base_user`; +CREATE TABLE `base_user` ( + `id` int NOT NULL AUTO_INCREMENT, + `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `birthday` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `mobile_phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `tel_phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` datetime NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_time` datetime NULL DEFAULT NULL, + `upd_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `upd_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `attr8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of base_user +-- ---------------------------- +INSERT INTO `base_user` VALUES (1, 'admin', '$2a$12$/Xa6YcdVm387zA.EE/6xce11UX.AZBiwerBztXLAVBMhVKQ/pZfNW', 'liwen', '', NULL, '', NULL, '', '男', NULL, NULL, '', '2020-12-03 17:19:07', '1', 'admin', '127.0.0.1', '2020-12-03 17:19:07', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_user` VALUES (4, 'blog', '$2a$12$qWkIM1ZwBhzfs6eHgu6yFOeZB0Rtklt/MlzTg/YkagS19k8EmeV2C', 'Mr.Liwen(博主)', '', NULL, '', NULL, '', '女', NULL, NULL, '12', '2020-12-03 19:56:04', '1', 'admin', '127.0.0.1', '2020-12-03 19:56:36', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `base_user` VALUES (30, 'liwen', '$2a$12$TsY.B4VLwtuIfGSTIpWjHu3tiuwjmVoFoqYTbJv7f/193kdCCRIXO', 'liwen', NULL, NULL, NULL, NULL, NULL, '男', NULL, NULL, 'admin', '2020-11-25 02:37:33', '1', 'admin', '127.0.0.1', '2020-12-03 13:42:11', '1', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for gate_log +-- ---------------------------- +DROP TABLE IF EXISTS `gate_log`; +CREATE TABLE `gate_log` ( + `id` int NOT NULL AUTO_INCREMENT, + `menu` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `opt` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `uri` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_time` timestamp NULL DEFAULT NULL, + `crt_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `crt_host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `body` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id_13178398875749`(`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 107 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of gate_log +-- ---------------------------- +INSERT INTO `gate_log` VALUES (102, '用户管理', '修改', '/user/{*}', '2020-12-03 19:56:04', '1', 'liwen', '127.0.0.1', '{ \"id\" : 4, \"username\" : \"blog\", \"name\" : \"Mr.Liwen(博主)\", \"sex\" : \"女\", \"description\" : \"12\"}'); +INSERT INTO `gate_log` VALUES (103, '用户管理', '重置密码', '/user/password/{*}', '2020-12-03 19:56:36', '1', 'liwen', '127.0.0.1', ''); +INSERT INTO `gate_log` VALUES (104, '角色权限管理', '分配权限', '/group/{*}/authority/menu', '2020-12-03 19:57:06', '1', 'liwen', '127.0.0.1', '[ { \"id\" : 1, \"code\" : \"userManager\", \"title\" : \"用户管理\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.user.UserManagementController\", \"icon\" : \"yonghuguanli_huaban\", \"type\" : \"menu\", \"orderNum\" : 11, \"description\" : \"aaaa\", \"path\" : \"/adminSys/baseManager/userManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 37, \"code\" : \"userManager:btn_add\", \"type\" : \"button\", \"name\" : \"添加\", \"uri\" : \"/user\", \"menuId\" : \"1\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 38, \"code\" : \"userManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/user/{*}\", \"menuId\" : \"1\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 39, \"code\" : \"userManager:btn_edit\", \"type\" : \"button\", \"name\" : \"修改\", \"uri\" : \"/user/{*}\", \"menuId\" : \"1\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 40, \"code\" : \"userManage:rest\", \"type\" : \"button\", \"name\" : \"重置密码\", \"uri\" : \"/user/password/{*}\", \"menuId\" : \"1\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true } ]}, { \"id\" : 5, \"code\" : \"baseManager\", \"title\" : \"基础配置管理\", \"parentId\" : 13, \"href\" : \"/admin\", \"icon\" : \"jichupeizhi\", \"type\" : \"dirt\", \"orderNum\" : 2, \"description\" : \"\", \"path\" : \"/adminSys/baseManager\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 6, \"code\" : \"menuManager\", \"title\" : \"菜单管理\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.menu.MenuManagementController\", \"icon\" : \"jiaoyixulie\", \"type\" : \"menu\", \"orderNum\" : 12, \"description\" : \"你大爷\", \"path\" : \"/adminSys/baseManager/menuManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 4, \"code\" : \"menuManager:element\", \"type\" : \"uri\", \"name\" : \"按钮页面\", \"uri\" : \"/admin/element\", \"menuId\" : \"6\", \"method\" : \"GET\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 5, \"code\" : \"menuManager:btn_add\", \"type\" : \"button\", \"name\" : \"新增\", \"uri\" : \"/menu/{*}\", \"menuId\" : \"6\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 6, \"code\" : \"menuManager:btn_edit\", \"type\" : \"button\", \"name\" : \"编辑\", \"uri\" : \"/menu\", \"menuId\" : \"6\", \"parentId\" : \"\", \"path\" : \"\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 7, \"code\" : \"menuManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/menu/{*}\", \"menuId\" : \"6\", \"parentId\" : \"\", \"path\" : \"\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 8, \"code\" : \"menuManager:btn_element_add\", \"type\" : \"button\", \"name\" : \"新增元素\", \"uri\" : \"/element\", \"menuId\" : \"6\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 9, \"code\" : \"menuManager:btn_element_edit\", \"type\" : \"button\", \"name\" : \"编辑元素\", \"uri\" : \"/element\", \"menuId\" : \"6\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 10, \"code\" : \"menuManager:btn_element_del\", \"type\" : \"button\", \"name\" : \"删除元素\", \"uri\" : \"/element/{*}\", \"menuId\" : \"6\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 19, \"code\" : \"menuManager:view\", \"type\" : \"uri\", \"name\" : \"查看\", \"uri\" : \"/admin/menu/{*}\", \"menuId\" : \"6\", \"parentId\" : \"\", \"path\" : \"\", \"method\" : \"GET\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 20, \"code\" : \"menuManager:element_view\", \"type\" : \"uri\", \"name\" : \"查看\", \"uri\" : \"/admin/element/{*}\", \"menuId\" : \"6\", \"method\" : \"GET\", \"sel\" : true } ]}, { \"id\" : 7, \"code\" : \"groupManager\", \"title\" : \"角色权限管理\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.group.GroupManagementController\", \"icon\" : \"gongnengjiaosequanxianguanli\", \"type\" : \"menu\", \"orderNum\" : 13, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/groupManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 12, \"code\" : \"groupManager:btn_edit\", \"type\" : \"button\", \"name\" : \"编辑\", \"uri\" : \"/group\", \"menuId\" : \"7\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 14, \"code\" : \"groupManager:btn_userManager\", \"type\" : \"button\", \"name\" : \"分配用户\", \"uri\" : \"/group/{*}/user\", \"menuId\" : \"7\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 15, \"code\" : \"groupManager:btn_resourceManager\", \"type\" : \"button\", \"name\" : \"分配权限\", \"uri\" : \"/group/{*}/authority/menu\", \"menuId\" : \"7\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 42, \"code\" : \"groupManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/group\", \"menuId\" : \"7\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 41, \"code\" : \"groupManager:btn_add\", \"type\" : \"button\", \"name\" : \"新增\", \"uri\" : \"/group\", \"menuId\" : \"7\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true } ]}, { \"id\" : 8, \"code\" : \"groupTypeManager\", \"title\" : \"角色类型管理\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.grouptype.GroupTypeManagementController\", \"icon\" : \"jiaoseleixing\", \"type\" : \"menu\", \"orderNum\" : 14, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/groupTypeManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 22, \"code\" : \"groupTypeManager:view\", \"type\" : \"uri\", \"name\" : \"查看\", \"uri\" : \"/admin/groupType/{*}\", \"menuId\" : \"8\", \"method\" : \"GET\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 23, \"code\" : \"groupTypeManager:btn_add\", \"type\" : \"button\", \"name\" : \"新增\", \"uri\" : \"/groupType\", \"menuId\" : \"8\", \"method\" : \"POST\", \"sel\" : true }, { \"id\" : 24, \"code\" : \"groupTypeManager:btn_edit\", \"type\" : \"button\", \"name\" : \"编辑\", \"uri\" : \"/groupType\", \"menuId\" : \"8\", \"method\" : \"PUT\", \"sel\" : true }, { \"id\" : 25, \"code\" : \"groupTypeManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/groupType/{*}\", \"menuId\" : \"8\", \"method\" : \"DELETE\", \"sel\" : true } ]}, { \"id\" : 27, \"code\" : \"gateLogManager\", \"title\" : \"操作日志\", \"parentId\" : 5, \"href\" : \"/admin/gateLog\", \"icon\" : \"caozuorizhi\", \"type\" : \"menu\", \"orderNum\" : 15, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/gateLogManager\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 44, \"code\" : \"home\", \"title\" : \"主页\", \"parentId\" : 13, \"href\" : \"com.epri.fx.client.gui.uicomponents.home.HomeController\", \"icon\" : \"home-outline\", \"orderNum\" : 0, \"description\" : \"\", \"path\" : \"com.epri.fx.client.gui.uicomponents.home.HomeController\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 45, \"code\" : \"baseInfo\", \"title\" : \"基础信息录入\", \"parentId\" : 13, \"href\" : \"\", \"icon\" : \"jichuxinxi\", \"orderNum\" : 1, \"description\" : \"基础信息录入\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 46, \"code\" : \"base\", \"title\" : \"基础参数\", \"parentId\" : 45, \"href\" : \"com.epri.fx.client.gui.uicomponents.basicInfo.BasicDataSetController\", \"icon\" : \"jichucanshu\", \"orderNum\" : 0, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 47, \"code\" : \"\", \"title\" : \"煤价差\", \"parentId\" : 45, \"href\" : \"com.epri.fx.client.gui.uicomponents.basicInfo.CoalPriceDiffController\", \"icon\" : \"Energy-\", \"orderNum\" : 1, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 48, \"code\" : \"\", \"title\" : \"铁路成本\", \"parentId\" : 45, \"href\" : \"com.epri.fx.client.gui.uicomponents.basicInfo.RailwayCostController\", \"icon\" : \"tieluyunshu\", \"orderNum\" : 2, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 49, \"code\" : \"\", \"title\" : \"现行运价\", \"parentId\" : 45, \"href\" : \"com.epri.fx.client.gui.uicomponents.basicInfo.CurrentFreightController\", \"icon\" : \"hangzheng\", \"orderNum\" : 3, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]} ]'); +INSERT INTO `gate_log` VALUES (101, '用户管理', '修改', '/user/{*}', '2020-12-03 17:19:07', '1', 'liwen', '127.0.0.1', '{ \"id\" : 1, \"username\" : \"admin\", \"name\" : \"liwen\", \"sex\" : \"男\", \"description\" : \"\"}'); +INSERT INTO `gate_log` VALUES (105, '角色类型管理', '编辑', '/groupType', '2020-12-03 19:57:40', '1', 'liwen', '127.0.0.1', '{ \"id\" : 3, \"code\" : \"freeaa\", \"name\" : \"自定义类型\", \"description\" : \"sadf\"}'); +INSERT INTO `gate_log` VALUES (106, '菜单管理', '编辑', '/menu', '2020-12-04 10:30:20', '1', 'liwen', '127.0.0.1', '{ \"id\" : 27, \"code\" : \"gateLogManager\", \"title\" : \"操作日志\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.log.LogManagementController\", \"icon\" : \"caozuorizhi\", \"type\" : \"menu\", \"orderNum\" : 15, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/gateLogManager\", \"sel\" : false, \"elementVOS\" : [ ]}'); +INSERT INTO `gate_log` VALUES (107, '菜单管理', '编辑', '/menu', '2021-01-14 16:29:04', '1', 'liwen', '127.0.0.1', '{ \"id\" : 50, \"code\" : \"Systemmonitoring\", \"title\" : \"系统监控\", \"parentId\" : 13, \"href\" : \"\", \"icon\" : \"jiankong\", \"orderNum\" : 2, \"description\" : \"\", \"sel\" : false, \"elementVOS\" : [ ]}'); +INSERT INTO `gate_log` VALUES (108, '菜单管理', '编辑', '/menu', '2021-01-14 16:29:09', '1', 'liwen', '127.0.0.1', '{ \"id\" : 51, \"code\" : \"log\", \"title\" : \"日志管理\", \"parentId\" : 13, \"href\" : \"\", \"icon\" : \"rizhiguanli\", \"orderNum\" : 3, \"description\" : \"\", \"sel\" : false, \"elementVOS\" : [ ]}'); +INSERT INTO `gate_log` VALUES (109, '菜单管理', '编辑', '/menu', '2021-01-14 16:29:13', '1', 'liwen', '127.0.0.1', '{ \"id\" : 5, \"code\" : \"baseManager\", \"title\" : \"基础配置管理\", \"parentId\" : 13, \"href\" : \"/admin\", \"icon\" : \"jichupeizhi\", \"type\" : \"dirt\", \"orderNum\" : 4, \"description\" : \"\", \"path\" : \"/adminSys/baseManager\", \"sel\" : false, \"elementVOS\" : [ ]}'); +INSERT INTO `gate_log` VALUES (110, '菜单管理', '编辑', '/menu', '2021-01-14 16:30:45', '1', 'liwen', '127.0.0.1', '{ \"id\" : 53, \"code\" : \"job\", \"title\" : \"定时任务\", \"parentId\" : 50, \"href\" : \"com.fx.client.gui.uicomponents.monitor.quartz.SysJobController\", \"icon\" : \"time\", \"orderNum\" : 1, \"description\" : \"\", \"sel\" : false, \"elementVOS\" : [ ]}'); +INSERT INTO `gate_log` VALUES (111, '角色权限管理', '分配权限', '/group/{*}/authority/menu', '2021-01-14 16:32:32', '1', 'liwen', '127.0.0.1', '[ { \"id\" : 1, \"code\" : \"userManager\", \"title\" : \"用户管理\", \"parentId\" : 5, \"href\" : \"com.fx.client.gui.uicomponents.admin.user.UserManagementController\", \"icon\" : \"yonghuguanli_huaban\", \"type\" : \"menu\", \"orderNum\" : 11, \"description\" : \"aaaa\", \"path\" : \"/adminSys/baseManager/userManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 37, \"code\" : \"userManager:btn_add\", \"type\" : \"button\", \"name\" : \"添加\", \"uri\" : \"/user\", \"menuId\" : \"1\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 38, \"code\" : \"userManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/user/{*}\", \"menuId\" : \"1\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 39, \"code\" : \"userManager:btn_edit\", \"type\" : \"button\", \"name\" : \"修改\", \"uri\" : \"/user/{*}\", \"menuId\" : \"1\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 40, \"code\" : \"userManage:rest\", \"type\" : \"button\", \"name\" : \"重置密码\", \"uri\" : \"/user/password/{*}\", \"menuId\" : \"1\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true } ]}, { \"id\" : 5, \"code\" : \"baseManager\", \"title\" : \"基础配置管理\", \"parentId\" : 13, \"href\" : \"/admin\", \"icon\" : \"jichupeizhi\", \"type\" : \"dirt\", \"orderNum\" : 4, \"description\" : \"\", \"path\" : \"/adminSys/baseManager\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 6, \"code\" : \"menuManager\", \"title\" : \"菜单管理\", \"parentId\" : 5, \"href\" : \"com.fx.client.gui.uicomponents.admin.menu.MenuManagementController\", \"icon\" : \"jiaoyixulie\", \"type\" : \"menu\", \"orderNum\" : 12, \"description\" : \"你大爷\", \"path\" : \"/adminSys/baseManager/menuManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 4, \"code\" : \"menuManager:element\", \"type\" : \"uri\", \"name\" : \"按钮页面\", \"uri\" : \"/admin/element\", \"menuId\" : \"6\", \"method\" : \"GET\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 5, \"code\" : \"menuManager:btn_add\", \"type\" : \"button\", \"name\" : \"新增\", \"uri\" : \"/menu/{*}\", \"menuId\" : \"6\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 6, \"code\" : \"menuManager:btn_edit\", \"type\" : \"button\", \"name\" : \"编辑\", \"uri\" : \"/menu\", \"menuId\" : \"6\", \"parentId\" : \"\", \"path\" : \"\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 7, \"code\" : \"menuManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/menu/{*}\", \"menuId\" : \"6\", \"parentId\" : \"\", \"path\" : \"\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 8, \"code\" : \"menuManager:btn_element_add\", \"type\" : \"button\", \"name\" : \"新增元素\", \"uri\" : \"/element\", \"menuId\" : \"6\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 9, \"code\" : \"menuManager:btn_element_edit\", \"type\" : \"button\", \"name\" : \"编辑元素\", \"uri\" : \"/element\", \"menuId\" : \"6\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 10, \"code\" : \"menuManager:btn_element_del\", \"type\" : \"button\", \"name\" : \"删除元素\", \"uri\" : \"/element/{*}\", \"menuId\" : \"6\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 19, \"code\" : \"menuManager:view\", \"type\" : \"uri\", \"name\" : \"查看\", \"uri\" : \"/admin/menu/{*}\", \"menuId\" : \"6\", \"parentId\" : \"\", \"path\" : \"\", \"method\" : \"GET\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 20, \"code\" : \"menuManager:element_view\", \"type\" : \"uri\", \"name\" : \"查看\", \"uri\" : \"/admin/element/{*}\", \"menuId\" : \"6\", \"method\" : \"GET\", \"sel\" : true } ]}, { \"id\" : 7, \"code\" : \"groupManager\", \"title\" : \"角色权限管理\", \"parentId\" : 5, \"href\" : \"com.fx.client.gui.uicomponents.admin.group.GroupManagementController\", \"icon\" : \"gongnengjiaosequanxianguanli\", \"type\" : \"menu\", \"orderNum\" : 13, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/groupManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 12, \"code\" : \"groupManager:btn_edit\", \"type\" : \"button\", \"name\" : \"编辑\", \"uri\" : \"/group\", \"menuId\" : \"7\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 14, \"code\" : \"groupManager:btn_userManager\", \"type\" : \"button\", \"name\" : \"分配用户\", \"uri\" : \"/group/{*}/user\", \"menuId\" : \"7\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 15, \"code\" : \"groupManager:btn_resourceManager\", \"type\" : \"button\", \"name\" : \"分配权限\", \"uri\" : \"/group/{*}/authority/menu\", \"menuId\" : \"7\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 42, \"code\" : \"groupManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/group\", \"menuId\" : \"7\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 41, \"code\" : \"groupManager:btn_add\", \"type\" : \"button\", \"name\" : \"新增\", \"uri\" : \"/group\", \"menuId\" : \"7\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true } ]}, { \"id\" : 8, \"code\" : \"groupTypeManager\", \"title\" : \"角色类型管理\", \"parentId\" : 5, \"href\" : \"com.fx.client.gui.uicomponents.admin.grouptype.GroupTypeManagementController\", \"icon\" : \"jiaoseleixing\", \"type\" : \"menu\", \"orderNum\" : 14, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/groupTypeManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 22, \"code\" : \"groupTypeManager:view\", \"type\" : \"uri\", \"name\" : \"查看\", \"uri\" : \"/admin/groupType/{*}\", \"menuId\" : \"8\", \"method\" : \"GET\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 23, \"code\" : \"groupTypeManager:btn_add\", \"type\" : \"button\", \"name\" : \"新增\", \"uri\" : \"/groupType\", \"menuId\" : \"8\", \"method\" : \"POST\", \"sel\" : true }, { \"id\" : 24, \"code\" : \"groupTypeManager:btn_edit\", \"type\" : \"button\", \"name\" : \"编辑\", \"uri\" : \"/groupType\", \"menuId\" : \"8\", \"method\" : \"PUT\", \"sel\" : true }, { \"id\" : 25, \"code\" : \"groupTypeManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/groupType/{*}\", \"menuId\" : \"8\", \"method\" : \"DELETE\", \"sel\" : true } ]}, { \"id\" : 27, \"code\" : \"gateLogManager\", \"title\" : \"操作日志\", \"parentId\" : 5, \"href\" : \"com.fx.client.gui.uicomponents.admin.log.LogManagementController\", \"icon\" : \"caozuorizhi\", \"type\" : \"menu\", \"orderNum\" : 15, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/gateLogManager\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 44, \"code\" : \"home\", \"title\" : \"主页\", \"parentId\" : 13, \"href\" : \"com.fx.client.gui.uicomponents.home.HomeController\", \"icon\" : \"home-outline\", \"orderNum\" : 0, \"description\" : \"\", \"path\" : \"com.epri.fx.client.gui.uicomponents.home.HomeController\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 45, \"code\" : \"baseInfo\", \"title\" : \"基础信息录入\", \"parentId\" : 13, \"href\" : \"\", \"icon\" : \"jichuxinxi\", \"orderNum\" : 1, \"description\" : \"基础信息录入\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 46, \"code\" : \"base\", \"title\" : \"基础参数\", \"parentId\" : 45, \"href\" : \"com.fx.client.gui.uicomponents.basicInfo.BasicDataSetController\", \"icon\" : \"jichucanshu\", \"orderNum\" : 0, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 47, \"code\" : \"\", \"title\" : \"煤价差\", \"parentId\" : 45, \"href\" : \"com.fx.client.gui.uicomponents.basicInfo.CoalPriceDiffController\", \"icon\" : \"Energy-\", \"orderNum\" : 1, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 48, \"code\" : \"\", \"title\" : \"铁路成本\", \"parentId\" : 45, \"href\" : \"com.fx.client.gui.uicomponents.basicInfo.RailwayCostController\", \"icon\" : \"tieluyunshu\", \"orderNum\" : 2, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 49, \"code\" : \"\", \"title\" : \"现行运价\", \"parentId\" : 45, \"href\" : \"com.fx.client.gui.uicomponents.basicInfo.CurrentFreightController\", \"icon\" : \"hangzheng\", \"orderNum\" : 3, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 50, \"code\" : \"Systemmonitoring\", \"title\" : \"系统监控\", \"parentId\" : 13, \"href\" : \"\", \"icon\" : \"jiankong\", \"orderNum\" : 2, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 51, \"code\" : \"log\", \"title\" : \"日志管理\", \"parentId\" : 13, \"href\" : \"\", \"icon\" : \"rizhiguanli\", \"orderNum\" : 3, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 52, \"code\" : \"online_user\", \"title\" : \"在线用户\", \"parentId\" : 50, \"href\" : \"com.fx.client.gui.uicomponents.monitor.onlineuser.OnlineUserController\", \"icon\" : \"ic_user_zx\", \"orderNum\" : 0, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 53, \"code\" : \"job\", \"title\" : \"定时任务\", \"parentId\" : 50, \"href\" : \"com.fx.client.gui.uicomponents.monitor.quartz.SysJobController\", \"icon\" : \"time\", \"orderNum\" : 1, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 54, \"code\" : \"login_log\", \"title\" : \"登录日志\", \"parentId\" : 51, \"href\" : \"com.fx.client.gui.uicomponents.admin.logManagement.LoginLogController\", \"icon\" : \"denglurizhi\", \"orderNum\" : 1, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 55, \"code\" : \"opt_log\", \"title\" : \"操作日志\", \"parentId\" : 51, \"href\" : \"com.fx.client.gui.uicomponents.admin.logManagement.OperationLogController\", \"icon\" : \"caozuorizhi\", \"orderNum\" : 0, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]} ]'); + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `BLOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `SCHED_NAME`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_blob_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_calendars +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_cron_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `ENTRY_ID` varchar(95) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `FIRED_TIME` bigint NOT NULL, + `SCHED_TIME` bigint NOT NULL, + `PRIORITY` int NOT NULL, + `STATE` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE, + INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE, + INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME`, `INSTANCE_NAME`, `REQUESTS_RECOVERY`) USING BTREE, + INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_fired_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `IS_DURABLE` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME`, `REQUESTS_RECOVERY`) USING BTREE, + INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_job_details +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `LOCK_NAME` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_locks +-- ---------------------------- +INSERT INTO `qrtz_locks` VALUES ('quartzScheduler', 'TRIGGER_ACCESS'); + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_paused_trigger_grps +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `LAST_CHECKIN_TIME` bigint NOT NULL, + `CHECKIN_INTERVAL` bigint NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_scheduler_state +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REPEAT_COUNT` bigint NOT NULL, + `REPEAT_INTERVAL` bigint NOT NULL, + `TIMES_TRIGGERED` bigint NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_simple_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `STR_PROP_1` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STR_PROP_2` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STR_PROP_3` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `INT_PROP_1` int NULL DEFAULT NULL, + `INT_PROP_2` int NULL DEFAULT NULL, + `LONG_PROP_1` bigint NULL DEFAULT NULL, + `LONG_PROP_2` bigint NULL DEFAULT NULL, + `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, + `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, + `BOOL_PROP_1` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `BOOL_PROP_2` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_simprop_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `NEXT_FIRE_TIME` bigint NULL DEFAULT NULL, + `PREV_FIRE_TIME` bigint NULL DEFAULT NULL, + `PRIORITY` int NULL DEFAULT NULL, + `TRIGGER_STATE` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `START_TIME` bigint NOT NULL, + `END_TIME` bigint NULL DEFAULT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `MISFIRE_INSTR` smallint NULL DEFAULT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_J`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_C`(`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE, + INDEX `IDX_QRTZ_T_G`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME`, `NEXT_FIRE_TIME`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME`, `TRIGGER_STATE`, `NEXT_FIRE_TIME`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_job_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job_log`; +CREATE TABLE `sys_job_log` ( + `job_log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务日志ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务组名', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调用目标字符串', + `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '日志信息', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)', + `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '异常信息', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`job_log_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1905 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '定时任务调度日志表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_job_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_logininfor +-- ---------------------------- +DROP TABLE IF EXISTS `sys_logininfor`; +CREATE TABLE `sys_logininfor` ( + `info_id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID', + `login_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '登录账号', + `ipaddr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作系统', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)', + `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '提示消息', + `login_time` datetime NULL DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`info_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 276 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统访问记录' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_logininfor +-- ---------------------------- +INSERT INTO `sys_logininfor` VALUES (276, 'admin', '/127.0.0.1:63620', '', '', '', '0', '登录成功!', '2021-01-14 16:36:30'); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/falsework-sever/sql/mysql/ipsm_dba.sql b/falsework-sever/sql/mysql/ipsm_dba.sql deleted file mode 100644 index 843022b..0000000 --- a/falsework-sever/sql/mysql/ipsm_dba.sql +++ /dev/null @@ -1,505 +0,0 @@ -/* -Navicat MySQL Data Transfer - -Source Server : localhost_3306 -Source Server Version : 80022 -Source Host : localhost:3306 -Source Database : ipsm_dba - -Target Server Type : MYSQL -Target Server Version : 80022 -File Encoding : 65001 - -Date: 2020-12-04 10:46:34 -*/ - -SET FOREIGN_KEY_CHECKS=0; - --- ---------------------------- --- Table structure for auth_client_service --- ---------------------------- -DROP TABLE IF EXISTS `auth_client_service`; -CREATE TABLE `auth_client_service` ( - `id` int NOT NULL AUTO_INCREMENT, - `service_id` varchar(255) DEFAULT NULL, - `client_id` varchar(255) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` timestamp NULL DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `id_13178295930045` (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=20 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of auth_client_service --- ---------------------------- -INSERT INTO `auth_client_service` VALUES ('1', '3', '1', null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `auth_client_service` VALUES ('2', '2', '1', null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `auth_client_service` VALUES ('3', '2', '3', null, '2017-12-31 08:58:03', 'null', 'null', 'null', null, null, null, null, null, null, null, null); -INSERT INTO `auth_client_service` VALUES ('16', '1', '7', null, '2018-11-15 19:50:50', '9', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `auth_client_service` VALUES ('17', '2', '7', null, '2018-11-15 19:50:50', '9', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `auth_client_service` VALUES ('18', '3', '7', null, '2018-11-15 19:50:50', '9', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `auth_client_service` VALUES ('19', '7', '7', null, '2018-11-15 19:50:50', '9', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); - --- ---------------------------- --- Table structure for base_element --- ---------------------------- -DROP TABLE IF EXISTS `base_element`; -CREATE TABLE `base_element` ( - `id` int NOT NULL AUTO_INCREMENT, - `code` varchar(255) DEFAULT NULL, - `type` varchar(255) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `uri` varchar(255) DEFAULT NULL, - `menu_id` varchar(255) DEFAULT NULL, - `parent_id` varchar(255) DEFAULT NULL, - `path` varchar(2000) DEFAULT NULL, - `method` varchar(10) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` timestamp NULL DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `id_13178345917581` (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of base_element --- ---------------------------- -INSERT INTO `base_element` VALUES ('4', 'menuManager:element', 'uri', '按钮页面', '/admin/element', '6', null, null, 'GET', '', null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('5', 'menuManager:btn_add', 'button', '新增', '/menu/{*}', '6', null, null, 'POST', '', '2020-12-03 13:25:44', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('6', 'menuManager:btn_edit', 'button', '编辑', '/menu', '6', '', '', 'PUT', '', '2020-12-03 13:26:03', '1', 'admin', '127.0.0.1', '', '', '', '', '', '', '', ''); -INSERT INTO `base_element` VALUES ('7', 'menuManager:btn_del', 'button', '删除', '/menu/{*}', '6', '', '', 'DELETE', '', '2020-12-03 13:26:12', '1', 'admin', '127.0.0.1', '', '', '', '', '', '', '', ''); -INSERT INTO `base_element` VALUES ('8', 'menuManager:btn_element_add', 'button', '新增元素', '/element', '6', null, null, 'POST', '', '2020-12-03 13:26:26', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('9', 'menuManager:btn_element_edit', 'button', '编辑元素', '/element', '6', null, null, 'PUT', '', '2020-12-03 13:26:37', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('10', 'menuManager:btn_element_del', 'button', '删除元素', '/element/{*}', '6', null, null, 'DELETE', '', '2020-12-03 13:26:43', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('12', 'groupManager:btn_edit', 'button', '编辑', '/group', '7', null, null, 'PUT', '', '2020-12-03 13:46:59', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('14', 'groupManager:btn_userManager', 'button', '分配用户', '/group/{*}/user', '7', null, null, 'PUT', '', '2020-12-03 13:26:58', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('15', 'groupManager:btn_resourceManager', 'button', '分配权限', '/group/{*}/authority/menu', '7', null, null, 'PUT', '', '2020-12-03 13:48:31', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('19', 'menuManager:view', 'uri', '查看', '/admin/menu/{*}', '6', '', '', 'GET', '', '2017-06-26 00:00:00', '', '', '', '', '', '', '', '', '', '', ''); -INSERT INTO `base_element` VALUES ('20', 'menuManager:element_view', 'uri', '查看', '/admin/element/{*}', '6', null, null, 'GET', null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('22', 'groupTypeManager:view', 'uri', '查看', '/admin/groupType/{*}', '8', null, null, 'GET', '', null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('23', 'groupTypeManager:btn_add', 'button', '新增', '/groupType', '8', null, null, 'POST', null, '2020-12-03 13:17:51', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('24', 'groupTypeManager:btn_edit', 'button', '编辑', '/groupType', '8', null, null, 'PUT', null, '2020-12-03 13:22:14', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('25', 'groupTypeManager:btn_del', 'button', '删除', '/groupType/{*}', '8', null, null, 'DELETE', null, '2020-12-03 13:18:12', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('27', 'serviceManager:view', 'URI', '查看', '/auth/service/{*}', '10', null, null, 'GET', null, '2017-12-26 20:17:42', '1', 'Mr.AG', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('28', 'serviceManager:btn_add', 'button', '新增', '/auth/service', '10', null, null, 'POST', null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('29', 'serviceManager:btn_edit', 'button', '编辑', '/auth/service/{*}', '10', null, null, 'PUT', null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('30', 'serviceManager:btn_del', 'button', '删除', '/auth/service/{*}', '10', null, null, 'DELETE', null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('31', 'serviceManager:btn_clientManager', 'button', '服务授权', '/auth/service/{*}/client', '10', null, null, 'POST', null, '2017-12-30 16:32:48', '1', 'Mr.AG', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('34', 'home', 'uri', '查看', 'home/', '16', null, null, 'GET', null, '2018-11-08 17:50:05', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('37', 'userManager:btn_add', 'button', '添加', '/user', '1', null, null, 'POST', '', '2020-12-03 13:23:40', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('38', 'userManager:btn_del', 'button', '删除', '/user/{*}', '1', null, null, 'DELETE', '', '2020-12-03 13:24:35', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('39', 'userManager:btn_edit', 'button', '修改', '/user/{*}', '1', null, null, 'PUT', '', '2020-12-03 13:35:36', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('42', 'groupManager:btn_del', 'button', '删除', '/group', '7', null, null, 'DELETE', '', '2020-12-03 13:48:03', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('41', 'groupManager:btn_add', 'button', '新增', '/group', '7', null, null, 'POST', '', '2020-12-03 13:47:29', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_element` VALUES ('40', 'userManage:rest', 'button', '重置密码', '/user/password/{*}', '1', null, null, 'PUT', '', '2020-12-03 13:42:38', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); - --- ---------------------------- --- Table structure for base_group --- ---------------------------- -DROP TABLE IF EXISTS `base_group`; -CREATE TABLE `base_group` ( - `id` int NOT NULL AUTO_INCREMENT, - `code` varchar(255) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `parent_id` int NOT NULL, - `path` varchar(2000) DEFAULT NULL, - `type` char(1) DEFAULT NULL, - `group_type` int NOT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` timestamp NULL DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` timestamp NULL DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `id_13178352287356` (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of base_group --- ---------------------------- -INSERT INTO `base_group` VALUES ('7', 'financeDepart', '财务部', '6', '/company/financeDepart', null, '2', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group` VALUES ('8', 'hrDepart', '人力资源部', '6', '/company/hrDepart', null, '2', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group` VALUES ('9', 'admin', '管理员', '-1', null, null, '1', '管理员', '2020-09-16 16:52:18', '1', 'admin', '127.0.0.1', '2020-09-16 16:52:18', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_group` VALUES ('10', 'youke', '游客', '-1', null, null, '1', 'aaa', '2020-10-26 16:10:37', '1', 'admin', '127.0.0.1', '2020-10-26 16:10:37', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); - --- ---------------------------- --- Table structure for base_group_leader --- ---------------------------- -DROP TABLE IF EXISTS `base_group_leader`; -CREATE TABLE `base_group_leader` ( - `id` int NOT NULL AUTO_INCREMENT, - `group_id` int DEFAULT NULL, - `user_id` int DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` timestamp NULL DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` timestamp NULL DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `id_13178357041319` (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of base_group_leader --- ---------------------------- -INSERT INTO `base_group_leader` VALUES ('32', '4', '29', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group_leader` VALUES ('35', '3', '29', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group_leader` VALUES ('36', '1', '1', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group_leader` VALUES ('38', '9', '1', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); - --- ---------------------------- --- Table structure for base_group_member --- ---------------------------- -DROP TABLE IF EXISTS `base_group_member`; -CREATE TABLE `base_group_member` ( - `id` int NOT NULL AUTO_INCREMENT, - `group_id` int DEFAULT NULL, - `user_id` int DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` timestamp NULL DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` timestamp NULL DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `id_13178361150862` (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of base_group_member --- ---------------------------- -INSERT INTO `base_group_member` VALUES ('54', '4', '29', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group_member` VALUES ('57', '3', '29', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group_member` VALUES ('58', '1', '1', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group_member` VALUES ('59', '1', '4', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group_member` VALUES ('60', '1', '29', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_group_member` VALUES ('62', '9', '1', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); - --- ---------------------------- --- Table structure for base_group_type --- ---------------------------- -DROP TABLE IF EXISTS `base_group_type`; -CREATE TABLE `base_group_type` ( - `id` int NOT NULL AUTO_INCREMENT, - `code` varchar(255) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` timestamp NULL DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` timestamp NULL DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `id_13178366074910` (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of base_group_type --- ---------------------------- -INSERT INTO `base_group_type` VALUES ('1', 'role', '角色类型', 'role', null, null, null, null, '2017-08-25 17:52:37', '1', 'Mr.AG', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_group_type` VALUES ('2', 'depart', '部门类型', '部门类型', null, null, null, null, '2020-08-01 19:25:34', '1', 'Mr.AG', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_group_type` VALUES ('3', 'freeaa', '自定义类型', 'sadf', null, null, null, null, '2020-12-03 19:57:40', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); - --- ---------------------------- --- Table structure for base_menu --- ---------------------------- -DROP TABLE IF EXISTS `base_menu`; -CREATE TABLE `base_menu` ( - `id` int NOT NULL AUTO_INCREMENT, - `code` varchar(255) DEFAULT NULL, - `title` varchar(255) DEFAULT NULL, - `parent_id` int NOT NULL, - `href` varchar(255) DEFAULT NULL, - `icon` varchar(255) DEFAULT NULL, - `type` char(10) DEFAULT NULL, - `order_num` int NOT NULL DEFAULT '0', - `description` varchar(255) DEFAULT NULL, - `path` varchar(500) DEFAULT NULL, - `enabled` char(1) DEFAULT NULL, - `crt_time` timestamp NULL DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` timestamp NULL DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `id_13178377753991` (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=50 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of base_menu --- ---------------------------- -INSERT INTO `base_menu` VALUES ('1', 'userManager', '用户管理', '5', 'com.epri.fx.client.gui.uicomponents.admin.user.UserManagementController', 'yonghuguanli_huaban', 'menu', '11', 'aaaa', '/adminSys/baseManager/userManager', null, '2020-12-03 13:43:21', '1', 'admin', '127.0.0.1', '2020-12-03 13:43:21', '1', 'admin', '127.0.0.1', 'admin/user/index', null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('5', 'baseManager', '基础配置管理', '13', '/admin', 'jichupeizhi', 'dirt', '2', '', '/adminSys/baseManager', null, '2020-10-14 16:15:25', '1', 'admin', '127.0.0.1', '2020-10-14 16:15:25', '1', 'admin', '127.0.0.1', 'Layout', null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('6', 'menuManager', '菜单管理', '5', 'com.epri.fx.client.gui.uicomponents.admin.menu.MenuManagementController', 'jiaoyixulie', 'menu', '12', '你大爷', '/adminSys/baseManager/menuManager', null, '2020-09-18 16:53:22', '1', 'admin', '127.0.0.1', '2020-09-18 16:53:22', '1', 'admin', '127.0.0.1', 'admin/menu/index', null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('7', 'groupManager', '角色权限管理', '5', 'com.epri.fx.client.gui.uicomponents.admin.group.GroupManagementController', 'gongnengjiaosequanxianguanli', 'menu', '13', '', '/adminSys/baseManager/groupManager', null, '2020-08-20 15:45:42', '1', 'admin', '127.0.0.1', '2020-08-20 15:45:42', '1', 'admin', '127.0.0.1', 'admin/group/index', null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('8', 'groupTypeManager', '角色类型管理', '5', 'com.epri.fx.client.gui.uicomponents.admin.grouptype.GroupTypeManagementController', 'jiaoseleixing', 'menu', '14', '', '/adminSys/baseManager/groupTypeManager', null, '2020-08-20 15:45:49', '1', 'admin', '127.0.0.1', '2020-08-20 15:45:49', '1', 'admin', '127.0.0.1', 'admin/groupType/index', null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('13', 'adminSys', '系统菜单', '-1', '/base', 'align-justify', 'dirt', '0', '', '/adminSys', null, '2020-08-02 18:39:35', '1', 'admin', '127.0.0.1', '2020-08-02 18:39:35', '1', 'admin', '127.0.0.1', 'Layout', null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('27', 'gateLogManager', '操作日志', '5', 'com.epri.fx.client.gui.uicomponents.admin.log.LogManagementController', 'caozuorizhi', 'menu', '15', '', '/adminSys/baseManager/gateLogManager', null, '2020-12-04 10:30:20', '1', 'admin', '127.0.0.1', '2020-12-04 10:30:20', '1', 'admin', '127.0.0.1', 'admin/gateLog/index', null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('44', 'home', '主页', '13', 'com.epri.fx.client.gui.uicomponents.home.HomeController', 'home-outline', null, '0', '', 'com.epri.fx.client.gui.uicomponents.home.HomeController', null, '2020-08-03 15:51:48', '1', 'admin', '127.0.0.1', '2020-08-03 15:51:48', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('45', 'baseInfo', '基础信息录入', '13', '', 'jichuxinxi', null, '1', '基础信息录入', null, null, '2020-10-14 17:20:25', '1', 'admin', '127.0.0.1', '2020-10-14 17:20:25', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('46', 'base', '基础参数', '45', 'com.epri.fx.client.gui.uicomponents.basicInfo.BasicDataSetController', 'jichucanshu', null, '0', '', null, null, '2020-10-14 17:20:04', '1', 'admin', '127.0.0.1', '2020-10-14 17:20:04', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('47', '', '煤价差', '45', 'com.epri.fx.client.gui.uicomponents.basicInfo.CoalPriceDiffController', 'Energy-', null, '1', '', null, null, '2020-10-14 17:19:47', '1', 'admin', '127.0.0.1', '2020-10-14 17:19:47', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('48', '', '铁路成本', '45', 'com.epri.fx.client.gui.uicomponents.basicInfo.RailwayCostController', 'tieluyunshu', null, '2', '', null, null, '2020-10-14 17:20:41', '1', 'admin', '127.0.0.1', '2020-10-14 17:20:41', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_menu` VALUES ('49', '', '现行运价', '45', 'com.epri.fx.client.gui.uicomponents.basicInfo.CurrentFreightController', 'hangzheng', null, '3', '', null, null, '2020-10-14 17:21:09', '1', 'admin', '127.0.0.1', '2020-10-14 17:21:09', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); - --- ---------------------------- --- Table structure for base_resource_authority --- ---------------------------- -DROP TABLE IF EXISTS `base_resource_authority`; -CREATE TABLE `base_resource_authority` ( - `id` int NOT NULL AUTO_INCREMENT, - `authority_id` varchar(255) DEFAULT NULL, - `authority_type` varchar(255) DEFAULT NULL, - `resource_id` varchar(255) DEFAULT NULL, - `resource_type` varchar(255) DEFAULT NULL, - `parent_id` varchar(255) DEFAULT NULL, - `path` varchar(2000) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` timestamp NULL DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `id_13178383042404` (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=2516 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of base_resource_authority --- ---------------------------- -INSERT INTO `base_resource_authority` VALUES ('2165', '1', 'group', '1', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2166', '1', 'group', '5', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2167', '1', 'group', '4', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2168', '1', 'group', '5', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2169', '1', 'group', '6', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2170', '1', 'group', '7', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2171', '1', 'group', '8', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2172', '1', 'group', '9', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2173', '1', 'group', '10', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2174', '1', 'group', '19', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2175', '1', 'group', '20', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2176', '1', 'group', '6', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2177', '1', 'group', '11', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2178', '1', 'group', '12', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2179', '1', 'group', '13', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2180', '1', 'group', '14', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2181', '1', 'group', '15', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2182', '1', 'group', '16', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2183', '1', 'group', '17', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2184', '1', 'group', '21', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2185', '1', 'group', '26', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2186', '1', 'group', '7', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2187', '1', 'group', '22', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2188', '1', 'group', '23', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2189', '1', 'group', '24', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2190', '1', 'group', '25', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2191', '1', 'group', '8', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2192', '1', 'group', '27', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2193', '1', 'group', '44', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2515', '9', 'group', '49', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2514', '9', 'group', '48', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2513', '9', 'group', '47', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2512', '9', 'group', '46', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2511', '9', 'group', '45', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2510', '9', 'group', '44', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2509', '9', 'group', '27', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2508', '9', 'group', '8', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2507', '9', 'group', '25', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2506', '9', 'group', '24', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2505', '9', 'group', '23', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2504', '9', 'group', '22', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2503', '9', 'group', '7', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2502', '9', 'group', '41', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2501', '9', 'group', '42', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2500', '9', 'group', '15', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2499', '9', 'group', '14', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2497', '9', 'group', '6', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2498', '9', 'group', '12', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2496', '9', 'group', '20', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2495', '9', 'group', '19', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2494', '9', 'group', '10', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2493', '9', 'group', '9', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2492', '9', 'group', '8', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2491', '9', 'group', '7', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2490', '9', 'group', '6', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2489', '9', 'group', '5', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2488', '9', 'group', '4', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2487', '9', 'group', '5', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2486', '9', 'group', '1', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2485', '9', 'group', '40', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2484', '9', 'group', '39', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2482', '9', 'group', '37', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -INSERT INTO `base_resource_authority` VALUES ('2483', '9', 'group', '38', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); - --- ---------------------------- --- Table structure for base_rsa_key --- ---------------------------- -DROP TABLE IF EXISTS `base_rsa_key`; -CREATE TABLE `base_rsa_key` ( - `rsa_key` varchar(200) NOT NULL, - `key_value` varchar(2000) NOT NULL, - PRIMARY KEY (`rsa_key`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of base_rsa_key --- ---------------------------- -INSERT INTO `base_rsa_key` VALUES ('IPSM:AUTH:JWT:PRI', 'MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIaPvusxk+x8KcVONjFUo+ursfLx\nSwOIvci5q0xPa+nUm3C0uu3jX1RQP+s3hWqCb7KgR67HDcZUS8bn2pNzJJWJ352lrpVrb1wftOot\nmrWPhnrdr9sdcgE2pLV8HAy18pq+agXmjWnkf+T558zo5k3I8VBVcTfzsL6HLc5mFt/dAgMBAAEC\ngYAYkZpsWwsFPM5rphIjA69CUoEVOJVXudndEnmCX2X2tckD1RvkX4WCYXyqN+L2RYabeMRd1x5e\nvflwAdlY3sco+otA0Ld9vP9yadlbfjuxzA8XyuvomaZPeJjMxL3dZnEvy29SMkNx3358ILp3BwGg\ne16GYPNZAjbB9fF+9YcggQJBAMs67m65cu2/h9Fe8+kevU32VVF6WZ3+506tYJFmsEbNILp+HFMK\nyp/OXX5DIMJIVA5f9ZYzG9GIgyaNMaKaFlECQQCpgEkflrwhwMkyOqJ0bJDB6GDk6iql2onR4bzF\n2sExbwYh5FjKdSQay+UIvrxLDvJOHyiySKL3rHxQggrgtbHNAkBVfQSvLvNZbygCup5/gZ7AHM7m\n50CrZX6HagclIr0kC0WpLUNc6z0w2+4YHsS49RPmuBbmh7k7+uCwZtRqQccBAkAeFunkM6v+Ce0t\nf38rT8J6ybe5q2AaxSrGGV6bePPmxKDAD3s7pYPdRejInqNqZ6LX/2wICiDz+qiu2gb4UQjZAkAx\nRtRw7QzNu/5aLnU5pxdD33lE+fubQSkq17y3JfeLO2/HsIl0BnKUQGg4TaKpYOaEoHZpgyd2pwlm\nUuNuRalU\n'); -INSERT INTO `base_rsa_key` VALUES ('IPSM:AUTH:JWT:PUB', 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGj77rMZPsfCnFTjYxVKPrq7Hy8UsDiL3IuatM\nT2vp1JtwtLrt419UUD/rN4Vqgm+yoEeuxw3GVEvG59qTcySVid+dpa6Va29cH7TqLZq1j4Z63a/b\nHXIBNqS1fBwMtfKavmoF5o1p5H/k+efM6OZNyPFQVXE387C+hy3OZhbf3QIDAQAB\n'); - --- ---------------------------- --- Table structure for base_user --- ---------------------------- -DROP TABLE IF EXISTS `base_user`; -CREATE TABLE `base_user` ( - `id` int NOT NULL AUTO_INCREMENT, - `username` varchar(255) DEFAULT NULL, - `password` varchar(255) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `birthday` varchar(255) DEFAULT NULL, - `address` varchar(255) DEFAULT NULL, - `mobile_phone` varchar(255) DEFAULT NULL, - `tel_phone` varchar(255) DEFAULT NULL, - `email` varchar(255) DEFAULT NULL, - `sex` char(1) DEFAULT NULL, - `type` char(1) DEFAULT NULL, - `status` char(1) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` datetime DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of base_user --- ---------------------------- -INSERT INTO `base_user` VALUES ('1', 'admin', '$2a$12$/Xa6YcdVm387zA.EE/6xce11UX.AZBiwerBztXLAVBMhVKQ/pZfNW', 'liwen', '', null, '', null, '', '男', null, null, '', '2020-12-03 17:19:07', '1', 'admin', '127.0.0.1', '2020-12-03 17:19:07', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_user` VALUES ('4', 'blog', '$2a$12$qWkIM1ZwBhzfs6eHgu6yFOeZB0Rtklt/MlzTg/YkagS19k8EmeV2C', 'Mr.Liwen(博主)', '', null, '', null, '', '女', null, null, '12', '2020-12-03 19:56:04', '1', 'admin', '127.0.0.1', '2020-12-03 19:56:36', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); -INSERT INTO `base_user` VALUES ('30', 'liwen', '$2a$12$TsY.B4VLwtuIfGSTIpWjHu3tiuwjmVoFoqYTbJv7f/193kdCCRIXO', 'liwen', null, null, null, null, null, '男', null, null, 'admin', '2020-11-25 02:37:33', '1', 'admin', '127.0.0.1', '2020-12-03 13:42:11', '1', 'admin', '127.0.0.1', null, null, null, null, null, null, null, null); - --- ---------------------------- --- Table structure for gate_log --- ---------------------------- -DROP TABLE IF EXISTS `gate_log`; -CREATE TABLE `gate_log` ( - `id` int NOT NULL AUTO_INCREMENT, - `menu` varchar(255) DEFAULT NULL, - `opt` varchar(255) DEFAULT NULL, - `uri` varchar(255) DEFAULT NULL, - `crt_time` timestamp NULL DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `body` text, - PRIMARY KEY (`id`), - UNIQUE KEY `id_13178398875749` (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=107 DEFAULT CHARSET=utf8; - --- ---------------------------- --- Records of gate_log --- ---------------------------- -INSERT INTO `gate_log` VALUES ('102', '用户管理', '修改', '/user/{*}', '2020-12-03 19:56:04', '1', 'liwen', '127.0.0.1', '{ \"id\" : 4, \"username\" : \"blog\", \"name\" : \"Mr.Liwen(博主)\", \"sex\" : \"女\", \"description\" : \"12\"}'); -INSERT INTO `gate_log` VALUES ('103', '用户管理', '重置密码', '/user/password/{*}', '2020-12-03 19:56:36', '1', 'liwen', '127.0.0.1', ''); -INSERT INTO `gate_log` VALUES ('104', '角色权限管理', '分配权限', '/group/{*}/authority/menu', '2020-12-03 19:57:06', '1', 'liwen', '127.0.0.1', '[ { \"id\" : 1, \"code\" : \"userManager\", \"title\" : \"用户管理\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.user.UserManagementController\", \"icon\" : \"yonghuguanli_huaban\", \"type\" : \"menu\", \"orderNum\" : 11, \"description\" : \"aaaa\", \"path\" : \"/adminSys/baseManager/userManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 37, \"code\" : \"userManager:btn_add\", \"type\" : \"button\", \"name\" : \"添加\", \"uri\" : \"/user\", \"menuId\" : \"1\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 38, \"code\" : \"userManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/user/{*}\", \"menuId\" : \"1\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 39, \"code\" : \"userManager:btn_edit\", \"type\" : \"button\", \"name\" : \"修改\", \"uri\" : \"/user/{*}\", \"menuId\" : \"1\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 40, \"code\" : \"userManage:rest\", \"type\" : \"button\", \"name\" : \"重置密码\", \"uri\" : \"/user/password/{*}\", \"menuId\" : \"1\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true } ]}, { \"id\" : 5, \"code\" : \"baseManager\", \"title\" : \"基础配置管理\", \"parentId\" : 13, \"href\" : \"/admin\", \"icon\" : \"jichupeizhi\", \"type\" : \"dirt\", \"orderNum\" : 2, \"description\" : \"\", \"path\" : \"/adminSys/baseManager\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 6, \"code\" : \"menuManager\", \"title\" : \"菜单管理\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.menu.MenuManagementController\", \"icon\" : \"jiaoyixulie\", \"type\" : \"menu\", \"orderNum\" : 12, \"description\" : \"你大爷\", \"path\" : \"/adminSys/baseManager/menuManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 4, \"code\" : \"menuManager:element\", \"type\" : \"uri\", \"name\" : \"按钮页面\", \"uri\" : \"/admin/element\", \"menuId\" : \"6\", \"method\" : \"GET\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 5, \"code\" : \"menuManager:btn_add\", \"type\" : \"button\", \"name\" : \"新增\", \"uri\" : \"/menu/{*}\", \"menuId\" : \"6\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 6, \"code\" : \"menuManager:btn_edit\", \"type\" : \"button\", \"name\" : \"编辑\", \"uri\" : \"/menu\", \"menuId\" : \"6\", \"parentId\" : \"\", \"path\" : \"\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 7, \"code\" : \"menuManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/menu/{*}\", \"menuId\" : \"6\", \"parentId\" : \"\", \"path\" : \"\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 8, \"code\" : \"menuManager:btn_element_add\", \"type\" : \"button\", \"name\" : \"新增元素\", \"uri\" : \"/element\", \"menuId\" : \"6\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 9, \"code\" : \"menuManager:btn_element_edit\", \"type\" : \"button\", \"name\" : \"编辑元素\", \"uri\" : \"/element\", \"menuId\" : \"6\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 10, \"code\" : \"menuManager:btn_element_del\", \"type\" : \"button\", \"name\" : \"删除元素\", \"uri\" : \"/element/{*}\", \"menuId\" : \"6\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 19, \"code\" : \"menuManager:view\", \"type\" : \"uri\", \"name\" : \"查看\", \"uri\" : \"/admin/menu/{*}\", \"menuId\" : \"6\", \"parentId\" : \"\", \"path\" : \"\", \"method\" : \"GET\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 20, \"code\" : \"menuManager:element_view\", \"type\" : \"uri\", \"name\" : \"查看\", \"uri\" : \"/admin/element/{*}\", \"menuId\" : \"6\", \"method\" : \"GET\", \"sel\" : true } ]}, { \"id\" : 7, \"code\" : \"groupManager\", \"title\" : \"角色权限管理\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.group.GroupManagementController\", \"icon\" : \"gongnengjiaosequanxianguanli\", \"type\" : \"menu\", \"orderNum\" : 13, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/groupManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 12, \"code\" : \"groupManager:btn_edit\", \"type\" : \"button\", \"name\" : \"编辑\", \"uri\" : \"/group\", \"menuId\" : \"7\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 14, \"code\" : \"groupManager:btn_userManager\", \"type\" : \"button\", \"name\" : \"分配用户\", \"uri\" : \"/group/{*}/user\", \"menuId\" : \"7\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 15, \"code\" : \"groupManager:btn_resourceManager\", \"type\" : \"button\", \"name\" : \"分配权限\", \"uri\" : \"/group/{*}/authority/menu\", \"menuId\" : \"7\", \"method\" : \"PUT\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 42, \"code\" : \"groupManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/group\", \"menuId\" : \"7\", \"method\" : \"DELETE\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 41, \"code\" : \"groupManager:btn_add\", \"type\" : \"button\", \"name\" : \"新增\", \"uri\" : \"/group\", \"menuId\" : \"7\", \"method\" : \"POST\", \"description\" : \"\", \"sel\" : true } ]}, { \"id\" : 8, \"code\" : \"groupTypeManager\", \"title\" : \"角色类型管理\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.grouptype.GroupTypeManagementController\", \"icon\" : \"jiaoseleixing\", \"type\" : \"menu\", \"orderNum\" : 14, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/groupTypeManager\", \"sel\" : true, \"elementVOS\" : [ { \"id\" : 22, \"code\" : \"groupTypeManager:view\", \"type\" : \"uri\", \"name\" : \"查看\", \"uri\" : \"/admin/groupType/{*}\", \"menuId\" : \"8\", \"method\" : \"GET\", \"description\" : \"\", \"sel\" : true }, { \"id\" : 23, \"code\" : \"groupTypeManager:btn_add\", \"type\" : \"button\", \"name\" : \"新增\", \"uri\" : \"/groupType\", \"menuId\" : \"8\", \"method\" : \"POST\", \"sel\" : true }, { \"id\" : 24, \"code\" : \"groupTypeManager:btn_edit\", \"type\" : \"button\", \"name\" : \"编辑\", \"uri\" : \"/groupType\", \"menuId\" : \"8\", \"method\" : \"PUT\", \"sel\" : true }, { \"id\" : 25, \"code\" : \"groupTypeManager:btn_del\", \"type\" : \"button\", \"name\" : \"删除\", \"uri\" : \"/groupType/{*}\", \"menuId\" : \"8\", \"method\" : \"DELETE\", \"sel\" : true } ]}, { \"id\" : 27, \"code\" : \"gateLogManager\", \"title\" : \"操作日志\", \"parentId\" : 5, \"href\" : \"/admin/gateLog\", \"icon\" : \"caozuorizhi\", \"type\" : \"menu\", \"orderNum\" : 15, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/gateLogManager\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 44, \"code\" : \"home\", \"title\" : \"主页\", \"parentId\" : 13, \"href\" : \"com.epri.fx.client.gui.uicomponents.home.HomeController\", \"icon\" : \"home-outline\", \"orderNum\" : 0, \"description\" : \"\", \"path\" : \"com.epri.fx.client.gui.uicomponents.home.HomeController\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 45, \"code\" : \"baseInfo\", \"title\" : \"基础信息录入\", \"parentId\" : 13, \"href\" : \"\", \"icon\" : \"jichuxinxi\", \"orderNum\" : 1, \"description\" : \"基础信息录入\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 46, \"code\" : \"base\", \"title\" : \"基础参数\", \"parentId\" : 45, \"href\" : \"com.epri.fx.client.gui.uicomponents.basicInfo.BasicDataSetController\", \"icon\" : \"jichucanshu\", \"orderNum\" : 0, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 47, \"code\" : \"\", \"title\" : \"煤价差\", \"parentId\" : 45, \"href\" : \"com.epri.fx.client.gui.uicomponents.basicInfo.CoalPriceDiffController\", \"icon\" : \"Energy-\", \"orderNum\" : 1, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 48, \"code\" : \"\", \"title\" : \"铁路成本\", \"parentId\" : 45, \"href\" : \"com.epri.fx.client.gui.uicomponents.basicInfo.RailwayCostController\", \"icon\" : \"tieluyunshu\", \"orderNum\" : 2, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]}, { \"id\" : 49, \"code\" : \"\", \"title\" : \"现行运价\", \"parentId\" : 45, \"href\" : \"com.epri.fx.client.gui.uicomponents.basicInfo.CurrentFreightController\", \"icon\" : \"hangzheng\", \"orderNum\" : 3, \"description\" : \"\", \"sel\" : true, \"elementVOS\" : [ ]} ]'); -INSERT INTO `gate_log` VALUES ('101', '用户管理', '修改', '/user/{*}', '2020-12-03 17:19:07', '1', 'liwen', '127.0.0.1', '{ \"id\" : 1, \"username\" : \"admin\", \"name\" : \"liwen\", \"sex\" : \"男\", \"description\" : \"\"}'); -INSERT INTO `gate_log` VALUES ('105', '角色类型管理', '编辑', '/groupType', '2020-12-03 19:57:40', '1', 'liwen', '127.0.0.1', '{ \"id\" : 3, \"code\" : \"freeaa\", \"name\" : \"自定义类型\", \"description\" : \"sadf\"}'); -INSERT INTO `gate_log` VALUES ('106', '菜单管理', '编辑', '/menu', '2020-12-04 10:30:20', '1', 'liwen', '127.0.0.1', '{ \"id\" : 27, \"code\" : \"gateLogManager\", \"title\" : \"操作日志\", \"parentId\" : 5, \"href\" : \"com.epri.fx.client.gui.uicomponents.admin.log.LogManagementController\", \"icon\" : \"caozuorizhi\", \"type\" : \"menu\", \"orderNum\" : 15, \"description\" : \"\", \"path\" : \"/adminSys/baseManager/gateLogManager\", \"sel\" : false, \"elementVOS\" : [ ]}'); diff --git a/falsework-sever/src/main/java/com/epri/fx/server/config/WebSecurityConfig.java b/falsework-sever/src/main/java/com/epri/fx/server/config/WebSecurityConfig.java deleted file mode 100644 index 2a9f6ad..0000000 --- a/falsework-sever/src/main/java/com/epri/fx/server/config/WebSecurityConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.epri.fx.server.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; - -//@Configuration -//@EnableWebSecurity//开启Spring安全 -//@EnableGlobalMethodSecurity(prePostEnabled=true)//开启Spring方法级安全 -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - - - /* - * 配置为从内存中进行加载认证信息. - * 这里配置了两个用户 admin和user - */ - auth.inMemoryAuthentication() - .withUser("admin") - .password(passwordEncoder().encode("123456")) - .roles("admin"); - - auth.inMemoryAuthentication() - .withUser("user") - .password(passwordEncoder().encode("123456")) - .roles("normal"); - } - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } -} \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/DateUtils.java b/falsework-sever/src/main/java/com/epri/fx/server/util/DateUtils.java deleted file mode 100644 index 5fa11c7..0000000 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/DateUtils.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.epri.fx.server.util; - -import java.text.SimpleDateFormat; -import java.util.Date; - -public class DateUtils { - /** 时间格式(yyyy-MM-dd) */ - public final static String DATE_PATTERN = "yyyy-MM-dd"; - /** 时间格式(yyyy-MM-dd HH:mm:ss) */ - public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; - - public static String format(Date date) { - return format(date, DATE_PATTERN); - } - - public static String format(Date date, String pattern) { - if(date != null){ - SimpleDateFormat df = new SimpleDateFormat(pattern); - return df.format(date); - } - return null; - } -} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/ServerApplication.java b/falsework-sever/src/main/java/com/fx/server/ServerApplication.java similarity index 85% rename from falsework-sever/src/main/java/com/epri/fx/server/ServerApplication.java rename to falsework-sever/src/main/java/com/fx/server/ServerApplication.java index 28df9f0..f3a9fbf 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/ServerApplication.java +++ b/falsework-sever/src/main/java/com/fx/server/ServerApplication.java @@ -1,6 +1,6 @@ -package com.epri.fx.server; +package com.fx.server; -import com.epri.fx.server.util.DBLog; +import com.fx.server.util.DBLog; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -8,7 +8,7 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfi import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement -@MapperScan("com.epri.fx.server.mapper") +@MapperScan("com.fx.server.mapper") @SpringBootApplication(exclude=SecurityAutoConfiguration.class) public class ServerApplication { diff --git a/falsework-sever/src/main/java/com/epri/fx/server/config/FilterConfig.java b/falsework-sever/src/main/java/com/fx/server/config/FilterConfig.java similarity index 91% rename from falsework-sever/src/main/java/com/epri/fx/server/config/FilterConfig.java rename to falsework-sever/src/main/java/com/fx/server/config/FilterConfig.java index 16b4fc3..3b5e806 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/config/FilterConfig.java +++ b/falsework-sever/src/main/java/com/fx/server/config/FilterConfig.java @@ -1,6 +1,6 @@ -package com.epri.fx.server.config; +package com.fx.server.config; -import com.epri.fx.server.filter.ReplaceStreamFilter; +import com.fx.server.filter.ReplaceStreamFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/config/KeyConfiguration.java b/falsework-sever/src/main/java/com/fx/server/config/KeyConfiguration.java similarity index 91% rename from falsework-sever/src/main/java/com/epri/fx/server/config/KeyConfiguration.java rename to falsework-sever/src/main/java/com/fx/server/config/KeyConfiguration.java index cf86390..f40ab33 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/config/KeyConfiguration.java +++ b/falsework-sever/src/main/java/com/fx/server/config/KeyConfiguration.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.config; +package com.fx.server.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/config/UserAuthConfig.java b/falsework-sever/src/main/java/com/fx/server/config/UserAuthConfig.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/config/UserAuthConfig.java rename to falsework-sever/src/main/java/com/fx/server/config/UserAuthConfig.java index 9f59b45..e30765a 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/config/UserAuthConfig.java +++ b/falsework-sever/src/main/java/com/fx/server/config/UserAuthConfig.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.config; +package com.fx.server.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/config/UserConfiguration.java b/falsework-sever/src/main/java/com/fx/server/config/UserConfiguration.java similarity index 89% rename from falsework-sever/src/main/java/com/epri/fx/server/config/UserConfiguration.java rename to falsework-sever/src/main/java/com/fx/server/config/UserConfiguration.java index 9741efd..dc7728d 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/config/UserConfiguration.java +++ b/falsework-sever/src/main/java/com/fx/server/config/UserConfiguration.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.config; +package com.fx.server.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/config/WebConfiguration.java b/falsework-sever/src/main/java/com/fx/server/config/WebConfiguration.java similarity index 85% rename from falsework-sever/src/main/java/com/epri/fx/server/config/WebConfiguration.java rename to falsework-sever/src/main/java/com/fx/server/config/WebConfiguration.java index fd6dcde..a4b5b32 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/config/WebConfiguration.java +++ b/falsework-sever/src/main/java/com/fx/server/config/WebConfiguration.java @@ -1,9 +1,9 @@ -package com.epri.fx.server.config; +package com.fx.server.config; -import com.epri.fx.server.handler.GlobalExceptionHandler; -import com.epri.fx.server.interceptor.LogInterceptor; -import com.epri.fx.server.interceptor.UserAuthRestInterceptor; +import com.fx.server.handler.GlobalExceptionHandler; +import com.fx.server.interceptor.LogInterceptor; +import com.fx.server.interceptor.UserAuthRestInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @@ -19,7 +19,7 @@ import java.util.Collections; */ @Configuration("admimWebConfig") @Primary -public class WebConfiguration implements WebMvcConfigurer { +public class WebConfiguration implements WebMvcConfigurer { @Bean GlobalExceptionHandler getGlobalExceptionHandler() { return new GlobalExceptionHandler(); @@ -36,14 +36,17 @@ public class WebConfiguration implements WebMvcConfigurer { UserAuthRestInterceptor getUserAuthRestInterceptor() { return new UserAuthRestInterceptor(); } + @Bean LogInterceptor getLogInterceptor() { return new LogInterceptor(); } + /** * 需要用户和服务认证判断的路径 + * * @return */ private ArrayList getIncludePathPatterns() { diff --git a/falsework-sever/src/main/java/com/fx/server/config/WebSocketConfig.java b/falsework-sever/src/main/java/com/fx/server/config/WebSocketConfig.java new file mode 100644 index 0000000..02993d1 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/config/WebSocketConfig.java @@ -0,0 +1,27 @@ +package com.fx.server.config; + +import com.fx.server.interceptor.WebcocketInterceptor; +import com.fx.server.websocket.WebSocketMessageHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; + +@Configuration +@EnableWebSocket +public class WebSocketConfig implements WebSocketConfigurer { + + @Autowired + private WebSocketMessageHandler webSocketMessageHandler; + @Autowired + private WebcocketInterceptor myInterceptor; + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry + .addHandler(webSocketMessageHandler, "/websocket/*") + .addInterceptors(myInterceptor) + .setAllowedOrigins("*"); + } +} \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/epri/fx/server/constant/AdminCommonConstant.java b/falsework-sever/src/main/java/com/fx/server/constant/AdminCommonConstant.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/constant/AdminCommonConstant.java rename to falsework-sever/src/main/java/com/fx/server/constant/AdminCommonConstant.java index b6907a2..346c1e2 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/constant/AdminCommonConstant.java +++ b/falsework-sever/src/main/java/com/fx/server/constant/AdminCommonConstant.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.constant; +package com.fx.server.constant; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/constant/CommonConstants.java b/falsework-sever/src/main/java/com/fx/server/constant/CommonConstants.java similarity index 64% rename from falsework-sever/src/main/java/com/epri/fx/server/constant/CommonConstants.java rename to falsework-sever/src/main/java/com/fx/server/constant/CommonConstants.java index a2effe3..f8ce4b1 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/constant/CommonConstants.java +++ b/falsework-sever/src/main/java/com/fx/server/constant/CommonConstants.java @@ -1,9 +1,7 @@ -package com.epri.fx.server.constant; +package com.fx.server.constant; /** - * * @Description: - * * @param: * @return: * @auther: liwen @@ -25,4 +23,19 @@ public class CommonConstants { public static final String CONTEXT_KEY_USER_TOKEN = "currentUserToken"; public static final String JWT_KEY_USER_ID = "userId"; public static final String JWT_KEY_NAME = "name"; + public static final String FAIL = "1"; + public static final String SUCCESS = "0"; + /** + * 执行目标key + */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + /** + * 执行目标参数 + */ + public static final String TASK_PARAMETERS = "TASK_PARAMETERS"; + public static final String WEB_SOCKET_USER_LIST = "web_socket_user_list"; + public static final String WEB_SOCKET_USER_ID = "web_socket_user_id"; + public static final String WEB_SOCKET_TOKEN = "WEB_SOCKET_TOKEN"; + + } diff --git a/falsework-sever/src/main/java/com/epri/fx/server/constant/RestCodeConstants.java b/falsework-sever/src/main/java/com/fx/server/constant/RestCodeConstants.java similarity index 87% rename from falsework-sever/src/main/java/com/epri/fx/server/constant/RestCodeConstants.java rename to falsework-sever/src/main/java/com/fx/server/constant/RestCodeConstants.java index dbe1be7..2db766c 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/constant/RestCodeConstants.java +++ b/falsework-sever/src/main/java/com/fx/server/constant/RestCodeConstants.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.constant; +package com.fx.server.constant; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/constant/UserConstant.java b/falsework-sever/src/main/java/com/fx/server/constant/UserConstant.java similarity index 80% rename from falsework-sever/src/main/java/com/epri/fx/server/constant/UserConstant.java rename to falsework-sever/src/main/java/com/fx/server/constant/UserConstant.java index d6b58b1..01d03b8 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/constant/UserConstant.java +++ b/falsework-sever/src/main/java/com/fx/server/constant/UserConstant.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.constant; +package com.fx.server.constant; /** * ${DESCRIPTION} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/context/BaseContextHandler.java b/falsework-sever/src/main/java/com/fx/server/context/BaseContextHandler.java similarity index 91% rename from falsework-sever/src/main/java/com/epri/fx/server/context/BaseContextHandler.java rename to falsework-sever/src/main/java/com/fx/server/context/BaseContextHandler.java index 28da1b5..bce3b68 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/context/BaseContextHandler.java +++ b/falsework-sever/src/main/java/com/fx/server/context/BaseContextHandler.java @@ -1,10 +1,8 @@ -package com.epri.fx.server.context; +package com.fx.server.context; -import com.epri.fx.server.constant.CommonConstants; -import com.epri.fx.server.util.StringHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import com.fx.server.constant.CommonConstants; +import com.fx.server.util.StringHelper; import java.util.HashMap; import java.util.Map; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/Element.java b/falsework-sever/src/main/java/com/fx/server/entity/Element.java similarity index 95% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/Element.java rename to falsework-sever/src/main/java/com/fx/server/entity/Element.java index 8d1b05a..0d66118 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/Element.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/Element.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.entity; +package com.fx.server.entity; import lombok.Data; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/Group.java b/falsework-sever/src/main/java/com/fx/server/entity/Group.java similarity index 99% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/Group.java rename to falsework-sever/src/main/java/com/fx/server/entity/Group.java index 0aea33a..c6f3827 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/Group.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/Group.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.entity; +package com.fx.server.entity; import java.io.Serializable; import java.util.Date; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/GroupType.java b/falsework-sever/src/main/java/com/fx/server/entity/GroupType.java similarity index 99% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/GroupType.java rename to falsework-sever/src/main/java/com/fx/server/entity/GroupType.java index 2bec83c..70e4a62 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/GroupType.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/GroupType.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.entity; +package com.fx.server.entity; import java.io.Serializable; import java.util.Date; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/Menu.java b/falsework-sever/src/main/java/com/fx/server/entity/Menu.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/Menu.java rename to falsework-sever/src/main/java/com/fx/server/entity/Menu.java index 42b1ffd..d41e270 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/Menu.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/Menu.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.entity; +package com.fx.server.entity; import lombok.Data; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/ResourceAuthority.java b/falsework-sever/src/main/java/com/fx/server/entity/ResourceAuthority.java similarity index 99% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/ResourceAuthority.java rename to falsework-sever/src/main/java/com/fx/server/entity/ResourceAuthority.java index 4d29b4e..126f222 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/ResourceAuthority.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/ResourceAuthority.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.entity; +package com.fx.server.entity; import java.io.Serializable; import java.util.Date; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/RsaKey.java b/falsework-sever/src/main/java/com/fx/server/entity/RsaKey.java similarity index 85% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/RsaKey.java rename to falsework-sever/src/main/java/com/fx/server/entity/RsaKey.java index 445ded8..5b4f0e4 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/RsaKey.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/RsaKey.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.entity; +package com.fx.server.entity; import lombok.Data; diff --git a/falsework-sever/src/main/java/com/fx/server/entity/SysJob.java b/falsework-sever/src/main/java/com/fx/server/entity/SysJob.java new file mode 100644 index 0000000..6f6fd4e --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/entity/SysJob.java @@ -0,0 +1,57 @@ +package com.fx.server.entity; + +import lombok.Data; +import org.quartz.Job; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @description: + * @className: SysJob + * @author: liwen + * @date: 2020/12/25 09:06 + */ +@Data +public class SysJob implements Serializable { + + /** + * 任务实现类 + */ + private String jobClass; + /** + * 任务名称(建议唯一) + */ + private String jobName; + /** + * 任务组名 + */ + private String jobGroupName; + /** + * 时间表达式 (如:0/5 * * * * ? ) + */ + private String jobTime; + /** + * 参数 + */ + private String parames; + + private String description; + private String jobStatus; + + + public SysJob(String jobClass, String jobName, String jobGroupName, String jobTime, String parames) { + this.jobClass = jobClass; + this.jobName = jobName; + this.jobGroupName = jobGroupName; + this.jobTime = jobTime; + this.parames = parames; + } + + public SysJob() { + + } + +} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/User.java b/falsework-sever/src/main/java/com/fx/server/entity/User.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/User.java rename to falsework-sever/src/main/java/com/fx/server/entity/User.java index 2cae075..6691aff 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/User.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/User.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.entity; +package com.fx.server.entity; import lombok.Data; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/UserInfo.java b/falsework-sever/src/main/java/com/fx/server/entity/UserInfo.java similarity index 97% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/UserInfo.java rename to falsework-sever/src/main/java/com/fx/server/entity/UserInfo.java index 2dc7558..64384e8 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/UserInfo.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/UserInfo.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.entity; +package com.fx.server.entity; import java.io.Serializable; import java.util.Date; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/log/GateLog.java b/falsework-sever/src/main/java/com/fx/server/entity/log/GateLog.java similarity index 91% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/log/GateLog.java rename to falsework-sever/src/main/java/com/fx/server/entity/log/GateLog.java index 9c60599..ceca79c 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/log/GateLog.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/log/GateLog.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.entity.log; +package com.fx.server.entity.log; import java.io.Serializable; import java.util.Date; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/entity/log/LogInfo.java b/falsework-sever/src/main/java/com/fx/server/entity/log/LogInfo.java similarity index 93% rename from falsework-sever/src/main/java/com/epri/fx/server/entity/log/LogInfo.java rename to falsework-sever/src/main/java/com/fx/server/entity/log/LogInfo.java index 7a3c26f..4b65b84 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/entity/log/LogInfo.java +++ b/falsework-sever/src/main/java/com/fx/server/entity/log/LogInfo.java @@ -1,13 +1,16 @@ -package com.epri.fx.server.entity.log; +package com.fx.server.entity.log; import java.io.Serializable; import java.util.Date; /** - * ${DESCRIPTION} * - * @author wanghaobin - * @create 2017-07-01 11:18 + * @Description: + * + * @param: + * @return: + * @auther: liwen + * @date: 2021/1/4 1:03 下午 */ public class LogInfo implements Serializable{ private String id; diff --git a/falsework-sever/src/main/java/com/fx/server/entity/log/SysJobLog.java b/falsework-sever/src/main/java/com/fx/server/entity/log/SysJobLog.java new file mode 100644 index 0000000..704fb74 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/entity/log/SysJobLog.java @@ -0,0 +1,61 @@ +package com.fx.server.entity.log; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * sys_job_log + * @author + */ +@Data +public class SysJobLog implements Serializable { + /** + * 任务日志ID + */ + private Long jobLogId; + + /** + * 任务名称 + */ + private String jobName; + + /** + * 任务组名 + */ + private String jobGroup; + + /** + * 调用目标字符串 + */ + private String invokeTarget; + + /** + * 日志信息 + */ + private String jobMessage; + + /** + * 执行状态(0正常 1失败) + */ + private String status; + + /** + * 异常信息 + */ + private String exceptionInfo; + + /** + * 创建时间 + */ + private Date createTime; + + /** 开始时间 */ + private Date startTime; + + /** 结束时间 */ + private Date endTime; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/fx/server/entity/log/SysLoginInfor.java b/falsework-sever/src/main/java/com/fx/server/entity/log/SysLoginInfor.java new file mode 100644 index 0000000..24c0427 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/entity/log/SysLoginInfor.java @@ -0,0 +1,59 @@ +package com.fx.server.entity.log; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * sys_logininfor + * @author + */ +@Data +public class SysLoginInfor implements Serializable { + /** + * 访问ID + */ + private Long infoId; + + /** + * 登录账号 + */ + private String loginName; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录状态(0成功 1失败) + */ + private String status; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/epri/fx/server/exception/BaseException.java b/falsework-sever/src/main/java/com/fx/server/exception/BaseException.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/exception/BaseException.java rename to falsework-sever/src/main/java/com/fx/server/exception/BaseException.java index 35734a6..36f2400 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/exception/BaseException.java +++ b/falsework-sever/src/main/java/com/fx/server/exception/BaseException.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.exception; +package com.fx.server.exception; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/ClientForbiddenException.java b/falsework-sever/src/main/java/com/fx/server/exception/auth/ClientForbiddenException.java similarity index 67% rename from falsework-sever/src/main/java/com/epri/fx/server/exception/auth/ClientForbiddenException.java rename to falsework-sever/src/main/java/com/fx/server/exception/auth/ClientForbiddenException.java index e17dc9e..a1fa804 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/ClientForbiddenException.java +++ b/falsework-sever/src/main/java/com/fx/server/exception/auth/ClientForbiddenException.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.exception.auth; +package com.fx.server.exception.auth; -import com.epri.fx.server.constant.CommonConstants; -import com.epri.fx.server.exception.BaseException; +import com.fx.server.constant.CommonConstants; +import com.fx.server.exception.BaseException; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/ClientInvalidException.java b/falsework-sever/src/main/java/com/fx/server/exception/auth/ClientInvalidException.java similarity index 66% rename from falsework-sever/src/main/java/com/epri/fx/server/exception/auth/ClientInvalidException.java rename to falsework-sever/src/main/java/com/fx/server/exception/auth/ClientInvalidException.java index 689bc90..5205b8f 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/ClientInvalidException.java +++ b/falsework-sever/src/main/java/com/fx/server/exception/auth/ClientInvalidException.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.exception.auth; +package com.fx.server.exception.auth; -import com.epri.fx.server.constant.CommonConstants; -import com.epri.fx.server.exception.BaseException; +import com.fx.server.constant.CommonConstants; +import com.fx.server.exception.BaseException; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/ClientTokenException.java b/falsework-sever/src/main/java/com/fx/server/exception/auth/ClientTokenException.java similarity index 66% rename from falsework-sever/src/main/java/com/epri/fx/server/exception/auth/ClientTokenException.java rename to falsework-sever/src/main/java/com/fx/server/exception/auth/ClientTokenException.java index f72c9ec..a1373c9 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/ClientTokenException.java +++ b/falsework-sever/src/main/java/com/fx/server/exception/auth/ClientTokenException.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.exception.auth; +package com.fx.server.exception.auth; -import com.epri.fx.server.constant.CommonConstants; -import com.epri.fx.server.exception.BaseException; +import com.fx.server.constant.CommonConstants; +import com.fx.server.exception.BaseException; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/UserInvalidException.java b/falsework-sever/src/main/java/com/fx/server/exception/auth/UserInvalidException.java similarity index 66% rename from falsework-sever/src/main/java/com/epri/fx/server/exception/auth/UserInvalidException.java rename to falsework-sever/src/main/java/com/fx/server/exception/auth/UserInvalidException.java index a6e5352..d60ed4e 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/UserInvalidException.java +++ b/falsework-sever/src/main/java/com/fx/server/exception/auth/UserInvalidException.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.exception.auth; +package com.fx.server.exception.auth; -import com.epri.fx.server.constant.CommonConstants; -import com.epri.fx.server.exception.BaseException; +import com.fx.server.constant.CommonConstants; +import com.fx.server.exception.BaseException; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/UserTokenException.java b/falsework-sever/src/main/java/com/fx/server/exception/auth/UserTokenException.java similarity index 65% rename from falsework-sever/src/main/java/com/epri/fx/server/exception/auth/UserTokenException.java rename to falsework-sever/src/main/java/com/fx/server/exception/auth/UserTokenException.java index 7cb6c61..64ab32f 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/exception/auth/UserTokenException.java +++ b/falsework-sever/src/main/java/com/fx/server/exception/auth/UserTokenException.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.exception.auth; +package com.fx.server.exception.auth; -import com.epri.fx.server.constant.CommonConstants; -import com.epri.fx.server.exception.BaseException; +import com.fx.server.constant.CommonConstants; +import com.fx.server.exception.BaseException; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/filter/ReplaceStreamFilter.java b/falsework-sever/src/main/java/com/fx/server/filter/ReplaceStreamFilter.java similarity index 95% rename from falsework-sever/src/main/java/com/epri/fx/server/filter/ReplaceStreamFilter.java rename to falsework-sever/src/main/java/com/fx/server/filter/ReplaceStreamFilter.java index 139a795..0750650 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/filter/ReplaceStreamFilter.java +++ b/falsework-sever/src/main/java/com/fx/server/filter/ReplaceStreamFilter.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.filter; +package com.fx.server.filter; import lombok.extern.slf4j.Slf4j; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/filter/RequestWrapper.java b/falsework-sever/src/main/java/com/fx/server/filter/RequestWrapper.java similarity index 98% rename from falsework-sever/src/main/java/com/epri/fx/server/filter/RequestWrapper.java rename to falsework-sever/src/main/java/com/fx/server/filter/RequestWrapper.java index a7ca9b2..12a839c 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/filter/RequestWrapper.java +++ b/falsework-sever/src/main/java/com/fx/server/filter/RequestWrapper.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.filter; +package com.fx.server.filter; import lombok.extern.slf4j.Slf4j; diff --git a/falsework-sever/src/main/java/com/fx/server/handler/ChatHandshakeInterceptor.java b/falsework-sever/src/main/java/com/fx/server/handler/ChatHandshakeInterceptor.java new file mode 100644 index 0000000..5ffd67c --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/handler/ChatHandshakeInterceptor.java @@ -0,0 +1,52 @@ +package com.fx.server.handler; + +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.handler.TextWebSocketHandler; +import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; + +import java.util.Map; + +/** + * WebSocket握手请求的拦截器. 检查握手请求和响应, 对WebSocketHandler传递属性 + */ +public class ChatHandshakeInterceptor extends HttpSessionHandshakeInterceptor { + /** + * 在握手之前执行该方法, 继续握手返回true, 中断握手返回false. 通过attributes参数设置WebSocketSession的属性 + * + * @param request + * @param response + * @param wsHandler + * @param attributes + * @return + * @throws Exception + */ + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, + Map attributes) throws Exception { +//为了方便区分来源,在此以用户的名字来区分,名字我们通过要求用输入进行传递,所以在这里先从请求中获取到用户输入的名字,因为是使用的rest 风格,所以规定路径的最后一个字符串是名字 + System.out.println("握手之前"); + String s = request.getURI().toString(); + String s1 = s.substring(s.lastIndexOf("/") + 1); + + return super.beforeHandshake(request, response, wsHandler, attributes); + } + + /** + * 在握手之后执行该方法. 无论是否握手成功都指明了响应状态码和相应头. + * + * @param request + * @param response + * @param wsHandler + * @param ex + */ + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, + Exception ex) { + System.out.println("After Handshake"); + super.afterHandshake(request, response, wsHandler, ex); + } + + +} \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/epri/fx/server/handler/GlobalExceptionHandler.java b/falsework-sever/src/main/java/com/fx/server/handler/GlobalExceptionHandler.java similarity index 82% rename from falsework-sever/src/main/java/com/epri/fx/server/handler/GlobalExceptionHandler.java rename to falsework-sever/src/main/java/com/fx/server/handler/GlobalExceptionHandler.java index 7689db8..d413f0d 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/handler/GlobalExceptionHandler.java +++ b/falsework-sever/src/main/java/com/fx/server/handler/GlobalExceptionHandler.java @@ -1,12 +1,12 @@ -package com.epri.fx.server.handler; +package com.fx.server.handler; -import com.epri.fx.server.constant.CommonConstants; -import com.epri.fx.server.exception.BaseException; -import com.epri.fx.server.exception.auth.ClientTokenException; -import com.epri.fx.server.exception.auth.UserInvalidException; -import com.epri.fx.server.exception.auth.UserTokenException; -import com.epri.fx.server.msg.BaseResponse; +import com.fx.server.constant.CommonConstants; +import com.fx.server.exception.BaseException; +import com.fx.server.exception.auth.ClientTokenException; +import com.fx.server.exception.auth.UserInvalidException; +import com.fx.server.exception.auth.UserTokenException; +import com.fx.server.msg.BaseResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -18,7 +18,7 @@ import javax.servlet.http.HttpServletResponse; /** * Created by ace on 2017/9/8. */ -@ControllerAdvice("com.epri.fx.server") +@ControllerAdvice("com.fx.server") @ResponseBody public class GlobalExceptionHandler { private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); diff --git a/falsework-sever/src/main/java/com/epri/fx/server/interceptor/LogInterceptor.java b/falsework-sever/src/main/java/com/fx/server/interceptor/LogInterceptor.java similarity index 90% rename from falsework-sever/src/main/java/com/epri/fx/server/interceptor/LogInterceptor.java rename to falsework-sever/src/main/java/com/fx/server/interceptor/LogInterceptor.java index 1642c53..1f092c6 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/interceptor/LogInterceptor.java +++ b/falsework-sever/src/main/java/com/fx/server/interceptor/LogInterceptor.java @@ -1,16 +1,16 @@ -package com.epri.fx.server.interceptor; +package com.fx.server.interceptor; -import com.epri.fx.server.config.UserConfiguration; -import com.epri.fx.server.context.BaseContextHandler; -import com.epri.fx.server.entity.log.LogInfo; -import com.epri.fx.server.filter.RequestWrapper; -import com.epri.fx.server.jwt.IJWTInfo; -import com.epri.fx.server.service.PermissionService; -import com.epri.fx.server.service.log.GateLogService; -import com.epri.fx.server.util.DBLog; -import com.epri.fx.server.util.user.JwtTokenUtil; -import com.epri.fx.server.vo.PermissionInfo; +import com.fx.server.config.UserConfiguration; +import com.fx.server.context.BaseContextHandler; +import com.fx.server.entity.log.LogInfo; +import com.fx.server.filter.RequestWrapper; +import com.fx.server.jwt.IJWTInfo; +import com.fx.server.service.PermissionService; +import com.fx.server.service.log.GateLogService; +import com.fx.server.util.DBLog; +import com.fx.server.util.user.JwtTokenUtil; +import com.fx.server.vo.PermissionInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/interceptor/UserAuthRestInterceptor.java b/falsework-sever/src/main/java/com/fx/server/interceptor/UserAuthRestInterceptor.java similarity index 82% rename from falsework-sever/src/main/java/com/epri/fx/server/interceptor/UserAuthRestInterceptor.java rename to falsework-sever/src/main/java/com/fx/server/interceptor/UserAuthRestInterceptor.java index 2efb7e3..2d920a4 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/interceptor/UserAuthRestInterceptor.java +++ b/falsework-sever/src/main/java/com/fx/server/interceptor/UserAuthRestInterceptor.java @@ -1,12 +1,12 @@ -package com.epri.fx.server.interceptor; +package com.fx.server.interceptor; -import com.epri.fx.server.config.UserConfiguration; -import com.epri.fx.server.context.BaseContextHandler; -import com.epri.fx.server.jwt.IJWTInfo; -import com.epri.fx.server.service.PermissionService; -import com.epri.fx.server.service.log.GateLogService; -import com.epri.fx.server.util.user.JwtTokenUtil; +import com.fx.server.config.UserConfiguration; +import com.fx.server.context.BaseContextHandler; +import com.fx.server.jwt.IJWTInfo; +import com.fx.server.service.PermissionService; +import com.fx.server.service.log.GateLogService; +import com.fx.server.util.user.JwtTokenUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/falsework-sever/src/main/java/com/fx/server/interceptor/WebcocketInterceptor.java b/falsework-sever/src/main/java/com/fx/server/interceptor/WebcocketInterceptor.java new file mode 100644 index 0000000..cc6b9b0 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/interceptor/WebcocketInterceptor.java @@ -0,0 +1,93 @@ +package com.fx.server.interceptor; + +import com.fx.server.config.UserConfiguration; +import com.fx.server.entity.log.SysLoginInfor; +import com.fx.server.jwt.IJWTInfo; +import com.fx.server.service.log.SysLoginInfoService; +import com.fx.server.util.user.JwtTokenUtil; +import com.fx.server.constant.CommonConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.Date; +import java.util.Map; + +import static java.util.UUID.*; + +/** + * @author buhao + * @version MyInterceptor.java, v 0.1 2019-10-17 19:21 buhao + */ +@Slf4j +@Component +public class WebcocketInterceptor implements HandshakeInterceptor { + + @Autowired + private JwtTokenUtil jwtTokenUtil; + @Autowired + private UserConfiguration userConfiguration; + + @Autowired + private SysLoginInfoService sysLoginInfoService; + + /** + * 握手前 + * + * @param request + * @param response + * @param wsHandler + * @param attributes + * @return + * @throws Exception + */ + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { + log.info("握手开始"); + + // 获得请求参数 + String token = request.getHeaders().getFirst(userConfiguration.getUserTokenHeader()); + String userName = request.getHeaders().getFirst("userName"); + IJWTInfo ijwtInfo = jwtTokenUtil.getInfoFromToken(token); + SysLoginInfor sysLoginInfor = new SysLoginInfor(); + sysLoginInfor.setInfoId(randomUUID().getMostSignificantBits()); + sysLoginInfor.setLoginName(userName); + sysLoginInfor.setIpaddr(request.getRemoteAddress().toString()); + sysLoginInfor.setLoginTime(new Date()); + + if (ijwtInfo != null) { + sysLoginInfor.setStatus("0"); + sysLoginInfor.setMsg("登录成功!"); + // 放入属性域 + attributes.put(CommonConstants.WEB_SOCKET_USER_LIST, sysLoginInfor); + attributes.put(CommonConstants.WEB_SOCKET_USER_ID, sysLoginInfor.getLoginName()); + sysLoginInfoService.addSysJobLog(sysLoginInfor); + return true; + } else { + log.error("用户登录已失效"); + sysLoginInfor.setStatus("1"); + sysLoginInfor.setMsg("登录失败!"); + sysLoginInfoService.addSysJobLog(sysLoginInfor); + return false; + } + + } + + /** + * 握手后 + * + * @param request + * @param response + * @param wsHandler + * @param exception + */ + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { + log.info("握手完成."); + } + +} \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/fx/server/job/AbstractQuartzJob.java b/falsework-sever/src/main/java/com/fx/server/job/AbstractQuartzJob.java new file mode 100644 index 0000000..86e3253 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/job/AbstractQuartzJob.java @@ -0,0 +1,102 @@ +package com.fx.server.job; + + +import com.fx.server.constant.CommonConstants; +import com.fx.server.entity.SysJob; +import com.fx.server.entity.log.SysJobLog; +import com.fx.server.service.log.SysJobLogService; +import com.fx.server.util.SpringUtils; +import org.apache.commons.lang3.StringUtils; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; + +import java.util.Date; + +/** + * 抽象quartz调用 + * + * @author ruoyi + */ +public abstract class AbstractQuartzJob implements Job { + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + SysJob sysJob = new SysJob(); + Object obj = context.getMergedJobDataMap().get(CommonConstants.TASK_PROPERTIES); + if (obj != null) { + BeanUtils.copyProperties(obj, sysJob); + + } + try { + before(context, sysJob); + if (sysJob != null) { + doExecute(context, sysJob); + } + after(context, sysJob, null); + } catch (Exception e) { + log.error("任务执行异常 - :", e); + after(context, sysJob, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void before(JobExecutionContext context, SysJob sysJob) { + threadLocal.set(new Date()); + } + + /** + * 执行后 + * + * @param context 工作执行上下文对象 + * @param sysScheduleJob 系统计划任务 + */ + protected void after(JobExecutionContext context, SysJob sysJob, Exception e) { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + final SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setCreateTime(startTime); + sysJobLog.setJobName(sysJob.getJobName()); + sysJobLog.setJobGroup(sysJob.getJobGroupName()); + sysJobLog.setInvokeTarget(sysJob.getJobClass()); + sysJobLog.setStartTime(startTime); + sysJobLog.setEndTime(new Date()); + long runMs = sysJobLog.getEndTime().getTime() - sysJobLog.getStartTime().getTime(); + sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); + if (e != null) { + sysJobLog.setStatus(CommonConstants.FAIL); + String errorMsg = StringUtils.substring(e.getMessage(), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } else { + sysJobLog.setStatus(CommonConstants.SUCCESS); + } + + // 写入数据库当中 + SpringUtils.getBean(SysJobLogService.class).addSysJobLog(sysJobLog); + + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception; +} diff --git a/falsework-sever/src/main/java/com/fx/server/job/TestJob.java b/falsework-sever/src/main/java/com/fx/server/job/TestJob.java new file mode 100644 index 0000000..6e729ac --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/job/TestJob.java @@ -0,0 +1,23 @@ +package com.fx.server.job; + +import com.fx.server.entity.SysJob; +import com.fx.server.util.SpringUtils; +import com.fx.server.websocket.WebSocketMessageHandler; +import org.quartz.JobExecutionContext; +import org.springframework.web.socket.TextMessage; + +/** + * @description: + * @className: TestJob + * @author: liwen + * @date: 2020/12/24 16:23 + */ +public class TestJob extends AbstractQuartzJob { + + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception { + System.err.println("aafdsafdsa"); + // 写入数据库当中 + SpringUtils.getBean(WebSocketMessageHandler.class).sendMessageToUsers(new TextMessage("999999999999999999999999999999")); + } +} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/jwt/IJWTInfo.java b/falsework-sever/src/main/java/com/fx/server/jwt/IJWTInfo.java similarity index 91% rename from falsework-sever/src/main/java/com/epri/fx/server/jwt/IJWTInfo.java rename to falsework-sever/src/main/java/com/fx/server/jwt/IJWTInfo.java index 6ed5aca..6b0d8b0 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/jwt/IJWTInfo.java +++ b/falsework-sever/src/main/java/com/fx/server/jwt/IJWTInfo.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.jwt; +package com.fx.server.jwt; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/jwt/JWTHelper.java b/falsework-sever/src/main/java/com/fx/server/jwt/JWTHelper.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/jwt/JWTHelper.java rename to falsework-sever/src/main/java/com/fx/server/jwt/JWTHelper.java index 7574638..af6aeef 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/jwt/JWTHelper.java +++ b/falsework-sever/src/main/java/com/fx/server/jwt/JWTHelper.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.jwt; +package com.fx.server.jwt; -import com.epri.fx.server.constant.CommonConstants; -import com.epri.fx.server.util.StringHelper; +import com.fx.server.constant.CommonConstants; +import com.fx.server.util.StringHelper; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jws; import io.jsonwebtoken.Jwts; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/jwt/JWTInfo.java b/falsework-sever/src/main/java/com/fx/server/jwt/JWTInfo.java similarity index 98% rename from falsework-sever/src/main/java/com/epri/fx/server/jwt/JWTInfo.java rename to falsework-sever/src/main/java/com/fx/server/jwt/JWTInfo.java index cc6d4da..be1e53b 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/jwt/JWTInfo.java +++ b/falsework-sever/src/main/java/com/fx/server/jwt/JWTInfo.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.jwt; +package com.fx.server.jwt; import java.io.Serializable; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/jwt/RsaKeyHelper.java b/falsework-sever/src/main/java/com/fx/server/jwt/RsaKeyHelper.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/jwt/RsaKeyHelper.java rename to falsework-sever/src/main/java/com/fx/server/jwt/RsaKeyHelper.java index 211fb7e..5aa7d42 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/jwt/RsaKeyHelper.java +++ b/falsework-sever/src/main/java/com/fx/server/jwt/RsaKeyHelper.java @@ -1,9 +1,7 @@ -package com.epri.fx.server.jwt; +package com.fx.server.jwt; - - - -import org.apache.commons.codec.binary.Base64; +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; import java.io.DataInputStream; import java.io.FileOutputStream; @@ -155,11 +153,11 @@ public class RsaKeyHelper { } public static String toHexString(byte[] b) { - return Base64.encodeBase64String(b); + return (new BASE64Encoder()).encodeBuffer(b); } public static final byte[] toBytes(String s) throws IOException { - return Base64.decodeBase64(s); + return (new BASE64Decoder()).decodeBuffer(s); } public static void main(String[] args) throws NoSuchAlgorithmException { diff --git a/falsework-sever/src/main/java/com/epri/fx/server/jwt/UserAuthUtil.java b/falsework-sever/src/main/java/com/fx/server/jwt/UserAuthUtil.java similarity index 86% rename from falsework-sever/src/main/java/com/epri/fx/server/jwt/UserAuthUtil.java rename to falsework-sever/src/main/java/com/fx/server/jwt/UserAuthUtil.java index 6420acc..15c998d 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/jwt/UserAuthUtil.java +++ b/falsework-sever/src/main/java/com/fx/server/jwt/UserAuthUtil.java @@ -1,7 +1,7 @@ -package com.epri.fx.server.jwt; +package com.fx.server.jwt; -import com.epri.fx.server.config.UserAuthConfig; -import com.epri.fx.server.exception.auth.UserTokenException; +import com.fx.server.config.UserAuthConfig; +import com.fx.server.exception.auth.UserTokenException; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.SignatureException; import org.springframework.beans.factory.annotation.Autowired; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/mapper/ElementMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/ElementMapper.java similarity index 88% rename from falsework-sever/src/main/java/com/epri/fx/server/mapper/ElementMapper.java rename to falsework-sever/src/main/java/com/fx/server/mapper/ElementMapper.java index c417a0d..82a6f50 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/mapper/ElementMapper.java +++ b/falsework-sever/src/main/java/com/fx/server/mapper/ElementMapper.java @@ -1,6 +1,6 @@ -package com.epri.fx.server.mapper; +package com.fx.server.mapper; -import com.epri.fx.server.entity.Element; +import com.fx.server.entity.Element; import org.apache.ibatis.annotations.Param; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/mapper/GateLogMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/GateLogMapper.java similarity index 75% rename from falsework-sever/src/main/java/com/epri/fx/server/mapper/GateLogMapper.java rename to falsework-sever/src/main/java/com/fx/server/mapper/GateLogMapper.java index 388cf32..82aced3 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/mapper/GateLogMapper.java +++ b/falsework-sever/src/main/java/com/fx/server/mapper/GateLogMapper.java @@ -1,7 +1,6 @@ -package com.epri.fx.server.mapper; +package com.fx.server.mapper; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.entity.log.GateLog; +import com.fx.server.entity.log.GateLog; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/mapper/GroupMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/GroupMapper.java similarity index 91% rename from falsework-sever/src/main/java/com/epri/fx/server/mapper/GroupMapper.java rename to falsework-sever/src/main/java/com/fx/server/mapper/GroupMapper.java index 7393e12..404b2ce 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/mapper/GroupMapper.java +++ b/falsework-sever/src/main/java/com/fx/server/mapper/GroupMapper.java @@ -1,6 +1,6 @@ -package com.epri.fx.server.mapper; +package com.fx.server.mapper; -import com.epri.fx.server.entity.Group; +import com.fx.server.entity.Group; import org.apache.ibatis.annotations.Param; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/mapper/GroupTypeMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/GroupTypeMapper.java similarity index 82% rename from falsework-sever/src/main/java/com/epri/fx/server/mapper/GroupTypeMapper.java rename to falsework-sever/src/main/java/com/fx/server/mapper/GroupTypeMapper.java index 216c873..e96c0e8 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/mapper/GroupTypeMapper.java +++ b/falsework-sever/src/main/java/com/fx/server/mapper/GroupTypeMapper.java @@ -1,6 +1,6 @@ -package com.epri.fx.server.mapper; +package com.fx.server.mapper; -import com.epri.fx.server.entity.GroupType; +import com.fx.server.entity.GroupType; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/mapper/MenuMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/MenuMapper.java similarity index 89% rename from falsework-sever/src/main/java/com/epri/fx/server/mapper/MenuMapper.java rename to falsework-sever/src/main/java/com/fx/server/mapper/MenuMapper.java index 3ab20cb..1a7c390 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/mapper/MenuMapper.java +++ b/falsework-sever/src/main/java/com/fx/server/mapper/MenuMapper.java @@ -1,7 +1,7 @@ -package com.epri.fx.server.mapper; +package com.fx.server.mapper; -import com.epri.fx.server.entity.Menu; +import com.fx.server.entity.Menu; import org.apache.ibatis.annotations.Param; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/mapper/ResourceAuthorityMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/ResourceAuthorityMapper.java similarity index 90% rename from falsework-sever/src/main/java/com/epri/fx/server/mapper/ResourceAuthorityMapper.java rename to falsework-sever/src/main/java/com/fx/server/mapper/ResourceAuthorityMapper.java index 345a46d..28e1df6 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/mapper/ResourceAuthorityMapper.java +++ b/falsework-sever/src/main/java/com/fx/server/mapper/ResourceAuthorityMapper.java @@ -1,6 +1,6 @@ -package com.epri.fx.server.mapper; +package com.fx.server.mapper; -import com.epri.fx.server.entity.ResourceAuthority; +import com.fx.server.entity.ResourceAuthority; import org.apache.ibatis.annotations.Param; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/mapper/RsaKeyMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/RsaKeyMapper.java similarity index 78% rename from falsework-sever/src/main/java/com/epri/fx/server/mapper/RsaKeyMapper.java rename to falsework-sever/src/main/java/com/fx/server/mapper/RsaKeyMapper.java index e0ea697..3429379 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/mapper/RsaKeyMapper.java +++ b/falsework-sever/src/main/java/com/fx/server/mapper/RsaKeyMapper.java @@ -1,6 +1,6 @@ -package com.epri.fx.server.mapper; +package com.fx.server.mapper; -import com.epri.fx.server.entity.RsaKey; +import com.fx.server.entity.RsaKey; public interface RsaKeyMapper { int deleteByPrimaryKey(String key); diff --git a/falsework-sever/src/main/java/com/fx/server/mapper/SysJobLogMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/SysJobLogMapper.java new file mode 100644 index 0000000..aee334d --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/mapper/SysJobLogMapper.java @@ -0,0 +1,22 @@ +package com.fx.server.mapper; + +import com.fx.server.entity.log.SysJobLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface SysJobLogMapper { + int deleteByPrimaryKey(Long jobLogId); + + int insert(SysJobLog record); + + int insertSelective(SysJobLog record); + + SysJobLog selectByPrimaryKey(Long jobLogId); + + int updateByPrimaryKeySelective(SysJobLog record); + + int updateByPrimaryKey(SysJobLog record); + List selectPage(@Param("params") Map params); +} \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/fx/server/mapper/SysLoginInforMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/SysLoginInforMapper.java new file mode 100644 index 0000000..3ef594a --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/mapper/SysLoginInforMapper.java @@ -0,0 +1,22 @@ +package com.fx.server.mapper; + +import com.fx.server.entity.log.SysLoginInfor; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface SysLoginInforMapper { + int deleteByPrimaryKey(Long infoId); + + int insert(SysLoginInfor record); + + int insertSelective(SysLoginInfor record); + + SysLoginInfor selectByPrimaryKey(Long infoId); + + int updateByPrimaryKeySelective(SysLoginInfor record); + + int updateByPrimaryKey(SysLoginInfor record); + List selectPage(@Param("params")Map params); +} \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/epri/fx/server/mapper/UserMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/UserMapper.java similarity index 89% rename from falsework-sever/src/main/java/com/epri/fx/server/mapper/UserMapper.java rename to falsework-sever/src/main/java/com/fx/server/mapper/UserMapper.java index ad866f9..c5fc7a8 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/mapper/UserMapper.java +++ b/falsework-sever/src/main/java/com/fx/server/mapper/UserMapper.java @@ -1,6 +1,6 @@ -package com.epri.fx.server.mapper; +package com.fx.server.mapper; -import com.epri.fx.server.entity.User; +import com.fx.server.entity.User; import org.apache.ibatis.annotations.Param; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/msg/BaseResponse.java b/falsework-sever/src/main/java/com/fx/server/msg/BaseResponse.java similarity index 95% rename from falsework-sever/src/main/java/com/epri/fx/server/msg/BaseResponse.java rename to falsework-sever/src/main/java/com/fx/server/msg/BaseResponse.java index 18642c8..8def288 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/msg/BaseResponse.java +++ b/falsework-sever/src/main/java/com/fx/server/msg/BaseResponse.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.msg; +package com.fx.server.msg; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/msg/ListRestResponse.java b/falsework-sever/src/main/java/com/fx/server/msg/ListRestResponse.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/msg/ListRestResponse.java rename to falsework-sever/src/main/java/com/fx/server/msg/ListRestResponse.java index a3e3570..7564ae7 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/msg/ListRestResponse.java +++ b/falsework-sever/src/main/java/com/fx/server/msg/ListRestResponse.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.msg; +package com.fx.server.msg; /** * ${DESCRIPTION} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/msg/ObjectRestResponse.java b/falsework-sever/src/main/java/com/fx/server/msg/ObjectRestResponse.java similarity index 95% rename from falsework-sever/src/main/java/com/epri/fx/server/msg/ObjectRestResponse.java rename to falsework-sever/src/main/java/com/fx/server/msg/ObjectRestResponse.java index 1dbc7e9..08f966d 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/msg/ObjectRestResponse.java +++ b/falsework-sever/src/main/java/com/fx/server/msg/ObjectRestResponse.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.msg; +package com.fx.server.msg; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/msg/TableResultResponse.java b/falsework-sever/src/main/java/com/fx/server/msg/TableResultResponse.java similarity index 95% rename from falsework-sever/src/main/java/com/epri/fx/server/msg/TableResultResponse.java rename to falsework-sever/src/main/java/com/fx/server/msg/TableResultResponse.java index 0a7622b..1fa5f36 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/msg/TableResultResponse.java +++ b/falsework-sever/src/main/java/com/fx/server/msg/TableResultResponse.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.msg; +package com.fx.server.msg; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/msg/auth/TokenErrorResponse.java b/falsework-sever/src/main/java/com/fx/server/msg/auth/TokenErrorResponse.java similarity index 67% rename from falsework-sever/src/main/java/com/epri/fx/server/msg/auth/TokenErrorResponse.java rename to falsework-sever/src/main/java/com/fx/server/msg/auth/TokenErrorResponse.java index 4197d67..b902441 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/msg/auth/TokenErrorResponse.java +++ b/falsework-sever/src/main/java/com/fx/server/msg/auth/TokenErrorResponse.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.msg.auth; +package com.fx.server.msg.auth; -import com.epri.fx.server.constant.RestCodeConstants; -import com.epri.fx.server.msg.BaseResponse; +import com.fx.server.constant.RestCodeConstants; +import com.fx.server.msg.BaseResponse; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/msg/auth/TokenForbiddenResponse.java b/falsework-sever/src/main/java/com/fx/server/msg/auth/TokenForbiddenResponse.java similarity index 68% rename from falsework-sever/src/main/java/com/epri/fx/server/msg/auth/TokenForbiddenResponse.java rename to falsework-sever/src/main/java/com/fx/server/msg/auth/TokenForbiddenResponse.java index 6b75693..c6739ad 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/msg/auth/TokenForbiddenResponse.java +++ b/falsework-sever/src/main/java/com/fx/server/msg/auth/TokenForbiddenResponse.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.msg.auth; +package com.fx.server.msg.auth; -import com.epri.fx.server.constant.RestCodeConstants; -import com.epri.fx.server.msg.BaseResponse; +import com.fx.server.constant.RestCodeConstants; +import com.fx.server.msg.BaseResponse; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/rest/AuthController.java b/falsework-sever/src/main/java/com/fx/server/rest/AuthController.java similarity index 89% rename from falsework-sever/src/main/java/com/epri/fx/server/rest/AuthController.java rename to falsework-sever/src/main/java/com/fx/server/rest/AuthController.java index 23e62de..e40af19 100755 --- a/falsework-sever/src/main/java/com/epri/fx/server/rest/AuthController.java +++ b/falsework-sever/src/main/java/com/fx/server/rest/AuthController.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.rest; +package com.fx.server.rest; -import com.epri.fx.server.msg.ObjectRestResponse; -import com.epri.fx.server.service.security.auth.AuthService; -import com.epri.fx.server.util.user.JwtAuthenticationRequest; +import com.fx.server.msg.ObjectRestResponse; +import com.fx.server.service.security.auth.AuthService; +import com.fx.server.util.user.JwtAuthenticationRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/rest/ElementController.java b/falsework-sever/src/main/java/com/fx/server/rest/ElementController.java similarity index 85% rename from falsework-sever/src/main/java/com/epri/fx/server/rest/ElementController.java rename to falsework-sever/src/main/java/com/fx/server/rest/ElementController.java index a373ccc..7b14489 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/rest/ElementController.java +++ b/falsework-sever/src/main/java/com/fx/server/rest/ElementController.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.rest; +package com.fx.server.rest; -import com.epri.fx.server.entity.Element; -import com.epri.fx.server.msg.TableResultResponse; -import com.epri.fx.server.service.ElementService; +import com.fx.server.entity.Element; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.service.ElementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/rest/GroupController.java b/falsework-sever/src/main/java/com/fx/server/rest/GroupController.java similarity index 91% rename from falsework-sever/src/main/java/com/epri/fx/server/rest/GroupController.java rename to falsework-sever/src/main/java/com/fx/server/rest/GroupController.java index 965de89..a8c9cc3 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/rest/GroupController.java +++ b/falsework-sever/src/main/java/com/fx/server/rest/GroupController.java @@ -1,10 +1,10 @@ -package com.epri.fx.server.rest; +package com.fx.server.rest; -import com.epri.fx.server.service.GroupService; -import com.epri.fx.server.vo.GroupUsers; -import com.epri.fx.server.vo.GroupVO; -import com.epri.fx.server.vo.MenuVO; +import com.fx.server.service.GroupService; +import com.fx.server.vo.GroupUsers; +import com.fx.server.vo.GroupVO; +import com.fx.server.vo.MenuVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/rest/GroupTypeController.java b/falsework-sever/src/main/java/com/fx/server/rest/GroupTypeController.java similarity index 86% rename from falsework-sever/src/main/java/com/epri/fx/server/rest/GroupTypeController.java rename to falsework-sever/src/main/java/com/fx/server/rest/GroupTypeController.java index 3cb2592..fe6add5 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/rest/GroupTypeController.java +++ b/falsework-sever/src/main/java/com/fx/server/rest/GroupTypeController.java @@ -1,10 +1,9 @@ -package com.epri.fx.server.rest; +package com.fx.server.rest; -import com.epri.fx.server.service.GroupTypeService; -import com.epri.fx.server.vo.GroupTypeVO; +import com.fx.server.service.GroupTypeService; +import com.fx.server.vo.GroupTypeVO; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/rest/HelloController.java b/falsework-sever/src/main/java/com/fx/server/rest/HelloController.java similarity index 89% rename from falsework-sever/src/main/java/com/epri/fx/server/rest/HelloController.java rename to falsework-sever/src/main/java/com/fx/server/rest/HelloController.java index de1ac21..b41fa25 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/rest/HelloController.java +++ b/falsework-sever/src/main/java/com/fx/server/rest/HelloController.java @@ -1,6 +1,6 @@ -package com.epri.fx.server.rest; +package com.fx.server.rest; -import com.epri.fx.server.service.MenuService; +import com.fx.server.service.MenuService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/rest/LogController.java b/falsework-sever/src/main/java/com/fx/server/rest/LogController.java similarity index 55% rename from falsework-sever/src/main/java/com/epri/fx/server/rest/LogController.java rename to falsework-sever/src/main/java/com/fx/server/rest/LogController.java index be4e04d..a03b46a 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/rest/LogController.java +++ b/falsework-sever/src/main/java/com/fx/server/rest/LogController.java @@ -1,22 +1,13 @@ -package com.epri.fx.server.rest; +package com.fx.server.rest; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.entity.UserInfo; -import com.epri.fx.server.entity.log.GateLog; -import com.epri.fx.server.entity.log.LogInfo; -import com.epri.fx.server.msg.ObjectRestResponse; -import com.epri.fx.server.msg.TableResultResponse; -import com.epri.fx.server.service.PermissionService; -import com.epri.fx.server.service.UserService; -import com.epri.fx.server.service.log.GateLogService; -import com.epri.fx.server.vo.FrontUser; -import com.epri.fx.server.vo.MenuVO; -import com.epri.fx.server.vo.PermissionInfo; +import com.fx.server.entity.log.GateLog; +import com.fx.server.msg.ObjectRestResponse; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.service.log.GateLogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.List; import java.util.Map; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/rest/LoginController.java b/falsework-sever/src/main/java/com/fx/server/rest/LoginController.java similarity index 86% rename from falsework-sever/src/main/java/com/epri/fx/server/rest/LoginController.java rename to falsework-sever/src/main/java/com/fx/server/rest/LoginController.java index 2f1ee57..0fc4ea6 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/rest/LoginController.java +++ b/falsework-sever/src/main/java/com/fx/server/rest/LoginController.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.rest; +package com.fx.server.rest; import org.springframework.web.bind.annotation.RestController; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/rest/MenuController.java b/falsework-sever/src/main/java/com/fx/server/rest/MenuController.java similarity index 86% rename from falsework-sever/src/main/java/com/epri/fx/server/rest/MenuController.java rename to falsework-sever/src/main/java/com/fx/server/rest/MenuController.java index 50ef9d4..240574a 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/rest/MenuController.java +++ b/falsework-sever/src/main/java/com/fx/server/rest/MenuController.java @@ -1,9 +1,8 @@ -package com.epri.fx.server.rest; +package com.fx.server.rest; -import com.epri.fx.server.entity.Menu; -import com.epri.fx.server.service.MenuService; -import com.epri.fx.server.vo.MenuVO; +import com.fx.server.service.MenuService; +import com.fx.server.vo.MenuVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; diff --git a/falsework-sever/src/main/java/com/fx/server/rest/SysJobController.java b/falsework-sever/src/main/java/com/fx/server/rest/SysJobController.java new file mode 100644 index 0000000..bc125d8 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/rest/SysJobController.java @@ -0,0 +1,86 @@ +package com.fx.server.rest; + +import com.fx.server.entity.SysJob; +import com.fx.server.entity.log.SysJobLog; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.service.log.SysJobLogService; +import com.fx.server.service.quartz.SysJobService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @className: QuartzController + * @author: liwen + * @date: 2020/12/25 08:53 + */ +@RestController +@RequestMapping("job") +public class SysJobController { + @Autowired + private SysJobService sysJobService; + @Autowired + private SysJobLogService sysJobLogService; + + @GetMapping("/list") + @ResponseBody + public List getAllJob(String jobName, String jobGroup, String jobStatus) { + SysJob queryJob = new SysJob(); + queryJob.setJobName(jobName); + queryJob.setJobGroupName(jobGroup); + queryJob.setJobStatus(jobStatus); + return sysJobService.queryAllJob(jobName, jobGroup, jobStatus); + } + + @GetMapping("/log/list") + @ResponseBody + public TableResultResponse getAllJob(@RequestParam Map params) { + + return sysJobLogService.getPageList(params); + } + + @PostMapping("") + @ResponseBody + public Integer addJob(@RequestBody SysJob sysJob) { + + return sysJobService.addJob(sysJob); + } + + @PutMapping("") + @ResponseBody + public Integer updateJob(@RequestBody SysJob sysJob) { + + return sysJobService.updateJob(sysJob); + } + + @DeleteMapping("/{jobName}/{jobGroupName}") + @ResponseBody + public Integer deleteJob(@PathVariable("jobName") String jobName, @PathVariable("jobGroupName") String jobGroupName) { + + return sysJobService.deleteJob(jobName, jobGroupName); + } + + @PutMapping("pause/{jobName}/{jobGroupName}") + @ResponseBody + public Integer pauseJob(@PathVariable("jobName") String jobName, @PathVariable("jobGroupName") String jobGroupName) { + + return sysJobService.pauseJob(jobName, jobGroupName); + } + + @PutMapping("resume/{jobName}/{jobGroupName}") + @ResponseBody + public Integer resumeJob(@PathVariable("jobName") String jobName, @PathVariable("jobGroupName") String jobGroupName) { + + return sysJobService.resumeJob(jobName, jobGroupName); + } + + @PutMapping("run/{jobName}/{jobGroupName}") + @ResponseBody + public Integer runAJobNow(@PathVariable("jobName") String jobName, @PathVariable("jobGroupName") String jobGroupName) { + + return sysJobService.runAJobNow(jobName, jobGroupName); + } +} diff --git a/falsework-sever/src/main/java/com/fx/server/rest/SysLoginInfoController.java b/falsework-sever/src/main/java/com/fx/server/rest/SysLoginInfoController.java new file mode 100644 index 0000000..ec71c8b --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/rest/SysLoginInfoController.java @@ -0,0 +1,29 @@ +package com.fx.server.rest; + +import com.fx.server.entity.log.SysLoginInfor; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.service.log.SysLoginInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * @description: + * @className: SysLoginInfoController + * @author: liwen + * @date: 2021/1/4 13:21 + */ +@RestController() +@RequestMapping("log/login") +public class SysLoginInfoController { + + @Autowired + private SysLoginInfoService sysLoginInfoService; + + @GetMapping("/list") + @ResponseBody + private TableResultResponse getSysloginInforList(@RequestParam Map params) { + return sysLoginInfoService.getPageList(params); + } +} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/rest/UserController.java b/falsework-sever/src/main/java/com/fx/server/rest/UserController.java similarity index 72% rename from falsework-sever/src/main/java/com/epri/fx/server/rest/UserController.java rename to falsework-sever/src/main/java/com/fx/server/rest/UserController.java index 7e33e8f..14abd11 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/rest/UserController.java +++ b/falsework-sever/src/main/java/com/fx/server/rest/UserController.java @@ -1,18 +1,18 @@ -package com.epri.fx.server.rest; +package com.fx.server.rest; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.entity.UserInfo; -import com.epri.fx.server.msg.ObjectRestResponse; -import com.epri.fx.server.msg.TableResultResponse; -import com.epri.fx.server.service.PermissionService; -import com.epri.fx.server.service.UserService; -import com.epri.fx.server.vo.FrontUser; -import com.epri.fx.server.vo.MenuVO; -import com.epri.fx.server.vo.PermissionInfo; -import com.epri.fx.server.vo.UserVO; +import com.fx.server.entity.User; +import com.fx.server.entity.UserInfo; +import com.fx.server.entity.log.SysLoginInfor; +import com.fx.server.msg.ObjectRestResponse; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.service.PermissionService; +import com.fx.server.service.UserService; +import com.fx.server.vo.FrontUser; +import com.fx.server.vo.MenuVO; +import com.fx.server.vo.PermissionInfo; +import com.fx.server.websocket.WebSocketMessageHandler; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -20,9 +20,7 @@ import java.util.Map; /** - * * @Description: - * * @param: * @return: * @auther: liwen @@ -36,6 +34,8 @@ public class UserController { @Autowired private PermissionService permissionService; + @Autowired + private WebSocketMessageHandler webSocketMessageHandler; @GetMapping(value = "/page") @ResponseBody @@ -44,12 +44,20 @@ public class UserController { return userService.getPageList(params); } + @GetMapping(value = "/online/list") + @ResponseBody + public List getOnlineUsers() { + + return webSocketMessageHandler.getOnlineUsers(); + } + @PutMapping("/{id}") @ResponseBody public ObjectRestResponse update(@PathVariable int id, @RequestBody User entity) { return userService.update(entity); } + @PutMapping("/password/{id}") @ResponseBody public ObjectRestResponse restPasswrod(@PathVariable Integer id) { @@ -65,6 +73,14 @@ public class UserController { return userService.add(entity); } + @PostMapping("/retreat/{userId}") + @ResponseBody + public ObjectRestResponse retreat(@PathVariable("userId") String userId) { + + + return new ObjectRestResponse().rel(webSocketMessageHandler.retreat(userId)); + } + @DeleteMapping("/{id}") @ResponseBody @@ -107,4 +123,5 @@ public class UserController { return permissionService.getMenusByUsername(token); } + } diff --git a/falsework-sever/src/main/java/com/epri/fx/server/runner/AuthServerRunner.java b/falsework-sever/src/main/java/com/fx/server/runner/AuthServerRunner.java similarity index 86% rename from falsework-sever/src/main/java/com/epri/fx/server/runner/AuthServerRunner.java rename to falsework-sever/src/main/java/com/fx/server/runner/AuthServerRunner.java index 8aa512f..6b2cf7c 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/runner/AuthServerRunner.java +++ b/falsework-sever/src/main/java/com/fx/server/runner/AuthServerRunner.java @@ -1,10 +1,9 @@ -package com.epri.fx.server.runner; +package com.fx.server.runner; -import com.epri.fx.server.config.KeyConfiguration; -import com.epri.fx.server.config.UserAuthConfig; -import com.epri.fx.server.entity.RsaKey; -import com.epri.fx.server.jwt.RsaKeyHelper; -import com.epri.fx.server.service.RsaKeyService; +import com.fx.server.config.KeyConfiguration; +import com.fx.server.config.UserAuthConfig; +import com.fx.server.jwt.RsaKeyHelper; +import com.fx.server.service.RsaKeyService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Configuration; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/ElementService.java b/falsework-sever/src/main/java/com/fx/server/service/ElementService.java similarity index 85% rename from falsework-sever/src/main/java/com/epri/fx/server/service/ElementService.java rename to falsework-sever/src/main/java/com/fx/server/service/ElementService.java index ff19aef..0f984ed 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/ElementService.java +++ b/falsework-sever/src/main/java/com/fx/server/service/ElementService.java @@ -1,9 +1,9 @@ -package com.epri.fx.server.service; +package com.fx.server.service; -import com.epri.fx.server.entity.Element; -import com.epri.fx.server.mapper.ElementMapper; -import com.epri.fx.server.msg.TableResultResponse; -import com.epri.fx.server.util.EntityUtils; +import com.fx.server.entity.Element; +import com.fx.server.mapper.ElementMapper; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/GroupService.java b/falsework-sever/src/main/java/com/fx/server/service/GroupService.java similarity index 93% rename from falsework-sever/src/main/java/com/epri/fx/server/service/GroupService.java rename to falsework-sever/src/main/java/com/fx/server/service/GroupService.java index 86f2389..37e8522 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/GroupService.java +++ b/falsework-sever/src/main/java/com/fx/server/service/GroupService.java @@ -1,16 +1,16 @@ -package com.epri.fx.server.service; +package com.fx.server.service; -import com.epri.fx.server.constant.AdminCommonConstant; -import com.epri.fx.server.entity.Element; -import com.epri.fx.server.entity.Group; -import com.epri.fx.server.entity.Menu; -import com.epri.fx.server.entity.ResourceAuthority; -import com.epri.fx.server.mapper.*; -import com.epri.fx.server.util.EntityUtils; -import com.epri.fx.server.vo.ElementVO; -import com.epri.fx.server.vo.GroupUsers; -import com.epri.fx.server.vo.GroupVO; -import com.epri.fx.server.vo.MenuVO; +import com.fx.server.constant.AdminCommonConstant; +import com.fx.server.entity.Element; +import com.fx.server.entity.Group; +import com.fx.server.entity.Menu; +import com.fx.server.entity.ResourceAuthority; +import com.fx.server.mapper.*; +import com.fx.server.util.EntityUtils; +import com.fx.server.vo.ElementVO; +import com.fx.server.vo.GroupUsers; +import com.fx.server.vo.GroupVO; +import com.fx.server.vo.MenuVO; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -19,7 +19,6 @@ import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/GroupTypeService.java b/falsework-sever/src/main/java/com/fx/server/service/GroupTypeService.java similarity index 88% rename from falsework-sever/src/main/java/com/epri/fx/server/service/GroupTypeService.java rename to falsework-sever/src/main/java/com/fx/server/service/GroupTypeService.java index ea89304..f175c1f 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/GroupTypeService.java +++ b/falsework-sever/src/main/java/com/fx/server/service/GroupTypeService.java @@ -1,9 +1,9 @@ -package com.epri.fx.server.service; +package com.fx.server.service; -import com.epri.fx.server.entity.GroupType; -import com.epri.fx.server.mapper.GroupTypeMapper; -import com.epri.fx.server.util.EntityUtils; -import com.epri.fx.server.vo.GroupTypeVO; +import com.fx.server.entity.GroupType; +import com.fx.server.mapper.GroupTypeMapper; +import com.fx.server.util.EntityUtils; +import com.fx.server.vo.GroupTypeVO; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/MenuService.java b/falsework-sever/src/main/java/com/fx/server/service/MenuService.java similarity index 80% rename from falsework-sever/src/main/java/com/epri/fx/server/service/MenuService.java rename to falsework-sever/src/main/java/com/fx/server/service/MenuService.java index c14398b..4d0da30 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/MenuService.java +++ b/falsework-sever/src/main/java/com/fx/server/service/MenuService.java @@ -1,24 +1,19 @@ -package com.epri.fx.server.service; +package com.fx.server.service; -import com.epri.fx.server.constant.AdminCommonConstant; -import com.epri.fx.server.entity.Element; -import com.epri.fx.server.entity.Menu; -import com.epri.fx.server.entity.ResourceAuthority; -import com.epri.fx.server.mapper.ElementMapper; -import com.epri.fx.server.mapper.MenuMapper; -import com.epri.fx.server.mapper.ResourceAuthorityMapper; -import com.epri.fx.server.util.EntityUtils; -import com.epri.fx.server.vo.ElementVO; -import com.epri.fx.server.vo.GroupVO; -import com.epri.fx.server.vo.MenuVO; +import com.fx.server.constant.AdminCommonConstant; +import com.fx.server.entity.Menu; +import com.fx.server.mapper.ElementMapper; +import com.fx.server.mapper.MenuMapper; +import com.fx.server.mapper.ResourceAuthorityMapper; +import com.fx.server.util.EntityUtils; +import com.fx.server.vo.ElementVO; +import com.fx.server.vo.MenuVO; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** * @description: diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/PermissionService.java b/falsework-sever/src/main/java/com/fx/server/service/PermissionService.java similarity index 91% rename from falsework-sever/src/main/java/com/epri/fx/server/service/PermissionService.java rename to falsework-sever/src/main/java/com/fx/server/service/PermissionService.java index dacd8fc..6422186 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/PermissionService.java +++ b/falsework-sever/src/main/java/com/fx/server/service/PermissionService.java @@ -1,17 +1,17 @@ -package com.epri.fx.server.service; +package com.fx.server.service; -import com.epri.fx.server.constant.AdminCommonConstant; -import com.epri.fx.server.constant.CommonConstants; -import com.epri.fx.server.entity.Element; -import com.epri.fx.server.entity.Menu; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.entity.UserInfo; -import com.epri.fx.server.jwt.UserAuthUtil; -import com.epri.fx.server.util.EncryptUtil; -import com.epri.fx.server.vo.FrontUser; -import com.epri.fx.server.vo.GroupVO; -import com.epri.fx.server.vo.MenuVO; -import com.epri.fx.server.vo.PermissionInfo; +import com.fx.server.constant.AdminCommonConstant; +import com.fx.server.constant.CommonConstants; +import com.fx.server.entity.Element; +import com.fx.server.entity.Menu; +import com.fx.server.entity.User; +import com.fx.server.entity.UserInfo; +import com.fx.server.jwt.UserAuthUtil; +import com.fx.server.util.EncryptUtil; +import com.fx.server.vo.FrontUser; +import com.fx.server.vo.GroupVO; +import com.fx.server.vo.MenuVO; +import com.fx.server.vo.PermissionInfo; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/RsaKeyService.java b/falsework-sever/src/main/java/com/fx/server/service/RsaKeyService.java similarity index 86% rename from falsework-sever/src/main/java/com/epri/fx/server/service/RsaKeyService.java rename to falsework-sever/src/main/java/com/fx/server/service/RsaKeyService.java index 211042d..13389e4 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/RsaKeyService.java +++ b/falsework-sever/src/main/java/com/fx/server/service/RsaKeyService.java @@ -1,7 +1,7 @@ -package com.epri.fx.server.service; +package com.fx.server.service; -import com.epri.fx.server.entity.RsaKey; -import com.epri.fx.server.mapper.RsaKeyMapper; +import com.fx.server.entity.RsaKey; +import com.fx.server.mapper.RsaKeyMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/UserService.java b/falsework-sever/src/main/java/com/fx/server/service/UserService.java similarity index 78% rename from falsework-sever/src/main/java/com/epri/fx/server/service/UserService.java rename to falsework-sever/src/main/java/com/fx/server/service/UserService.java index 9d95921..772f968 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/UserService.java +++ b/falsework-sever/src/main/java/com/fx/server/service/UserService.java @@ -1,26 +1,20 @@ -package com.epri.fx.server.service; +package com.fx.server.service; import com.alibaba.druid.util.StringUtils; -import com.epri.fx.server.constant.UserConstant; -import com.epri.fx.server.entity.Menu; -import com.epri.fx.server.entity.User; -import com.epri.fx.server.entity.UserInfo; -import com.epri.fx.server.mapper.MenuMapper; -import com.epri.fx.server.mapper.UserMapper; -import com.epri.fx.server.msg.ObjectRestResponse; -import com.epri.fx.server.msg.TableResultResponse; -import com.epri.fx.server.util.EntityUtils; -import com.epri.fx.server.util.Query; -import com.epri.fx.server.util.user.JwtAuthenticationRequest; -import com.epri.fx.server.vo.UserVO; +import com.fx.server.constant.UserConstant; +import com.fx.server.entity.User; +import com.fx.server.entity.UserInfo; +import com.fx.server.mapper.UserMapper; +import com.fx.server.msg.ObjectRestResponse; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.util.EntityUtils; +import com.fx.server.util.Query; +import com.fx.server.util.user.JwtAuthenticationRequest; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Map; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/log/GateLogService.java b/falsework-sever/src/main/java/com/fx/server/service/log/GateLogService.java similarity index 82% rename from falsework-sever/src/main/java/com/epri/fx/server/service/log/GateLogService.java rename to falsework-sever/src/main/java/com/fx/server/service/log/GateLogService.java index 408f9a9..db07483 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/log/GateLogService.java +++ b/falsework-sever/src/main/java/com/fx/server/service/log/GateLogService.java @@ -1,12 +1,12 @@ -package com.epri.fx.server.service.log; +package com.fx.server.service.log; import com.alibaba.druid.util.StringUtils; -import com.epri.fx.server.entity.log.GateLog; -import com.epri.fx.server.entity.log.LogInfo; -import com.epri.fx.server.mapper.GateLogMapper; -import com.epri.fx.server.msg.ObjectRestResponse; -import com.epri.fx.server.msg.TableResultResponse; -import com.epri.fx.server.util.Query; +import com.fx.server.entity.log.GateLog; +import com.fx.server.entity.log.LogInfo; +import com.fx.server.mapper.GateLogMapper; +import com.fx.server.msg.ObjectRestResponse; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.util.Query; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import org.springframework.beans.BeanUtils; diff --git a/falsework-sever/src/main/java/com/fx/server/service/log/SysJobLogService.java b/falsework-sever/src/main/java/com/fx/server/service/log/SysJobLogService.java new file mode 100644 index 0000000..363f05e --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/service/log/SysJobLogService.java @@ -0,0 +1,38 @@ +package com.fx.server.service.log; + +import com.fx.server.entity.log.SysJobLog; +import com.fx.server.mapper.SysJobLogMapper; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.util.Query; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @className: SysJobLogServer + * @author: liwen + * @date: 2020/12/28 16:37 + */ +@Service +public class SysJobLogService { + @Autowired + private SysJobLogMapper sysJobLogMapper; + + public void addSysJobLog(SysJobLog sysJobLog) { + sysJobLogMapper.insert(sysJobLog); + } + + public TableResultResponse getPageList(Map params) { + + Query query = new Query(params); + Page page = PageHelper.startPage(query.getPage(), query.getLimit()); + List list = sysJobLogMapper.selectPage(params); + int total = (int) Math.ceil(page.getTotal() / (float) query.getLimit()); + return new TableResultResponse(total == 0 ? 1 : total, list); + } +} diff --git a/falsework-sever/src/main/java/com/fx/server/service/log/SysLoginInfoService.java b/falsework-sever/src/main/java/com/fx/server/service/log/SysLoginInfoService.java new file mode 100644 index 0000000..a026270 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/service/log/SysLoginInfoService.java @@ -0,0 +1,38 @@ +package com.fx.server.service.log; + +import com.fx.server.entity.log.SysLoginInfor; +import com.fx.server.mapper.SysLoginInforMapper; +import com.fx.server.msg.TableResultResponse; +import com.fx.server.util.Query; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @className: SysJobLogServer + * @author: liwen + * @date: 2020/12/28 16:37 + */ +@Service +public class SysLoginInfoService { + @Autowired + private SysLoginInforMapper sysLoginInforMapper; + + public int addSysJobLog(SysLoginInfor sysLoginInfor) { + return sysLoginInforMapper.insertSelective(sysLoginInfor); + } + + public TableResultResponse getPageList(Map params) { + + Query query = new Query(params); + Page page = PageHelper.startPage(query.getPage(), query.getLimit()); + List list = sysLoginInforMapper.selectPage(params); + int total = (int) Math.ceil(page.getTotal() / (float) query.getLimit()); + return new TableResultResponse(total == 0 ? 1 : total, list); + } +} diff --git a/falsework-sever/src/main/java/com/fx/server/service/quartz/SysJobService.java b/falsework-sever/src/main/java/com/fx/server/service/quartz/SysJobService.java new file mode 100644 index 0000000..8c50b87 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/service/quartz/SysJobService.java @@ -0,0 +1,287 @@ +package com.fx.server.service.quartz; + +import com.fx.server.constant.CommonConstants; +import com.fx.server.entity.SysJob; +import org.apache.commons.lang3.StringUtils; +import org.quartz.*; +import org.quartz.impl.matchers.GroupMatcher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.*; + +@Service +public class SysJobService { + @Autowired + private Scheduler scheduler; + + @PostConstruct + public void startScheduler() { + + try { + scheduler.start(); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + /** + * 增加一个job + * + * @param jobClass 任务实现类 + * @param jobName 任务名称 + * @param jobGroupName 任务组名 + * @param jobTime 时间表达式 (这是每隔多少秒为一次任务) + * @param jobTimes 运行的次数 (<0:表示不限次数) + * @param jobData 参数 + */ + public void addJob(Class jobClass, String jobName, String jobGroupName, int jobTime, + int jobTimes, Map jobData) { + try { + // 任务名称和组构成任务key + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName) + .build(); + // 设置job参数 + if (jobData != null && jobData.size() > 0) { + jobDetail.getJobDataMap().putAll(jobData); + } + // 使用simpleTrigger规则 + Trigger trigger = null; + if (jobTimes < 0) { + trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName) + .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withIntervalInSeconds(jobTime)) + .startNow().build(); + } else { + trigger = TriggerBuilder + .newTrigger().withIdentity(jobName, jobGroupName).withSchedule(SimpleScheduleBuilder + .repeatSecondlyForever(1).withIntervalInSeconds(jobTime).withRepeatCount(jobTimes)) + .startNow().build(); + } + scheduler.scheduleJob(jobDetail, trigger); + } catch (SchedulerException e) { + e.printStackTrace(); + } + } + + /** + * 增加一个job + */ + public Integer addJob(SysJob sysJob) { + try { + // 创建jobDetail实例,绑定Job实现类 + // 指明job的名称,所在组的名称,以及绑定job类 + // 任务名称和组构成任务key + JobDetail jobDetail = JobBuilder.newJob((Class) Class.forName(sysJob.getJobClass())).withIdentity(sysJob.getJobName(), sysJob.getJobGroupName()) + .build(); + jobDetail.getJobDataMap().put(CommonConstants.TASK_PROPERTIES, sysJob); + + // 设置job参数 + if (StringUtils.isNotBlank(sysJob.getParames())) { + jobDetail.getJobDataMap().put(CommonConstants.TASK_PARAMETERS, sysJob.getParames()); + } + // 定义调度触发规则 + // 使用cornTrigger规则 + // 触发器key + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(sysJob.getJobName(), sysJob.getJobGroupName()).withDescription(sysJob.getDescription()) + .startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.SECOND)) + .withSchedule(CronScheduleBuilder.cronSchedule(sysJob.getJobTime())).startNow().build(); + // 把作业和触发器注册到任务调度中 + scheduler.scheduleJob(jobDetail, trigger); + return 0; + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + } + + /** + * 修改 一个job的 时间表达式 + */ + public Integer updateJob(SysJob sysJob) { + try { + TriggerKey triggerKey = TriggerKey.triggerKey(sysJob.getJobName(), sysJob.getJobGroupName()); + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey) + .withSchedule(CronScheduleBuilder.cronSchedule(sysJob.getJobTime())).withDescription(sysJob.getDescription()).build(); + JobKey jobKey = JobKey.jobKey(sysJob.getJobName(), sysJob.getJobGroupName()); + JobDetail jobDetail = scheduler.getJobDetail(jobKey); + + // 设置job参数 + if (StringUtils.isNotBlank(sysJob.getParames())) { + jobDetail.getJobDataMap().put(CommonConstants.TASK_PARAMETERS, sysJob.getParames()); + } + + // 重启触发器 + scheduler.rescheduleJob(triggerKey, trigger); + + return 0; + } catch (SchedulerException e) { + e.printStackTrace(); + return -1; + } + } + + /** + * 删除任务一个job + * + * @param jobName 任务名称 + * @param jobGroupName 任务组名 + */ + public Integer deleteJob(String jobName, String jobGroupName) { + try { + scheduler.deleteJob(new JobKey(jobName, jobGroupName)); + return 0; + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + } + + /** + * 暂停一个job + * + * @param jobName + * @param jobGroupName + */ + public Integer pauseJob(String jobName, String jobGroupName) { + try { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + scheduler.pauseJob(jobKey); + return 0; + } catch (SchedulerException e) { + e.printStackTrace(); + return -1; + } + } + + /** + * 恢复一个job + * + * @param jobName + * @param jobGroupName + */ + public Integer resumeJob(String jobName, String jobGroupName) { + try { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + scheduler.resumeJob(jobKey); + return 0; + } catch (SchedulerException e) { + e.printStackTrace(); + return -1; + } + } + + /** + * 立即执行一个job + * + * @param jobName + * @param jobGroupName + */ + public Integer runAJobNow(String jobName, String jobGroupName) { + try { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + scheduler.triggerJob(jobKey); + return 0; + } catch (SchedulerException e) { + e.printStackTrace(); + return -1; + } + } + + /** + * 获取所有计划中的任务列表 + * + * @return + */ + public List queryAllJob(String jobName,String jobGroup,String jobStatus) { + List jobList = null; + try { + GroupMatcher matcher = GroupMatcher.anyJobGroup(); + Set jobKeys = scheduler.getJobKeys(matcher); + jobList = new ArrayList<>(); + for (JobKey jobKey : jobKeys) { + List triggers = scheduler.getTriggersOfJob(jobKey); + for (Trigger trigger : triggers) { + + SysJob sysJob = new SysJob(); + sysJob.setJobName(jobKey.getName()); + sysJob.setJobClass(scheduler.getJobDetail(trigger.getJobKey()).getJobClass().getName()); + sysJob.setJobGroupName(jobKey.getGroup()); + sysJob.setDescription(trigger.getDescription()); + sysJob.setParames(scheduler.getJobDetail(trigger.getJobKey()).getJobDataMap().getString(CommonConstants.TASK_PARAMETERS)); + Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); + sysJob.setJobStatus(triggerState.name()); + if (trigger instanceof CronTrigger) { + CronTrigger cronTrigger = (CronTrigger) trigger; + String cronExpression = cronTrigger.getCronExpression(); + sysJob.setJobTime(cronExpression); + } + + boolean a = false; + boolean b = false; + boolean c = false; + if (StringUtils.isBlank(jobName)) { + a = true; + } else { + a = jobKey.getName().toLowerCase().contains(jobName); + } + if (StringUtils.isBlank(jobGroup)) { + b = true; + } else { + b = jobKey.getGroup().equalsIgnoreCase(jobGroup); + } + if (StringUtils.isBlank(jobStatus)) { + c = true; + } else { + c = triggerState.name().equalsIgnoreCase(jobStatus); + } + if (a && b && c) { + jobList.add(sysJob); + + } + } + } + } catch (SchedulerException e) { + e.printStackTrace(); + } + return jobList; + } + + /** + * 获取所有正在运行的job + * + * @return + */ + public List queryRunJob() { + List jobList = null; + try { + List executingJobs = scheduler.getCurrentlyExecutingJobs(); + jobList = new ArrayList<>(executingJobs.size()); + for (JobExecutionContext executingJob : executingJobs) { + SysJob sysJob = new SysJob(); + JobDetail jobDetail = executingJob.getJobDetail(); + JobKey jobKey = jobDetail.getKey(); + Trigger trigger = executingJob.getTrigger(); + sysJob.setJobName(jobKey.getName()); + sysJob.setJobGroupName(jobKey.getGroup()); + sysJob.setDescription("触发器:" + trigger.getKey()); + sysJob.setJobClass(scheduler.getJobDetail(trigger.getJobKey()).getJobClass().toString()); + + sysJob.setParames(scheduler.getJobDetail(trigger.getJobKey()).getJobDataMap().getString(CommonConstants.TASK_PARAMETERS)); + + Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); + sysJob.setJobStatus(triggerState.name()); + if (trigger instanceof CronTrigger) { + CronTrigger cronTrigger = (CronTrigger) trigger; + String cronExpression = cronTrigger.getCronExpression(); + sysJob.setJobTime(cronExpression); + } + jobList.add(sysJob); + } + } catch (SchedulerException e) { + e.printStackTrace(); + } + return jobList; + } +} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/security/auth/AuthService.java b/falsework-sever/src/main/java/com/fx/server/service/security/auth/AuthService.java similarity index 66% rename from falsework-sever/src/main/java/com/epri/fx/server/service/security/auth/AuthService.java rename to falsework-sever/src/main/java/com/fx/server/service/security/auth/AuthService.java index 533b2cf..ab6fa71 100755 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/security/auth/AuthService.java +++ b/falsework-sever/src/main/java/com/fx/server/service/security/auth/AuthService.java @@ -1,7 +1,7 @@ -package com.epri.fx.server.service.security.auth; +package com.fx.server.service.security.auth; -import com.epri.fx.server.util.user.JwtAuthenticationRequest; +import com.fx.server.util.user.JwtAuthenticationRequest; public interface AuthService { String login(JwtAuthenticationRequest authenticationRequest) throws Exception; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/service/security/auth/impl/AuthServiceImpl.java b/falsework-sever/src/main/java/com/fx/server/service/security/auth/impl/AuthServiceImpl.java similarity index 74% rename from falsework-sever/src/main/java/com/epri/fx/server/service/security/auth/impl/AuthServiceImpl.java rename to falsework-sever/src/main/java/com/fx/server/service/security/auth/impl/AuthServiceImpl.java index 761e85a..b519ed1 100755 --- a/falsework-sever/src/main/java/com/epri/fx/server/service/security/auth/impl/AuthServiceImpl.java +++ b/falsework-sever/src/main/java/com/fx/server/service/security/auth/impl/AuthServiceImpl.java @@ -1,12 +1,12 @@ -package com.epri.fx.server.service.security.auth.impl; +package com.fx.server.service.security.auth.impl; -import com.epri.fx.server.entity.UserInfo; -import com.epri.fx.server.exception.auth.UserInvalidException; -import com.epri.fx.server.jwt.JWTInfo; -import com.epri.fx.server.service.security.auth.AuthService; -import com.epri.fx.server.service.UserService; -import com.epri.fx.server.util.user.JwtAuthenticationRequest; -import com.epri.fx.server.util.user.JwtTokenUtil; +import com.fx.server.entity.UserInfo; +import com.fx.server.exception.auth.UserInvalidException; +import com.fx.server.jwt.JWTInfo; +import com.fx.server.service.security.auth.AuthService; +import com.fx.server.service.UserService; +import com.fx.server.util.user.JwtAuthenticationRequest; +import com.fx.server.util.user.JwtTokenUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/ClientUtil.java b/falsework-sever/src/main/java/com/fx/server/util/ClientUtil.java similarity index 94% rename from falsework-sever/src/main/java/com/epri/fx/server/util/ClientUtil.java rename to falsework-sever/src/main/java/com/fx/server/util/ClientUtil.java index 968f504..a4cb1c2 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/ClientUtil.java +++ b/falsework-sever/src/main/java/com/fx/server/util/ClientUtil.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.util; +package com.fx.server.util; import javax.servlet.http.HttpServletRequest; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/DBLog.java b/falsework-sever/src/main/java/com/fx/server/util/DBLog.java similarity index 94% rename from falsework-sever/src/main/java/com/epri/fx/server/util/DBLog.java rename to falsework-sever/src/main/java/com/fx/server/util/DBLog.java index fd4af93..6a27502 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/DBLog.java +++ b/falsework-sever/src/main/java/com/fx/server/util/DBLog.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.util; +package com.fx.server.util; -import com.epri.fx.server.entity.log.LogInfo; -import com.epri.fx.server.service.log.GateLogService; +import com.fx.server.entity.log.LogInfo; +import com.fx.server.service.log.GateLogService; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; diff --git a/falsework-sever/src/main/java/com/fx/server/util/DateUtils.java b/falsework-sever/src/main/java/com/fx/server/util/DateUtils.java new file mode 100644 index 0000000..7301b09 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/util/DateUtils.java @@ -0,0 +1,514 @@ +package com.fx.server.util; + +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import org.apache.commons.lang3.time.DateFormatUtils; + +public class DateUtils { + + /** + * 仅显示年月日,例如 2015-08-11. + */ + public static final String DATE_FORMAT = "yyyy-MM-dd"; + /** + * 显示年月日时分秒,例如 2015-08-11 09:51:53. + */ + public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + /** + * 仅显示时分秒,例如 09:51:53. + */ + public static final String TIME_FORMAT = "HH:mm:ss"; + + /** + * 每天的毫秒数 8640000. + */ + public static final long MILLISECONDS_PER_DAY = 86400000L; + + /** + * 每周的天数. + */ + public static final long DAYS_PER_WEEK = 7L; + + /** + * 每小时毫秒数. + */ + public static final long MILLISECONDS_PER_HOUR = 3600000L; + + /** + * 每分钟秒数. + */ + public static final long SECONDS_PER_MINUTE = 60L; + + /** + * 每小时秒数. + */ + public static final long SECONDS_PER_HOUR = 3600L; + + /** + * 每天秒数. + */ + public static final long SECONDS_PER_DAY = 86400L; + + /** + * 每个月秒数,默认每月30天. + */ + public static final long SECONDS_PER_MONTH = 2592000L; + + /** + * 每年秒数,默认每年365天. + */ + public static final long SECONDS_PER_YEAR = 31536000L; + + /** + * 常用的时间格式. + */ + private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd", + "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm"}; + + /** + * 得到当前日期字符串. + * + * @return String 日期字符串,例如2015-08-11 + * @since 1.0 + */ + public static String getDate() { + return getDate(DateUtils.DATE_FORMAT); + } + + /** + * 得到当前时间字符串. + * + * @return String 时间字符串,例如 09:51:53 + * @since 1.0 + */ + public static String getTime() { + return formatDate(new Date(), DateUtils.TIME_FORMAT); + } + + /** + * 得到当前日期和时间字符串. + * + * @return String 日期和时间字符串,例如 2015-08-11 09:51:53 + * @since 1.0 + */ + public static String getDateTime() { + return formatDate(new Date(), DateUtils.DATETIME_FORMAT); + } + + /** + * 获取当前时间指定格式下的字符串. + * + * @param pattern 转化后时间展示的格式,例如"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"等 + * @return String 格式转换之后的时间字符串. + * @since 1.0 + */ + public static String getDate(String pattern) { + return DateFormatUtils.format(new Date(), pattern); + } + + /** + * 获取指定日期的字符串格式. + * + * @param date 需要格式化的时间,不能为空 + * @param pattern 时间格式,例如"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"等 + * @return String 格式转换之后的时间字符串. + * @since 1.0 + */ + public static String getDate(Date date, String pattern) { + return DateFormatUtils.format(date, pattern); + } + + /** + * 获取日期时间字符串,默认格式为(yyyy-MM-dd). + * + * @param date 需要转化的日期时间 + * @param pattern 时间格式,例如"yyyy-MM-dd" "HH:mm:ss" "E"等 + * @return String 格式转换后的时间字符串 + * @since 1.0 + */ + public static String formatDate(Date date, Object... pattern) { + String formatDate = null; + if (pattern != null && pattern.length > 0) { + formatDate = DateFormatUtils.format(date, pattern[0].toString()); + } else { + formatDate = DateFormatUtils.format(date, DateUtils.DATE_FORMAT); + } + return formatDate; + } + + /** + * 获取当前年份字符串. + * + * @return String 当前年份字符串,例如 2015 + * @since 1.0 + */ + public static String getYear() { + return formatDate(new Date(), "yyyy"); + } + + /** + * 获取当前月份字符串. + * + * @return String 当前月份字符串,例如 08 + * @since 1.0 + */ + public static String getMonth() { + return formatDate(new Date(), "MM"); + } + + /** + * 获取当前天数字符串. + * + * @return String 当前天数字符串,例如 11 + * @since 1.0 + */ + public static String getDay() { + return formatDate(new Date(), "dd"); + } + + /** + * 获取当前星期字符串. + * + * @return String 当前星期字符串,例如星期二 + * @since 1.0 + */ + public static String getWeek() { + return formatDate(new Date(), "E"); + } + + /** + * 将日期型字符串转换为日期格式. + * 支持的日期字符串格式包括"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", + * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" + * + * @param str + * @return Date + * @since 1.0 + */ + public static Date parseDate(Object str) { + if (str == null) { + return null; + } + try { + return org.apache.commons.lang3.time.DateUtils.parseDate(str.toString(), parsePatterns); + } catch (ParseException e) { + return null; + } + } + + /** + * 获取当前日期与指定日期相隔的天数. + * + * @param date 给定的日期 + * @return long 日期间隔天数,正数表示给定日期在当前日期之前,负数表示在当前日期之后 + * @since 1.0 + */ + public static long pastDays(Date date) { + // 将指定日期转换为yyyy-MM-dd格式 + date = DateUtils.parseDate(DateUtils.formatDate(date, DateUtils.DATE_FORMAT)); + // 当前日期转换为yyyy-MM-dd格式 + Date currentDate = DateUtils.parseDate(DateUtils.formatDate(new Date(), DateUtils.DATE_FORMAT)); + long t = 0; + if (date != null && currentDate != null) { + t = (currentDate.getTime() - date.getTime()) / DateUtils.MILLISECONDS_PER_DAY; + } + return t; + } + + /** + * 获取当前日期指定天数之后的日期. + * + * @param num 相隔天数 + * @return Date 日期 + * @since 1.0 + */ + public static Date nextDay(int num) { + Calendar curr = Calendar.getInstance(); + curr.set(Calendar.DAY_OF_MONTH, curr.get(Calendar.DAY_OF_MONTH) + num); + return curr.getTime(); + } + + /** + * 获取当前日期指定月数之后的日期. + * + * @param num 间隔月数 + * @return Date 日期 + * @since 1.0 + */ + public static Date nextMonth(int num) { + Calendar curr = Calendar.getInstance(); + curr.set(Calendar.MONTH, curr.get(Calendar.MONTH) + num); + return curr.getTime(); + } + + /** + * 获取当前日期指定年数之后的日期. + * + * @param num 间隔年数 + * @return Date 日期 + * @since 1.0 + */ + public static Date nextYear(int num) { + Calendar curr = Calendar.getInstance(); + curr.set(Calendar.YEAR, curr.get(Calendar.YEAR) + num); + return curr.getTime(); + } + + /** + * 将 Date 日期转化为 Calendar 类型日期. + * + * @param date 给定的时间,若为null,则默认为当前时间 + * @return Calendar Calendar对象 + * @since 1.0 + */ + public static Calendar getCalendar(Date date) { + Calendar calendar = Calendar.getInstance(); + // calendar.setFirstDayOfWeek(Calendar.SUNDAY);//每周从周日开始 + // calendar.setMinimalDaysInFirstWeek(1); // 设置每周最少为1天 + if (date != null) { + calendar.setTime(date); + } + return calendar; + } + + /** + * 计算两个日期之间相差天数. + * + * @param start 计算开始日期 + * @param end 计算结束日期 + * @return long 相隔天数 + * @since 1.0 + */ + public static long getDaysBetween(Date start, Date end) { + // 将指定日期转换为yyyy-MM-dd格式 + start = DateUtils.parseDate(DateUtils.formatDate(start, DateUtils.DATE_FORMAT)); + // 当前日期转换为yyyy-MM-dd格式 + end = DateUtils.parseDate(DateUtils.formatDate(end, DateUtils.DATE_FORMAT)); + + long diff = 0; + if (start != null && end != null) { + diff = (end.getTime() - start.getTime()) / DateUtils.MILLISECONDS_PER_DAY; + } + return diff; + } + + /** + * 计算两个日期之前相隔多少周. + * + * @param start 计算开始时间 + * @param end 计算结束时间 + * @return long 相隔周数,向下取整 + * @since 1.0 + */ + public static long getWeeksBetween(Date start, Date end) { + return getDaysBetween(start, end) / DateUtils.DAYS_PER_WEEK; + } + + /** + * 获取与指定日期间隔给定天数的日期. + * + * @param specifiedDay 给定的字符串格式日期,支持的日期字符串格式包括"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss", + * "yyyy-MM-dd HH:mm", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", + * "yyyy/MM/dd HH:mm" + * @param num 间隔天数 + * @return String 间隔指定天数之后的日期 + * @since 1.0 + */ + public static String getSpecifiedDayAfter(String specifiedDay, int num) { + Date specifiedDate = parseDate(specifiedDay); + Calendar c = Calendar.getInstance(); + c.setTime(specifiedDate); + int day = c.get(Calendar.DATE); + c.set(Calendar.DATE, day + num); + String dayAfter = formatDate(c.getTime(), DateUtils.DATE_FORMAT); + return dayAfter; + } + + /** + * 计算两个日期之前间隔的小时数. + * + * @param date1 结束时间 + * @param date2 开始时间 + * @return String 相差的小时数,保留一位小数 + * @since 1.0 + */ + public static String dateMinus(Date date1, Date date2) { + if (date1 == null || date2 == null) { + return "0"; + } + Long r = date1.getTime() - date2.getTime(); + DecimalFormat df = new DecimalFormat("#.0"); + double result = r * 1.0 / DateUtils.MILLISECONDS_PER_HOUR; + return df.format(result); + } + + /** + * 获取当前季度 . + * + * @return Integer 当前季度数 + * @since 1.0 + */ + public static Integer getCurrentSeason() { + Calendar calendar = Calendar.getInstance(); + Integer month = calendar.get(Calendar.MONTH) + 1; + int season = 0; + if (month >= 1 && month <= 3) { + season = 1; + } else if (month >= 4 && month <= 6) { + season = 2; + } else if (month >= 7 && month <= 9) { + season = 3; + } else if (month >= 10 && month <= 12) { + season = 4; + } + return season; + } + + /** + * 将以秒为单位的时间转换为其他单位. + * + * @param seconds 秒数 + * @return String 例如 16分钟前、2小时前、3天前、4月前、5年前等 + * @since 1.0 + */ + public static String getIntervalBySeconds(long seconds) { + StringBuffer buffer = new StringBuffer(); + if (seconds < SECONDS_PER_MINUTE) { + buffer.append(seconds).append("秒前"); + } else if (seconds < SECONDS_PER_HOUR) { + buffer.append(seconds / SECONDS_PER_MINUTE).append("分钟前"); + } else if (seconds < SECONDS_PER_DAY) { + buffer.append(seconds / SECONDS_PER_HOUR).append("小时前"); + } else if (seconds < SECONDS_PER_MONTH) { + buffer.append(seconds / SECONDS_PER_DAY).append("天前"); + } else if (seconds < SECONDS_PER_YEAR) { + buffer.append(seconds / SECONDS_PER_MONTH).append("月前"); + } else { + buffer.append(seconds / DateUtils.SECONDS_PER_YEAR).append("年前"); + } + return buffer.toString(); + } + + /** + * getNowTimeBefore(记录时间相当于目前多久之前) + * + * @param seconds 秒 + * @return + * @throws @since 1.0 + * @author rlliu + */ + public static String getNowTimeBefore(long seconds) { + StringBuffer buffer = new StringBuffer(); + buffer.append("上传于"); + if (seconds < 3600) { + buffer.append((long) Math.floor(seconds / 60.0)).append("分钟前"); + } else if (seconds < 86400) { + buffer.append((long) Math.floor(seconds / 3600.0)).append("小时前"); + } else if (seconds < 604800) { + buffer.append((long) Math.floor(seconds / 86400.0)).append("天前"); + } else if (seconds < 2592000) { + buffer.append((long) Math.floor(seconds / 604800.0)).append("周前"); + } else if (seconds < 31104000) { + buffer.append((long) Math.floor(seconds / 2592000.0)).append("月前"); + } else { + buffer.append((long) Math.floor(seconds / 31104000.0)).append("年前"); + } + return buffer.toString(); + } + + /** + * getMonthsBetween(查询两个日期相隔的月份) + * + * @param startDate 开始日期1 (格式yyyy-MM-dd) + * @param endDate 截止日期2 (格式yyyy-MM-dd) + * @return + */ + public static int getMonthsBetween(String startDate, String endDate) { + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + c1.setTime(DateUtils.parseDate(startDate)); + c2.setTime(DateUtils.parseDate(endDate)); + int year = c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR); + int month = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH); + return Math.abs(year * 12 + month); + } + + /** + * getDayOfWeek(获取当前日期是星期几) + * + * @param dateStr 日期 + * @return 星期几 + */ + public static String getDayOfWeek(String dateStr) { + String[] weekOfDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; + Date date = parseDate(dateStr); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int num = calendar.get(Calendar.DAY_OF_WEEK) - 1; + return weekOfDays[num]; + } + + /** + * sns 格式 如几秒前,几分钟前,几小时前,几天前,几个月前,几年后, ... 精细,类如某个明星几秒钟之前发表了一篇微博 + * + * @param createTime + * @return + */ + public static String snsFormat(long createTime) { + long now = System.currentTimeMillis() / 1000; + long differ = now - createTime / 1000; + String dateStr = ""; + if (differ <= 60) { + dateStr = "刚刚"; + } else if (differ <= 3600) { + dateStr = (differ / 60) + "分钟前"; + } else if (differ <= 3600 * 24) { + dateStr = (differ / 3600) + "小时前"; + } else if (differ <= 3600 * 24 * 30) { + dateStr = (differ / (3600 * 24)) + "天前"; + } else { + Date date = new Date(createTime); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + dateStr = sdf.format(date); + } + return dateStr; + } + + /** + * 得到UTC时间,类型为字符串,格式为"yyyy-MM-dd HH:mm" + * 如果获取失败,返回null + * + * @return + */ + public static String getUTCTimeStr() { + StringBuffer UTCTimeBuffer = new StringBuffer(); + // 1、取得本地时间: + Calendar cal = Calendar.getInstance(); + // 2、取得时间偏移量: + int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET); + // 3、取得夏令时差: + int dstOffset = cal.get(java.util.Calendar.DST_OFFSET); + // 4、从本地时间里扣除这些差量,即可以取得UTC时间: + cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset)); + int year = cal.get(Calendar.YEAR); + int month = cal.get(Calendar.MONTH) + 1; + int day = cal.get(Calendar.DAY_OF_MONTH); + int hour = cal.get(Calendar.HOUR_OF_DAY); + int minute = cal.get(Calendar.MINUTE); + UTCTimeBuffer.append(year).append("-").append(month).append("-").append(day); + UTCTimeBuffer.append(" ").append(hour).append(":").append(minute); + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + sdf.parse(UTCTimeBuffer.toString()); + return UTCTimeBuffer.toString(); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/falsework-sever/src/main/java/com/fx/server/util/DynamicEnumUtils.java b/falsework-sever/src/main/java/com/fx/server/util/DynamicEnumUtils.java new file mode 100644 index 0000000..30fbe94 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/util/DynamicEnumUtils.java @@ -0,0 +1,122 @@ +package com.fx.server.util; + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import sun.reflect.ConstructorAccessor; +import sun.reflect.FieldAccessor; +import sun.reflect.ReflectionFactory; + +public class DynamicEnumUtils { + + private static ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory(); + + private static void setFailsafeFieldValue(Field field, Object target, Object value) throws NoSuchFieldException, + IllegalAccessException { + + // let's make the field accessible + field.setAccessible(true); + + // next we change the modifier in the Field instance to + // not be final anymore, thus tricking reflection into + // letting us modify the static final field + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + int modifiers = modifiersField.getInt(field); + + // blank out the final bit in the modifiers int + modifiers &= ~Modifier.FINAL; + modifiersField.setInt(field, modifiers); + + FieldAccessor fa = reflectionFactory.newFieldAccessor(field, false); + fa.set(target, value); + } + + private static void blankField(Class enumClass, String fieldName) throws NoSuchFieldException, + IllegalAccessException { + for (Field field : Class.class.getDeclaredFields()) { + if (field.getName().contains(fieldName)) { + AccessibleObject.setAccessible(new Field[]{field}, true); + setFailsafeFieldValue(field, enumClass, null); + break; + } + } + } + + private static void cleanEnumCache(Class enumClass) throws NoSuchFieldException, IllegalAccessException { + blankField(enumClass, "enumConstantDirectory"); // Sun (Oracle?!?) JDK 1.5/6 + blankField(enumClass, "enumConstants"); // IBM JDK + } + + private static ConstructorAccessor getConstructorAccessor(Class enumClass, Class[] additionalParameterTypes) + throws NoSuchMethodException { + Class[] parameterTypes = new Class[additionalParameterTypes.length + 2]; + parameterTypes[0] = String.class; + parameterTypes[1] = int.class; + System.arraycopy(additionalParameterTypes, 0, parameterTypes, 2, additionalParameterTypes.length); + return reflectionFactory.newConstructorAccessor(enumClass.getDeclaredConstructor(parameterTypes)); + } + + private static Object makeEnum(Class enumClass, String value, int ordinal, Class[] additionalTypes, + Object[] additionalValues) throws Exception { + Object[] parms = new Object[additionalValues.length + 2]; + parms[0] = value; + parms[1] = Integer.valueOf(ordinal); + System.arraycopy(additionalValues, 0, parms, 2, additionalValues.length); + return enumClass.cast(getConstructorAccessor(enumClass, additionalTypes).newInstance(parms)); + } + + /** + * Add an enum instance to the enum class given as argument + * + * @param the type of the enum (implicit) + * @param enumType the class of the enum to be modified + * @param enumName the name of the new enum instance to be added to the class. + */ + @SuppressWarnings("unchecked") + public static > void addEnum(Class enumType, String enumName, Class[] additionalTypes, Object[] additionalValues) { + + // 0. Sanity checks + if (!Enum.class.isAssignableFrom(enumType)) { + throw new RuntimeException("class " + enumType + " is not an instance of Enum"); + } + + // 1. Lookup "$VALUES" holder in enum class and get previous enum instances + Field valuesField = null; + Field[] fields = enumType.getDeclaredFields(); + for (Field field : fields) { + if (field.getName().contains("$VALUES")) { + valuesField = field; + break; + } + } + AccessibleObject.setAccessible(new Field[]{valuesField}, true); + + try { + + // 2. Copy it + T[] previousValues = (T[]) valuesField.get(enumType); + List values = new ArrayList(Arrays.asList(previousValues)); + + // 3. build new enum + T newValue = (T) makeEnum(enumType, enumName, values.size(), additionalTypes, additionalValues); + + // 4. add new value + values.add(newValue); + + // 5. Set new values field + setFailsafeFieldValue(valuesField, null, values.toArray((T[]) Array.newInstance(enumType, 0))); + + // 6. Clean enum cache + cleanEnumCache(enumType); + + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/EncryptUtil.java b/falsework-sever/src/main/java/com/fx/server/util/EncryptUtil.java similarity index 99% rename from falsework-sever/src/main/java/com/epri/fx/server/util/EncryptUtil.java rename to falsework-sever/src/main/java/com/fx/server/util/EncryptUtil.java index 81a96ae..7498dc5 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/EncryptUtil.java +++ b/falsework-sever/src/main/java/com/fx/server/util/EncryptUtil.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.util; +package com.fx.server.util; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/EntityUtils.java b/falsework-sever/src/main/java/com/fx/server/util/EntityUtils.java similarity index 98% rename from falsework-sever/src/main/java/com/epri/fx/server/util/EntityUtils.java rename to falsework-sever/src/main/java/com/fx/server/util/EntityUtils.java index 12e65be..59cd4d7 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/EntityUtils.java +++ b/falsework-sever/src/main/java/com/fx/server/util/EntityUtils.java @@ -1,6 +1,6 @@ -package com.epri.fx.server.util; +package com.fx.server.util; -import com.epri.fx.server.context.BaseContextHandler; +import com.fx.server.context.BaseContextHandler; import org.apache.commons.lang3.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/Query.java b/falsework-sever/src/main/java/com/fx/server/util/Query.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/util/Query.java rename to falsework-sever/src/main/java/com/fx/server/util/Query.java index b85f500..fdb10ec 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/Query.java +++ b/falsework-sever/src/main/java/com/fx/server/util/Query.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.util; +package com.fx.server.util; import java.util.LinkedHashMap; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/ReflectionUtils.java b/falsework-sever/src/main/java/com/fx/server/util/ReflectionUtils.java similarity index 99% rename from falsework-sever/src/main/java/com/epri/fx/server/util/ReflectionUtils.java rename to falsework-sever/src/main/java/com/fx/server/util/ReflectionUtils.java index 4e05d88..cb64e73 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/ReflectionUtils.java +++ b/falsework-sever/src/main/java/com/fx/server/util/ReflectionUtils.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.util; +package com.fx.server.util; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; diff --git a/falsework-sever/src/main/java/com/fx/server/util/SpringUtils.java b/falsework-sever/src/main/java/com/fx/server/util/SpringUtils.java new file mode 100644 index 0000000..d05a556 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/util/SpringUtils.java @@ -0,0 +1,149 @@ +package com.fx.server.util; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + + /** + * + * @Description:spring工具类 方便在非spring管理环境中获取bean + * + * @param: + * @return: + * @auther: liwen + * @date: 2020/12/28 4:36 下午 + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws org.springframework.beans.BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws org.springframework.beans.BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + +// /** +// * 获取当前的环境配置,当有多个环境配置时,只获取第一个 +// * +// * @return 当前的环境配置 +// */ +// public static String getActiveProfile() +// { +// final String[] activeProfiles = getActiveProfiles(); +// return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; +// } +} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/StringHelper.java b/falsework-sever/src/main/java/com/fx/server/util/StringHelper.java similarity index 87% rename from falsework-sever/src/main/java/com/epri/fx/server/util/StringHelper.java rename to falsework-sever/src/main/java/com/fx/server/util/StringHelper.java index 82397c7..f3ed620 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/StringHelper.java +++ b/falsework-sever/src/main/java/com/fx/server/util/StringHelper.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.util; +package com.fx.server.util; /** * diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/TreeUtil.java b/falsework-sever/src/main/java/com/fx/server/util/TreeUtil.java similarity index 95% rename from falsework-sever/src/main/java/com/epri/fx/server/util/TreeUtil.java rename to falsework-sever/src/main/java/com/fx/server/util/TreeUtil.java index 29d8dcd..83715db 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/TreeUtil.java +++ b/falsework-sever/src/main/java/com/fx/server/util/TreeUtil.java @@ -1,7 +1,7 @@ -package com.epri.fx.server.util; +package com.fx.server.util; -import com.epri.fx.server.vo.TreeNode; +import com.fx.server.vo.TreeNode; import java.util.ArrayList; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/UUIDUtils.java b/falsework-sever/src/main/java/com/fx/server/util/UUIDUtils.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/util/UUIDUtils.java rename to falsework-sever/src/main/java/com/fx/server/util/UUIDUtils.java index e514418..4383383 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/UUIDUtils.java +++ b/falsework-sever/src/main/java/com/fx/server/util/UUIDUtils.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.util; +package com.fx.server.util; import java.util.UUID; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/user/JwtAuthenticationRequest.java b/falsework-sever/src/main/java/com/fx/server/util/user/JwtAuthenticationRequest.java similarity index 95% rename from falsework-sever/src/main/java/com/epri/fx/server/util/user/JwtAuthenticationRequest.java rename to falsework-sever/src/main/java/com/fx/server/util/user/JwtAuthenticationRequest.java index 0d74338..e33a999 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/user/JwtAuthenticationRequest.java +++ b/falsework-sever/src/main/java/com/fx/server/util/user/JwtAuthenticationRequest.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.util.user; +package com.fx.server.util.user; import java.io.Serializable; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/user/JwtAuthenticationResponse.java b/falsework-sever/src/main/java/com/fx/server/util/user/JwtAuthenticationResponse.java similarity index 90% rename from falsework-sever/src/main/java/com/epri/fx/server/util/user/JwtAuthenticationResponse.java rename to falsework-sever/src/main/java/com/fx/server/util/user/JwtAuthenticationResponse.java index f47c13a..cc65830 100755 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/user/JwtAuthenticationResponse.java +++ b/falsework-sever/src/main/java/com/fx/server/util/user/JwtAuthenticationResponse.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.util.user; +package com.fx.server.util.user; import java.io.Serializable; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/util/user/JwtTokenUtil.java b/falsework-sever/src/main/java/com/fx/server/util/user/JwtTokenUtil.java similarity index 81% rename from falsework-sever/src/main/java/com/epri/fx/server/util/user/JwtTokenUtil.java rename to falsework-sever/src/main/java/com/fx/server/util/user/JwtTokenUtil.java index d00b6be..0c3a78a 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/util/user/JwtTokenUtil.java +++ b/falsework-sever/src/main/java/com/fx/server/util/user/JwtTokenUtil.java @@ -1,8 +1,8 @@ -package com.epri.fx.server.util.user; +package com.fx.server.util.user; -import com.epri.fx.server.config.KeyConfiguration; -import com.epri.fx.server.jwt.IJWTInfo; -import com.epri.fx.server.jwt.JWTHelper; +import com.fx.server.config.KeyConfiguration; +import com.fx.server.jwt.IJWTInfo; +import com.fx.server.jwt.JWTHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/ElementVO.java b/falsework-sever/src/main/java/com/fx/server/vo/ElementVO.java similarity index 99% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/ElementVO.java rename to falsework-sever/src/main/java/com/fx/server/vo/ElementVO.java index ace5ab5..e5784ed 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/ElementVO.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/ElementVO.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleIntegerProperty; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/FrontUser.java b/falsework-sever/src/main/java/com/fx/server/vo/FrontUser.java similarity index 98% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/FrontUser.java rename to falsework-sever/src/main/java/com/fx/server/vo/FrontUser.java index 566396c..a2db34f 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/FrontUser.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/FrontUser.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/GroupTree.java b/falsework-sever/src/main/java/com/fx/server/vo/GroupTree.java similarity index 93% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/GroupTree.java rename to falsework-sever/src/main/java/com/fx/server/vo/GroupTree.java index 4df1a65..c6494f2 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/GroupTree.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/GroupTree.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; /** * ${DESCRIPTION} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/GroupTypeVO.java b/falsework-sever/src/main/java/com/fx/server/vo/GroupTypeVO.java similarity index 98% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/GroupTypeVO.java rename to falsework-sever/src/main/java/com/fx/server/vo/GroupTypeVO.java index 5c7b2ca..e030889 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/GroupTypeVO.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/GroupTypeVO.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/GroupUsers.java b/falsework-sever/src/main/java/com/fx/server/vo/GroupUsers.java similarity index 92% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/GroupUsers.java rename to falsework-sever/src/main/java/com/fx/server/vo/GroupUsers.java index d3a36a8..f26ccec 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/GroupUsers.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/GroupUsers.java @@ -1,7 +1,7 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; -import com.epri.fx.server.entity.User; +import com.fx.server.entity.User; import java.util.List; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/GroupVO.java b/falsework-sever/src/main/java/com/fx/server/vo/GroupVO.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/GroupVO.java rename to falsework-sever/src/main/java/com/fx/server/vo/GroupVO.java index 8299a73..5eb727e 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/GroupVO.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/GroupVO.java @@ -1,6 +1,5 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; -import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/MenuVO.java b/falsework-sever/src/main/java/com/fx/server/vo/MenuVO.java similarity index 97% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/MenuVO.java rename to falsework-sever/src/main/java/com/fx/server/vo/MenuVO.java index 1f09d33..9c8491a 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/MenuVO.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/MenuVO.java @@ -1,8 +1,6 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; import javafx.beans.property.*; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; import java.io.Serializable; import java.util.ArrayList; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/PermissionInfo.java b/falsework-sever/src/main/java/com/fx/server/vo/PermissionInfo.java similarity index 97% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/PermissionInfo.java rename to falsework-sever/src/main/java/com/fx/server/vo/PermissionInfo.java index a8990f0..1ec405a 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/PermissionInfo.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/PermissionInfo.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; import java.io.Serializable; diff --git a/falsework-sever/src/main/java/com/fx/server/vo/SysJobVO.java b/falsework-sever/src/main/java/com/fx/server/vo/SysJobVO.java new file mode 100644 index 0000000..015acb8 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/vo/SysJobVO.java @@ -0,0 +1,56 @@ +package com.fx.server.vo; + +import lombok.Data; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import java.io.Serializable; +import java.util.Map; + +/** + * @description: + * @className: SysJob + * @author: liwen + * @date: 2020/12/25 09:06 + */ +@Data +public class SysJobVO implements Serializable { + + /** + * 任务实现类 + */ + private Class jobClass; + /** + * 任务名称(建议唯一) + */ + private String jobName; + /** + * 任务组名 + */ + private String jobGroupName; + /** + * 时间表达式 (如:0/5 * * * * ? ) + */ + private String jobTime; + /** + * 参数 + */ + private Map jobData; + + private String description; + private String jobStatus; + + + + public SysJobVO(Class jobClass, String jobName, String jobGroupName, String jobTime, Map jobData) { + this.jobClass = jobClass; + this.jobName = jobName; + this.jobGroupName = jobGroupName; + this.jobTime = jobTime; + this.jobData = jobData; + } + + public SysJobVO() { + + } + +} diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/TreeNode.java b/falsework-sever/src/main/java/com/fx/server/vo/TreeNode.java similarity index 96% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/TreeNode.java rename to falsework-sever/src/main/java/com/fx/server/vo/TreeNode.java index fe0f6ad..2eff4ee 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/TreeNode.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/TreeNode.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; import java.io.Serializable; import java.util.ArrayList; diff --git a/falsework-sever/src/main/java/com/epri/fx/server/vo/UserVO.java b/falsework-sever/src/main/java/com/fx/server/vo/UserVO.java similarity index 98% rename from falsework-sever/src/main/java/com/epri/fx/server/vo/UserVO.java rename to falsework-sever/src/main/java/com/fx/server/vo/UserVO.java index 04da996..8a4f163 100644 --- a/falsework-sever/src/main/java/com/epri/fx/server/vo/UserVO.java +++ b/falsework-sever/src/main/java/com/fx/server/vo/UserVO.java @@ -1,4 +1,4 @@ -package com.epri.fx.server.vo; +package com.fx.server.vo; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; diff --git a/falsework-sever/src/main/java/com/fx/server/websocket/WebSocketMessageHandler.java b/falsework-sever/src/main/java/com/fx/server/websocket/WebSocketMessageHandler.java new file mode 100644 index 0000000..eae1c97 --- /dev/null +++ b/falsework-sever/src/main/java/com/fx/server/websocket/WebSocketMessageHandler.java @@ -0,0 +1,212 @@ +package com.fx.server.websocket; + +import com.fx.server.constant.CommonConstants; +import com.fx.server.entity.log.SysLoginInfor; +import com.fx.server.exception.auth.UserInvalidException; +import com.fx.server.service.log.SysLoginInfoService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@Component +public class WebSocketMessageHandler extends TextWebSocketHandler { + + /** + * 用来存储当前在线的客户端(此map线程安全) + */ + private static ConcurrentHashMap WEBSOCKET_MAP = new ConcurrentHashMap<>(); + + //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 + private static AtomicInteger onlineNum = new AtomicInteger(); + @Autowired + private SysLoginInfoService sysLoginInfoService; + + /** + * 当和用户成功建立连接的时候会调用此方法,在此方法内部应该保存连接 + */ + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + log.info("建立连接成功"); + String userId = (String) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_ID);//将在拦截器中保存的用户的名字取出来,然后作为 key 存到 map 中 + SysLoginInfor sysLoginInfor = (SysLoginInfor) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_LIST); + + if (userId != null) { + WEBSOCKET_MAP.put(userId, session);//保存当前的连接和用户之间的关系 + // 在线数加1 + addOnlineCount(); + log.info("客户端" + sysLoginInfor.getLoginName() + "加入,当前在线数为:" + onlineNum.get()); + sendMessageToUser(userId, new TextMessage(userId + "WebSocket连接成功")); + } + // 这块会实现自己业务,比如,当用户登录后,会把离线消息推送给用户 + + } + + /** + * 收到消息的时候会触发该方法 + * + * @param session 发送消息的用户的 session + * @param message 发送的内容 + * @throws Exception + */ + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { +// //此处请根据自己的具体业务逻辑做处理 +// JSONObject jsonObject = JSONObject.fromObject(new String(message.asBytes()));//将用户发送的消息转换为 json,实际开发中请根据自己的需求处理 +// String toName = jsonObject.getString("toName");//获取数据中的收消息人的名字 +// String content = jsonObject.getString("content");//获取到发送的内容 +// String fromName = (String) session.getAttributes().get(Constants.WEBSOCKET_USERNAME);//获取当前发送消息的人的名字 +// content = "收到来自:" + fromName + "的消息,内容是:" + content; +// //拼接内容转发给接收者,实际开发中请参考自己的需求做处理 +// TextMessage textMessage = new TextMessage(content);//将内容转换为 TextMessage +// sendMessageToUser(toName, textMessage);// 发送给指定的用户 +// //sendMessageToUsers(message);//给所有人发送 +// //super.handleTextMessage(session, message); + } + + /** + * 给某个用户发送消息 + * + * @param userId + * @param message + */ + public void sendMessageToUser(String userId, TextMessage message) { + WebSocketSession webSocketSession = WEBSOCKET_MAP.get(userId);//根据接收方的名字找到对应的连接 + if (webSocketSession != null && webSocketSession.isOpen()) {//如果没有离线,如果离线,请根据实际业务需求来处理,可能会需要保存离线消息 + try { + webSocketSession.sendMessage(message);//发送消息 + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + + /** + * 给所有在线用户发送消息,此处以文本消息为例子 + * + * @param message + */ + public void sendMessageToUsers(TextMessage message) { + for (Map.Entry webSocketSessionEntry : WEBSOCKET_MAP.entrySet()) {//获取所有的连接 + + WebSocketSession session = webSocketSessionEntry.getValue();//找到每个连接 + if (session != null && session.isOpen()) { + try { + session.sendMessage(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * 出现异常的时候 + * + * @param session + * @param exception + * @throws Exception + */ + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { + String userId = (String) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_ID); + if (session.isOpen()) { + session.close(); + } + + log.error("WebSocket发生错误"); + + WEBSOCKET_MAP.remove(userId);//移除连接 + // 在线数减1 + subOnlineCount(); + + SysLoginInfor sysLoginInfor = (SysLoginInfor) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_LIST); + sysLoginInfor.setMsg("连接异常"); + sysLoginInfor.setStatus("1"); + sysLoginInfoService.addSysJobLog(sysLoginInfor); + } + + /** + * 连接关闭后 + * + * @param session + * @param closeStatus + * @throws Exception + */ + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { + String userId = (String) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_ID);//找到用户对应的连接 + + // 从map中删除 + WEBSOCKET_MAP.remove(userId); + // 在线数减1 + subOnlineCount(); + SysLoginInfor sysLoginInfor = (SysLoginInfor) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_LIST); + sysLoginInfor.setStatus("1"); + sysLoginInfor.setMsg("退出登录"); + sysLoginInfoService.addSysJobLog(sysLoginInfor); + log.info("[" + sysLoginInfor.getLoginName() + "]连接关闭,当前在线数为:" + onlineNum.get()); + } + + @Override + public boolean supportsPartialMessages() { + return false; + } + + + /** + * 有人上线时在线人数加一 + */ + private static synchronized void addOnlineCount() { + onlineNum.incrementAndGet(); + } + + /** + * 有人下线时在线人数减一 + */ + private static void subOnlineCount() { + if (onlineNum.get() > 0) { + onlineNum.decrementAndGet(); + + } + } + + + public List getOnlineUsers() { + List onlineUsers = new ArrayList<>(); + for (Map.Entry webSocketSessionEntry : WEBSOCKET_MAP.entrySet()) {//获取所有的连接 + + WebSocketSession session = webSocketSessionEntry.getValue();//找到每个连接 + if (session != null && session.isOpen()) { + SysLoginInfor sysLoginInfor = (SysLoginInfor) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_LIST); + onlineUsers.add(sysLoginInfor); + } + } + return onlineUsers; + } + + public boolean retreat(String userId) { + WebSocketSession webSocketSession = WEBSOCKET_MAP.get(userId);//根据接收方的名字找到对应的连接 + try { + webSocketSession.close(); + return true; + } catch (IOException e) { + e.printStackTrace(); + throw new UserInvalidException("退出失败"); + + } + } + + +} \ No newline at end of file diff --git a/falsework-sever/src/main/resources/application-dm.yml b/falsework-sever/src/main/resources/application-dm.yml index 14f3014..9804ef9 100644 --- a/falsework-sever/src/main/resources/application-dm.yml +++ b/falsework-sever/src/main/resources/application-dm.yml @@ -6,7 +6,7 @@ spring: type: com.alibaba.druid.pool.DruidDataSource druid: #url: jdbc:dm://10.105.73.121:12345/EMSHIS - url: jdbc:dm://192.168.1.210:12345/EMSHIS + url: jdbc:dm://10.211.55.3:12345/EMSHIS username: IPSM_DBA password: IPSM_DBA driver-class-name: dm.jdbc.driver.DmDriver @@ -34,7 +34,7 @@ spring: connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 mybatis: - basepackage: com.wlkj.ipsm.realtime.mapper + basepackage: com.fx.server.mapper xmlLocation: classpath:mapper/**/*.xml mapper-locations: "classpath*:mapper/*.xml" diff --git a/falsework-sever/src/main/resources/application-mysql.yml b/falsework-sever/src/main/resources/application-mysql.yml index 5be83c8..eb66a25 100644 --- a/falsework-sever/src/main/resources/application-mysql.yml +++ b/falsework-sever/src/main/resources/application-mysql.yml @@ -5,7 +5,7 @@ spring: # 使用druid数据源 type: com.alibaba.druid.pool.DruidDataSource druid: - url: jdbc:mysql://${MYSQL_HOST:10.211.55.3}:${MYSQL_PORT:3306}/ipsm_dba?serverTimezone=Asia/Shanghai + url: jdbc:mysql://${MYSQL_HOST:10.211.55.3}:${MYSQL_PORT:3306}/fx_falsework_db?serverTimezone=Asia/Shanghai username: root password: Root@12345 driver-class-name: com.mysql.cj.jdbc.Driver @@ -31,9 +31,32 @@ spring: filters: stat # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 - + quartz: + job-store-type: jdbc + jdbc: + initialize-schema: always #不初始化表结构 + properties: + org: + quartz: + scheduler: + instanceId: AUTO #默认主机名和时间戳生成实例ID,可以是任何字符串,但对于所有调度程序来说,必须是唯一的 对应qrtz_scheduler_state INSTANCE_NAME字段 + #instanceName: clusteredScheduler #quartzScheduler + jobStore: + class: org.quartz.impl.jdbcjobstore.JobStoreTX #持久化配置 + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate #我们仅为数据库制作了特定于数据库的代理 + useProperties: false #以指示JDBCJobStore将JobDataMaps中的所有值都作为字符串,因此可以作为名称 - 值对存储而不是在BLOB列中以其序列化形式存储更多复杂的对象。从长远来看,这是更安全的,因为您避免了将非String类序列化为BLOB的类版本问题。 + tablePrefix: qrtz_ #数据库表前缀 + misfireThreshold: 60000 #在被认为“失火”之前,调度程序将“容忍”一个Triggers将其下一个启动时间通过的毫秒数。默认值(如果您在配置中未输入此属性)为60000(60秒)。 + clusterCheckinInterval: 5000 #设置此实例“检入”*与群集的其他实例的频率(以毫秒为单位)。影响检测失败实例的速度。 + isClustered: true #打开群集功能 + threadPool: #连接池 + class: org.quartz.simpl.SimpleThreadPool + threadCount: 10 + threadPriority: 5 + threadsInheritContextClassLoaderOfInitializingThread: true + wait-for-jobs-to-complete-on-shutdown: true mybatis: - basepackage: com.epri.fx.server.mapper + basepackage: com.fx.server.mapper xmlLocation: classpath:mapper/*.xml mapper-locations: "classpath*:mapper/*.xml" diff --git a/falsework-sever/src/main/resources/application.properties b/falsework-sever/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/falsework-sever/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/falsework-sever/src/main/resources/application.yml b/falsework-sever/src/main/resources/application.yml index 912be27..e6f8f0c 100644 --- a/falsework-sever/src/main/resources/application.yml +++ b/falsework-sever/src/main/resources/application.yml @@ -5,7 +5,7 @@ spring: #日志输出 logging: level: - com.epri.fx.server: debug + com.fx.server: debug jwt: token-header: Authorization diff --git a/falsework-sever/src/main/resources/mapper/ElementMapper.xml b/falsework-sever/src/main/resources/mapper/ElementMapper.xml index fa84de5..f416369 100644 --- a/falsework-sever/src/main/resources/mapper/ElementMapper.xml +++ b/falsework-sever/src/main/resources/mapper/ElementMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -39,7 +39,7 @@ delete from base_element where id = #{id,jdbcType=INTEGER} - + insert into base_element (id, code, type, name, uri, menu_id, parent_id, path, method, @@ -57,7 +57,7 @@ #{attr5,jdbcType=VARCHAR}, #{attr6,jdbcType=VARCHAR}, #{attr7,jdbcType=VARCHAR}, #{attr8,jdbcType=VARCHAR}) - + insert into base_element @@ -196,7 +196,7 @@ - + update base_element @@ -265,7 +265,7 @@ where id = #{id,jdbcType=INTEGER} - + update base_element set code = #{code,jdbcType=VARCHAR}, type = #{type,jdbcType=VARCHAR}, diff --git a/falsework-sever/src/main/resources/mapper/GateLogMapper.xml b/falsework-sever/src/main/resources/mapper/GateLogMapper.xml index 7d0a165..77b3617 100644 --- a/falsework-sever/src/main/resources/mapper/GateLogMapper.xml +++ b/falsework-sever/src/main/resources/mapper/GateLogMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -25,7 +25,7 @@ delete from gate_log where id = #{id,jdbcType=INTEGER} - insert into gate_log (menu, opt, uri, crt_time, crt_user, crt_name, @@ -34,7 +34,7 @@ #{crtTime,jdbcType=TIMESTAMP}, #{crtUser,jdbcType=VARCHAR}, #{crtName,jdbcType=VARCHAR}, #{crtHost,jdbcType=VARCHAR}, #{body,jdbcType=VARCHAR}) - insert into gate_log @@ -90,7 +90,7 @@ - + update gate_log @@ -120,7 +120,7 @@ where id = #{id,jdbcType=INTEGER} - + update gate_log set menu = #{menu,jdbcType=VARCHAR}, opt = #{opt,jdbcType=VARCHAR}, @@ -142,6 +142,6 @@ and crt_name like #{keyId,jdbcType=VARCHAR} or crt_host like #{keyId,jdbcType=VARCHAR} - + ORDER BY id DESC \ No newline at end of file diff --git a/falsework-sever/src/main/resources/mapper/GroupMapper.xml b/falsework-sever/src/main/resources/mapper/GroupMapper.xml index 9983d26..0dbba8c 100644 --- a/falsework-sever/src/main/resources/mapper/GroupMapper.xml +++ b/falsework-sever/src/main/resources/mapper/GroupMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -42,7 +42,7 @@ delete from base_group where id = #{id,jdbcType=INTEGER} - + insert into base_group (id, code, name, parent_id, path, type, group_type, description, crt_time, @@ -62,7 +62,7 @@ #{attr6,jdbcType=VARCHAR}, #{attr7,jdbcType=VARCHAR}, #{attr8,jdbcType=VARCHAR} ) - + insert into base_group @@ -213,7 +213,7 @@ - + update base_group @@ -288,7 +288,7 @@ where id = #{id,jdbcType=INTEGER} - + update base_group set code = #{code,jdbcType=VARCHAR}, name = #{name,jdbcType=VARCHAR}, diff --git a/falsework-sever/src/main/resources/mapper/GroupTypeMapper.xml b/falsework-sever/src/main/resources/mapper/GroupTypeMapper.xml index 1f6b20e..2de709b 100644 --- a/falsework-sever/src/main/resources/mapper/GroupTypeMapper.xml +++ b/falsework-sever/src/main/resources/mapper/GroupTypeMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -37,7 +37,7 @@ delete from base_group_type where id = #{id,jdbcType=INTEGER} - + insert into base_group_type (id, code, name, description, crt_time, crt_user, crt_name, crt_host, upd_time, @@ -53,7 +53,7 @@ #{attr4,jdbcType=VARCHAR}, #{attr5,jdbcType=VARCHAR}, #{attr6,jdbcType=VARCHAR}, #{attr7,jdbcType=VARCHAR}, #{attr8,jdbcType=VARCHAR}) - + insert into base_group_type @@ -180,7 +180,7 @@ - + update base_group_type @@ -243,7 +243,7 @@ where id = #{id,jdbcType=INTEGER} - + update base_group_type set code = #{code,jdbcType=VARCHAR}, name = #{name,jdbcType=VARCHAR}, diff --git a/falsework-sever/src/main/resources/mapper/MenuMapper.xml b/falsework-sever/src/main/resources/mapper/MenuMapper.xml index d11915c..f985b92 100644 --- a/falsework-sever/src/main/resources/mapper/MenuMapper.xml +++ b/falsework-sever/src/main/resources/mapper/MenuMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -46,7 +46,7 @@ delete from base_menu where id = #{id,jdbcType=INTEGER} - + insert into base_menu (id, code, title, parent_id, href, icon, type, order_num, description, @@ -68,7 +68,7 @@ #{attr6,jdbcType=VARCHAR}, #{attr7,jdbcType=VARCHAR}, #{attr8,jdbcType=VARCHAR} ) - + insert into base_menu @@ -237,7 +237,7 @@ - + update base_menu @@ -321,7 +321,7 @@ where id = #{id,jdbcType=INTEGER} - + update base_menu set code = #{code,jdbcType=VARCHAR}, title = #{title,jdbcType=VARCHAR}, diff --git a/falsework-sever/src/main/resources/mapper/ResourceAuthorityMapper.xml b/falsework-sever/src/main/resources/mapper/ResourceAuthorityMapper.xml index c53572e..2d1f541 100644 --- a/falsework-sever/src/main/resources/mapper/ResourceAuthorityMapper.xml +++ b/falsework-sever/src/main/resources/mapper/ResourceAuthorityMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -38,7 +38,7 @@ delete from base_resource_authority where id = #{id,jdbcType=INTEGER} - + insert into base_resource_authority (id, authority_id, authority_type, resource_id, resource_type, parent_id, path, description, crt_time, @@ -54,7 +54,7 @@ #{attr4,jdbcType=VARCHAR}, #{attr5,jdbcType=VARCHAR}, #{attr6,jdbcType=VARCHAR}, #{attr7,jdbcType=VARCHAR}, #{attr8,jdbcType=VARCHAR}) - + insert into base_resource_authority @@ -181,7 +181,7 @@ - + update base_resource_authority @@ -244,7 +244,7 @@ where id = #{id,jdbcType=INTEGER} - + update base_resource_authority set authority_id = #{authorityId,jdbcType=VARCHAR}, authority_type = #{authorityType,jdbcType=VARCHAR}, @@ -267,7 +267,7 @@ attr8 = #{attr8,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} - select from base_resource_authority diff --git a/falsework-sever/src/main/resources/mapper/RsaKeyMapper.xml b/falsework-sever/src/main/resources/mapper/RsaKeyMapper.xml index 91a7367..8b527c9 100644 --- a/falsework-sever/src/main/resources/mapper/RsaKeyMapper.xml +++ b/falsework-sever/src/main/resources/mapper/RsaKeyMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -18,11 +18,11 @@ delete from base_rsa_key where RSA_KEY = #{key,jdbcType=VARCHAR} - + insert into base_rsa_key (RSA_KEY, KEY_VALUE) values (#{key,jdbcType=VARCHAR}, #{value,jdbcType=VARCHAR}) - + insert into base_rsa_key @@ -41,7 +41,7 @@ - + update base_rsa_key @@ -50,7 +50,7 @@ where RSA_KEY = #{key,jdbcType=VARCHAR} - + update base_rsa_key set VALUE = #{value,jdbcType=VARCHAR} where RSA_KEY = #{key,jdbcType=VARCHAR} diff --git a/falsework-sever/src/main/resources/mapper/SysJobLogMapper.xml b/falsework-sever/src/main/resources/mapper/SysJobLogMapper.xml new file mode 100644 index 0000000..767fde9 --- /dev/null +++ b/falsework-sever/src/main/resources/mapper/SysJobLogMapper.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + job_log_id + , job_name, job_group, invoke_target, job_message, `status`, exception_info, + create_time + + + + delete + from sys_job_log + where job_log_id = #{jobLogId,jdbcType=BIGINT} + + + insert into sys_job_log (job_name, job_group, invoke_target, + job_message, `status`, exception_info, + create_time) + values (#{jobName,jdbcType=VARCHAR}, #{jobGroup,jdbcType=VARCHAR}, #{invokeTarget,jdbcType=VARCHAR}, + #{jobMessage,jdbcType=VARCHAR}, #{status,jdbcType=CHAR}, #{exceptionInfo,jdbcType=VARCHAR}, + #{createTime,jdbcType=TIMESTAMP}) + + + insert into sys_job_log + + + job_name, + + + job_group, + + + invoke_target, + + + job_message, + + + `status`, + + + exception_info, + + + create_time, + + + + + #{jobName,jdbcType=VARCHAR}, + + + #{jobGroup,jdbcType=VARCHAR}, + + + #{invokeTarget,jdbcType=VARCHAR}, + + + #{jobMessage,jdbcType=VARCHAR}, + + + #{status,jdbcType=CHAR}, + + + #{exceptionInfo,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + + + update sys_job_log + + + job_name = #{jobName,jdbcType=VARCHAR}, + + + job_group = #{jobGroup,jdbcType=VARCHAR}, + + + invoke_target = #{invokeTarget,jdbcType=VARCHAR}, + + + job_message = #{jobMessage,jdbcType=VARCHAR}, + + + `status` = #{status,jdbcType=CHAR}, + + + exception_info = #{exceptionInfo,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + where job_log_id = #{jobLogId,jdbcType=BIGINT} + + + update sys_job_log + set job_name = #{jobName,jdbcType=VARCHAR}, + job_group = #{jobGroup,jdbcType=VARCHAR}, + invoke_target = #{invokeTarget,jdbcType=VARCHAR}, + job_message = #{jobMessage,jdbcType=VARCHAR}, + `status` = #{status,jdbcType=CHAR}, + exception_info = #{exceptionInfo,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=TIMESTAMP} + where job_log_id = #{jobLogId,jdbcType=BIGINT} + + + + \ No newline at end of file diff --git a/falsework-sever/src/main/resources/mapper/SysLoginInforMapper.xml b/falsework-sever/src/main/resources/mapper/SysLoginInforMapper.xml new file mode 100644 index 0000000..e5ee511 --- /dev/null +++ b/falsework-sever/src/main/resources/mapper/SysLoginInforMapper.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + info_id + , login_name, ipaddr, login_location, browser, os, `status`, msg, login_time + + + + delete + from sys_logininfor + where info_id = #{infoId,jdbcType=BIGINT} + + + insert into sys_logininfor (login_name, ipaddr, login_location, + browser, os, `status`, msg, + login_time) + values (#{loginName,jdbcType=VARCHAR}, #{ipaddr,jdbcType=VARCHAR}, #{loginLocation,jdbcType=VARCHAR}, + #{browser,jdbcType=VARCHAR}, #{os,jdbcType=VARCHAR}, #{status,jdbcType=CHAR}, #{msg,jdbcType=VARCHAR}, + #{loginTime,jdbcType=TIMESTAMP}) + + + insert into sys_logininfor + + + login_name, + + + ipaddr, + + + login_location, + + + browser, + + + os, + + + `status`, + + + msg, + + + login_time, + + + + + #{loginName,jdbcType=VARCHAR}, + + + #{ipaddr,jdbcType=VARCHAR}, + + + #{loginLocation,jdbcType=VARCHAR}, + + + #{browser,jdbcType=VARCHAR}, + + + #{os,jdbcType=VARCHAR}, + + + #{status,jdbcType=CHAR}, + + + #{msg,jdbcType=VARCHAR}, + + + #{loginTime,jdbcType=TIMESTAMP}, + + + + + update sys_logininfor + + + login_name = #{loginName,jdbcType=VARCHAR}, + + + ipaddr = #{ipaddr,jdbcType=VARCHAR}, + + + login_location = #{loginLocation,jdbcType=VARCHAR}, + + + browser = #{browser,jdbcType=VARCHAR}, + + + os = #{os,jdbcType=VARCHAR}, + + + `status` = #{status,jdbcType=CHAR}, + + + msg = #{msg,jdbcType=VARCHAR}, + + + login_time = #{loginTime,jdbcType=TIMESTAMP}, + + + where info_id = #{infoId,jdbcType=BIGINT} + + + update sys_logininfor + set login_name = #{loginName,jdbcType=VARCHAR}, + ipaddr = #{ipaddr,jdbcType=VARCHAR}, + login_location = #{loginLocation,jdbcType=VARCHAR}, + browser = #{browser,jdbcType=VARCHAR}, + os = #{os,jdbcType=VARCHAR}, + `status` = #{status,jdbcType=CHAR}, + msg = #{msg,jdbcType=VARCHAR}, + login_time = #{loginTime,jdbcType=TIMESTAMP} + where info_id = #{infoId,jdbcType=BIGINT} + + + + + \ No newline at end of file diff --git a/falsework-sever/src/main/resources/mapper/UserMapper.xml b/falsework-sever/src/main/resources/mapper/UserMapper.xml index 2cbb869..69fb5a0 100644 --- a/falsework-sever/src/main/resources/mapper/UserMapper.xml +++ b/falsework-sever/src/main/resources/mapper/UserMapper.xml @@ -1,7 +1,7 @@ - - + + @@ -47,7 +47,7 @@ delete from base_user where id = #{id,jdbcType=INTEGER} - + insert into base_user (id, username, password, name, birthday, address, mobile_phone, tel_phone, email, @@ -69,7 +69,7 @@ #{attr5,jdbcType=VARCHAR}, #{attr6,jdbcType=VARCHAR}, #{attr7,jdbcType=VARCHAR}, #{attr8,jdbcType=VARCHAR}) - + insert into base_user @@ -250,7 +250,7 @@ - + update base_user @@ -340,7 +340,7 @@ where id = #{id,jdbcType=INTEGER} - + update base_user set username = #{username,jdbcType=VARCHAR}, password = #{password,jdbcType=VARCHAR}, diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..be52383 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +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 +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +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 + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem 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, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml index 65b39cf..1e75ed7 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,6 @@ - falseworik-client falsework-client diff --git a/readme/login_log.png b/readme/login_log.png new file mode 100644 index 0000000000000000000000000000000000000000..354db778348bfd1802b3b3cb5427fe31188aae1f GIT binary patch literal 244289 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 z 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

@%p?1@a3+!LjA4*NaeA>;}yjZoo5@{ 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 L%VW7ex!(OB)yZgs literal 0 HcmV?d00001 diff --git a/readme/online_user.png b/readme/online_user.png new file mode 100644 index 0000000000000000000000000000000000000000..0a59df9b85dac1bc6f94849e7befef85c3c8141d GIT binary patch literal 235830 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�(U#jV|^#d2zXI?is8M93gN_ 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 literal 0 HcmV?d00001