From 60438b47a73a465f56e92b08fbb787e7c38c8629 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C18231669351=E2=80=9D?= <“1686821393@qq.com”> Date: Sat, 25 Mar 2023 12:53:55 +0800 Subject: [PATCH] BE --- CarbonSysBE1/.gitignore | 33 ++ CarbonSysBE1/mvnw | 310 +++++++++++ CarbonSysBE1/mvnw.cmd | 182 +++++++ CarbonSysBE1/pom.xml | 181 +++++++ .../edu/ncst/carbon/CarbonSysApplication.java | 33 ++ .../edu/ncst/carbon/aspect/LogOperate.java | 15 + .../ncst/carbon/aspect/LoginUserScope.java | 15 + .../config/CustomAccessDeniedHandler.java | 34 ++ .../edu/ncst/carbon/config/JsonConfig.java | 47 ++ .../edu/ncst/carbon/config/RedisConfig.java | 59 +++ .../ncst/carbon/config/SecurityConfig.java | 218 ++++++++ .../exception/CodeBeenUsedException.java | 13 + .../exception/NotBindUserException.java | 15 + .../config/security/DataBaseUrlVoter.java | 109 ++++ .../security/filter/AuthCheckFilter.java | 121 +++++ .../config/security/filter/LoginFilter.java | 322 +++++++++++ .../provider/WechatIdLoginProvider.java | 94 ++++ .../token/JwtAuthenticationToken.java | 39 ++ .../MobileCaptchaAuthenticationToken.java | 39 ++ .../token/WechatIdAuthenticationToken.java | 52 ++ .../carbon/controller/CaptchaController.java | 78 +++ .../carbon/controller/SystemController.java | 109 ++++ .../carbon/CarbonFormulaController.java | 108 ++++ .../carbon/CarbonFormulaTypeController.java | 75 +++ .../carbon/CarbonFormulaUnitController.java | 75 +++ .../controller/charity/CharityController.java | 4 + .../controller/goods/GoodsController.java | 81 +++ .../controller/image/ImageController.java | 63 +++ .../controller/log/LogUserController.java | 87 +++ .../log/LogUserFootprintController.java | 88 ++++ .../log/LogUserGoodsController.java | 76 +++ .../controller/system/MenuController.java | 130 +++++ .../controller/system/RoleController.java | 120 +++++ .../controller/system/RoleMenuController.java | 60 +++ .../controller/system/UserController.java | 174 ++++++ .../controller/task/TaskAuditController.java | 142 +++++ .../controller/task/TaskController.java | 101 ++++ .../java/edu/ncst/carbon/enums/EnumType.java | 13 + .../java/edu/ncst/carbon/enums/LogType.java | 39 ++ .../java/edu/ncst/carbon/enums/LoginType.java | 35 ++ .../java/edu/ncst/carbon/enums/MenuType.java | 38 ++ .../edu/ncst/carbon/enums/UnitTreeType.java | 38 ++ .../java/edu/ncst/carbon/enums/UnitType.java | 38 ++ .../carbon/exception/BusinessException.java | 41 ++ .../carbon/exception/CaptchaException.java | 30 ++ .../edu/ncst/carbon/exception/CodeMsg.java | 96 ++++ .../handler/InterfaceExceptionHandler.java | 54 ++ .../ncst/carbon/mapper/BaseMapperPlus.java | 34 ++ .../mapper/carbon/CarbonFormulaMapper.java | 20 + .../carbon/CarbonFormulaTypeMapper.java | 13 + .../carbon/CarbonFormulaUnitMapper.java | 12 + .../ncst/carbon/mapper/goods/GoodsMapper.java | 12 + .../ncst/carbon/mapper/image/ImageMapper.java | 12 + .../mapper/log/LogUserFootprintMapper.java | 12 + .../carbon/mapper/log/LogUserGoodsMapper.java | 13 + .../ncst/carbon/mapper/log/LogUserMapper.java | 12 + .../carbon/mapper/log/LoginLogMapper.java | 18 + .../ncst/carbon/mapper/system/MenuMapper.java | 36 ++ .../carbon/mapper/system/ResourceMapper.java | 38 ++ .../ncst/carbon/mapper/system/RoleMapper.java | 29 + .../carbon/mapper/system/RoleMenuMapper.java | 17 + .../mapper/system/RoleResourceMapper.java | 16 + .../ncst/carbon/mapper/system/UserMapper.java | 42 ++ .../carbon/mapper/system/UserRoleMapper.java | 13 + .../carbon/mapper/task/TaskAuditMapper.java | 14 + .../ncst/carbon/mapper/task/TaskMapper.java | 31 ++ .../edu/ncst/carbon/model/BaseEntity.java | 40 ++ .../ncst/carbon/model/carbon/CarFormula.java | 58 ++ .../carbon/model/carbon/CarFormulaType.java | 47 ++ .../carbon/model/carbon/CarFormulaUnit.java | 43 ++ .../edu/ncst/carbon/model/goods/Goods.java | 68 +++ .../edu/ncst/carbon/model/image/Image.java | 27 + .../edu/ncst/carbon/model/log/LogUser.java | 47 ++ .../carbon/model/log/LogUserFootprint.java | 69 +++ .../ncst/carbon/model/log/LogUserGoods.java | 62 +++ .../edu/ncst/carbon/model/log/LoginLog.java | 50 ++ .../edu/ncst/carbon/model/system/Menu.java | 91 ++++ .../ncst/carbon/model/system/Resource.java | 58 ++ .../edu/ncst/carbon/model/system/Role.java | 77 +++ .../ncst/carbon/model/system/RoleMenu.java | 28 + .../carbon/model/system/RoleResource.java | 28 + .../edu/ncst/carbon/model/system/User.java | 114 ++++ .../ncst/carbon/model/system/UserRole.java | 32 ++ .../java/edu/ncst/carbon/model/task/Task.java | 47 ++ .../edu/ncst/carbon/model/task/TaskAudit.java | 57 ++ .../carbon/service/ICarbonFormulaService.java | 26 + .../service/ICarbonFormulaTypeService.java | 21 + .../service/ICarbonFormulaUnitService.java | 18 + .../ncst/carbon/service/IGoodsService.java | 21 + .../ncst/carbon/service/IImageService.java | 19 + .../service/ILogUserFootprintService.java | 23 + .../carbon/service/ILogUserGoodsService.java | 18 + .../ncst/carbon/service/ILogUserService.java | 24 + .../ncst/carbon/service/ILoginLogService.java | 18 + .../edu/ncst/carbon/service/IMenuService.java | 62 +++ .../ncst/carbon/service/IResourceService.java | 26 + .../ncst/carbon/service/IRoleMenuService.java | 21 + .../edu/ncst/carbon/service/IRoleService.java | 40 ++ .../ncst/carbon/service/ISystemService.java | 6 + .../carbon/service/ITaskAuditService.java | 32 ++ .../edu/ncst/carbon/service/ITaskService.java | 24 + .../edu/ncst/carbon/service/IUserService.java | 46 ++ .../impl/carbon/CarbonFormulaServiceImpl.java | 240 +++++++++ .../carbon/CarbonFormulaTypeServiceImpl.java | 154 ++++++ .../carbon/CarbonFormulaUnitServiceImpl.java | 130 +++++ .../service/impl/goods/GoodsServiceImpl.java | 130 +++++ .../service/impl/image/ImageServiceImpl.java | 89 ++++ .../impl/log/LogUserFootprintServiceImpl.java | 142 +++++ .../impl/log/LogUserGoodsServiceImpl.java | 132 +++++ .../service/impl/log/LogUserServiceImpl.java | 130 +++++ .../service/impl/log/LoginLogServiceImpl.java | 27 + .../service/impl/system/MenuServiceImpl.java | 336 ++++++++++++ .../impl/system/ResourceServiceImpl.java | 400 ++++++++++++++ .../impl/system/RoleMenuServiceImpl.java | 70 +++ .../service/impl/system/RoleServiceImpl.java | 235 +++++++++ .../service/impl/system/SystemService.java | 15 + .../service/impl/system/UserServiceImpl.java | 371 +++++++++++++ .../impl/task/TaskAuditServiceImpl.java | 271 ++++++++++ .../service/impl/task/TaskServiceImpl.java | 260 +++++++++ .../edu/ncst/carbon/utils/CalendarUtil.java | 498 ++++++++++++++++++ .../edu/ncst/carbon/utils/CaptchaUtil.java | 79 +++ .../edu/ncst/carbon/utils/CookieUtils.java | 29 + .../java/edu/ncst/carbon/utils/DateUtil.java | 111 ++++ .../edu/ncst/carbon/utils/ImageUtils.java | 66 +++ .../edu/ncst/carbon/utils/ResponseUtils.java | 91 ++++ .../edu/ncst/carbon/utils/ResultUtils.java | 55 ++ .../edu/ncst/carbon/utils/SessionUtils.java | 68 +++ .../edu/ncst/carbon/utils/SpringUtils.java | 25 + .../java/edu/ncst/carbon/utils/URLUtils.java | 27 + .../edu/ncst/carbon/utils/WeChatUtils.java | 192 +++++++ .../java/edu/ncst/carbon/vo/ListResultVO.java | 30 ++ .../main/java/edu/ncst/carbon/vo/Query.java | 61 +++ .../java/edu/ncst/carbon/vo/ResultVO.java | 19 + .../main/java/edu/ncst/carbon/vo/Sorter.java | 20 + .../carbon/vo/carbon/CalculationResults.java | 25 + .../carbon/vo/carbon/CarFormulaDetailVO.java | 4 + .../carbon/vo/carbon/CarFormulaQuery.java | 6 + .../ncst/carbon/vo/query/LoginLogQuery.java | 29 + .../edu/ncst/carbon/vo/query/UserQuery.java | 25 + .../ModifyRoleInterfacePermissionDTO.java | 14 + .../vo/role/ModifyRoleMenuPermissionDTO.java | 14 + .../edu/ncst/carbon/vo/role/RoleDetailVO.java | 30 ++ .../ncst/carbon/vo/role/RoleShortItemVO.java | 17 + .../edu/ncst/carbon/vo/user/AddUserDTO.java | 55 ++ .../ncst/carbon/vo/user/CurrentUserDTO.java | 38 ++ .../carbon/vo/user/ResetUserPasswordDTO.java | 25 + .../ncst/carbon/vo/user/UpdateUserDTO.java | 36 ++ .../edu/ncst/carbon/vo/user/UserInfoVO.java | 29 + .../edu/ncst/carbon/vo/user/UserItemVO.java | 15 + .../edu/ncst/carbon/vo/user/UserLoginDTO.java | 35 ++ .../ncst/carbon/vo/wechat/AccessTokenDTO.java | 25 + .../ncst/carbon/vo/wechat/BindUserDTO.java | 20 + .../ncst/carbon/vo/wechat/SessionKeyDTO.java | 22 + .../edu/ncst/carbon/vo/wechat/SportData.java | 29 + .../edu/ncst/carbon/vo/wechat/SportDay.java | 28 + .../ncst/carbon/vo/wechat/UserWeChatDTO.java | 19 + .../src/main/resources/application.yml | 81 +++ CarbonSysBE1/src/main/resources/banner.txt | 0 .../resources/generator/TaskAuditMapper.xml | 0 CarbonSysBE1/src/main/resources/logback.xml | 57 ++ .../resources/mapping/CarbonFormulaMapper.xml | 236 +++++++++ .../main/resources/mapping/ImageMapper.xml | 14 + .../main/resources/mapping/LoginLogMapper.xml | 20 + .../src/main/resources/mapping/MenuMapper.xml | 114 ++++ .../main/resources/mapping/ResourceMapper.xml | 140 +++++ .../src/main/resources/mapping/RoleMapper.xml | 19 + .../resources/mapping/RoleResouceMapper.xml | 14 + .../src/main/resources/mapping/TaskMapper.xml | 128 +++++ .../src/main/resources/mapping/UserMapper.xml | 91 ++++ 169 files changed, 11763 insertions(+) create mode 100644 CarbonSysBE1/.gitignore create mode 100644 CarbonSysBE1/mvnw create mode 100644 CarbonSysBE1/mvnw.cmd create mode 100644 CarbonSysBE1/pom.xml create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/CarbonSysApplication.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/aspect/LogOperate.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/aspect/LoginUserScope.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/CustomAccessDeniedHandler.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/JsonConfig.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/RedisConfig.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/SecurityConfig.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/exception/CodeBeenUsedException.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/exception/NotBindUserException.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/DataBaseUrlVoter.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/filter/AuthCheckFilter.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/filter/LoginFilter.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/provider/WechatIdLoginProvider.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/JwtAuthenticationToken.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/MobileCaptchaAuthenticationToken.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/WechatIdAuthenticationToken.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/CaptchaController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/SystemController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaTypeController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaUnitController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/charity/CharityController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/goods/GoodsController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/image/ImageController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserFootprintController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserGoodsController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/MenuController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/RoleController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/RoleMenuController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/UserController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/task/TaskAuditController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/task/TaskController.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/EnumType.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/LogType.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/LoginType.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/MenuType.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/UnitTreeType.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/UnitType.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/BusinessException.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/CaptchaException.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/CodeMsg.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/handler/InterfaceExceptionHandler.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/BaseMapperPlus.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaTypeMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaUnitMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/goods/GoodsMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/image/ImageMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserFootprintMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserGoodsMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LoginLogMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/MenuMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/ResourceMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleMenuMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleResourceMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/UserMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/UserRoleMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/task/TaskAuditMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/task/TaskMapper.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/BaseEntity.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormula.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormulaType.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormulaUnit.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/goods/Goods.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/image/Image.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUser.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUserFootprint.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUserGoods.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LoginLog.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Menu.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Resource.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Role.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/RoleMenu.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/RoleResource.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/User.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/UserRole.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/task/Task.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/model/task/TaskAudit.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaTypeService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaUnitService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IGoodsService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IImageService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserFootprintService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserGoodsService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILoginLogService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IMenuService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IResourceService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IRoleMenuService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IRoleService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ISystemService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ITaskAuditService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ITaskService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IUserService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaTypeServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaUnitServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/goods/GoodsServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/image/ImageServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserFootprintServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserGoodsServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LoginLogServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/MenuServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/ResourceServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/RoleMenuServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/RoleServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/SystemService.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/UserServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/task/TaskAuditServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/task/TaskServiceImpl.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CalendarUtil.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CaptchaUtil.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CookieUtils.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/DateUtil.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ImageUtils.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ResponseUtils.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ResultUtils.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/SessionUtils.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/SpringUtils.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/URLUtils.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/WeChatUtils.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/ListResultVO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/Query.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/ResultVO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/Sorter.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CalculationResults.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CarFormulaDetailVO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CarFormulaQuery.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/query/LoginLogQuery.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/query/UserQuery.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/ModifyRoleInterfacePermissionDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/ModifyRoleMenuPermissionDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/RoleDetailVO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/RoleShortItemVO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/AddUserDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/CurrentUserDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/ResetUserPasswordDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UpdateUserDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserInfoVO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserItemVO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserLoginDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/AccessTokenDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/BindUserDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SessionKeyDTO.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SportData.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SportDay.java create mode 100644 CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/UserWeChatDTO.java create mode 100644 CarbonSysBE1/src/main/resources/application.yml create mode 100644 CarbonSysBE1/src/main/resources/banner.txt create mode 100644 CarbonSysBE1/src/main/resources/generator/TaskAuditMapper.xml create mode 100644 CarbonSysBE1/src/main/resources/logback.xml create mode 100644 CarbonSysBE1/src/main/resources/mapping/CarbonFormulaMapper.xml create mode 100644 CarbonSysBE1/src/main/resources/mapping/ImageMapper.xml create mode 100644 CarbonSysBE1/src/main/resources/mapping/LoginLogMapper.xml create mode 100644 CarbonSysBE1/src/main/resources/mapping/MenuMapper.xml create mode 100644 CarbonSysBE1/src/main/resources/mapping/ResourceMapper.xml create mode 100644 CarbonSysBE1/src/main/resources/mapping/RoleMapper.xml create mode 100644 CarbonSysBE1/src/main/resources/mapping/RoleResouceMapper.xml create mode 100644 CarbonSysBE1/src/main/resources/mapping/TaskMapper.xml create mode 100644 CarbonSysBE1/src/main/resources/mapping/UserMapper.xml diff --git a/CarbonSysBE1/.gitignore b/CarbonSysBE1/.gitignore new file mode 100644 index 0000000..1db161b --- /dev/null +++ b/CarbonSysBE1/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ + +*.DS_Store diff --git a/CarbonSysBE1/mvnw b/CarbonSysBE1/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/CarbonSysBE1/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/CarbonSysBE1/mvnw.cmd b/CarbonSysBE1/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/CarbonSysBE1/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/CarbonSysBE1/pom.xml b/CarbonSysBE1/pom.xml new file mode 100644 index 0000000..cc14fd4 --- /dev/null +++ b/CarbonSysBE1/pom.xml @@ -0,0 +1,181 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.1 + + + edu.ncst + carbon + 0.0.1-SNAPSHOT + carbon + carbon project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.0 + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + com.alibaba + fastjson + 1.2.35 + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.3 + + + + com.baomidou + mybatis-plus-boot-starter + 3.3.2 + + + com.baomidou + mybatis-plus-generator + 3.3.2 + + + + javax.validation + validation-api + 2.0.1.Final + + + org.hibernate + hibernate-validator + 6.0.13.Final + + + + io.jsonwebtoken + jjwt + 0.9.0 + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-aop + + + org.aspectj + aspectjweaver + 1.9.5 + + + + org.springframework + springloaded + 1.2.8.RELEASE + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-security + + + org.bouncycastle + bcprov-jdk15on + 1.64 + + + + + + + + + + + + + + + + + + + + + + com.spring4all + swagger-spring-boot-starter + 1.9.1.RELEASE + + + com.google.guava + guava + 25.1-jre + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.assertj + assertj-core + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/CarbonSysApplication.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/CarbonSysApplication.java new file mode 100644 index 0000000..c5c6891 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/CarbonSysApplication.java @@ -0,0 +1,33 @@ +package edu.ncst.carbon; + +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import com.spring4all.swagger.EnableSwagger2Doc; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.transaction.annotation.EnableTransactionManagement; + + +@EnableSwagger2Doc +@SpringBootApplication +@MapperScan(basePackages = {"edu.ncst.carbon.mapper"}) +@EnableTransactionManagement +@EnableCaching +@EnableAspectJAutoProxy(exposeProxy=true) +public class CarbonSysApplication { + /** + * 分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } + + public static void main(String[] args) { + SpringApplication.run(CarbonSysApplication.class, args); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/aspect/LogOperate.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/aspect/LogOperate.java new file mode 100644 index 0000000..606f29b --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/aspect/LogOperate.java @@ -0,0 +1,15 @@ +package edu.ncst.carbon.aspect; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 记录操作日志的注解 + */ +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface LogOperate { + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/aspect/LoginUserScope.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/aspect/LoginUserScope.java new file mode 100644 index 0000000..58798c4 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/aspect/LoginUserScope.java @@ -0,0 +1,15 @@ +package edu.ncst.carbon.aspect; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 登录用户用户访问权限 + */ +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface LoginUserScope { + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/CustomAccessDeniedHandler.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/CustomAccessDeniedHandler.java new file mode 100644 index 0000000..2dfa430 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/CustomAccessDeniedHandler.java @@ -0,0 +1,34 @@ +package edu.ncst.carbon.config; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.stereotype.Service; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +@Service +public class CustomAccessDeniedHandler implements AccessDeniedHandler { + + @Autowired + private ObjectMapper objectMapper; + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { + response.setContentType("application/json;charset=UTF-8"); + Map map = new HashMap(); + map.put("code",403); + map.put("msg", "无访问权限"); + map.put("data",""); + response.setContentType("application/json"); + response.setStatus(HttpServletResponse.SC_OK); + response.getWriter().write(objectMapper.writeValueAsString(map)); + } +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/JsonConfig.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/JsonConfig.java new file mode 100644 index 0000000..ab8c192 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/JsonConfig.java @@ -0,0 +1,47 @@ + +package edu.ncst.carbon.config; + +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.alibaba.fastjson.support.config.FastJsonConfig; +import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; + +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +@Configuration +public class JsonConfig { + + + @Bean + public HttpMessageConverter configureMessageConverters() { + FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); + FastJsonConfig config = new FastJsonConfig(); + config.setSerializerFeatures( + // 保留map空的字段 + SerializerFeature.WriteMapNullValue, + // 将String类型的null转成"" + SerializerFeature.WriteNullStringAsEmpty, + // 将Number类型的null转成0 + SerializerFeature.WriteNullNumberAsZero, + // 将List类型的null转成[] + SerializerFeature.WriteNullListAsEmpty, + // 将Boolean类型的null转成false + SerializerFeature.WriteNullBooleanAsFalse, + // 避免循环引用 + SerializerFeature.DisableCircularReferenceDetect); + + converter.setFastJsonConfig(config); + converter.setDefaultCharset(Charset.forName("UTF-8")); + List mediaTypeList = new ArrayList<>(); + // 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json" + mediaTypeList.add(MediaType.APPLICATION_JSON); + converter.setSupportedMediaTypes(mediaTypeList); + return converter; + } + } + diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/RedisConfig.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/RedisConfig.java new file mode 100644 index 0000000..958c480 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/RedisConfig.java @@ -0,0 +1,59 @@ +package edu.ncst.carbon.config; + +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.io.Serializable; +import java.util.Objects; + +@Configuration +public class RedisConfig extends CachingConfigurerSupport { + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + + // 解决 key 序列化方式 + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + redisTemplate.setKeySerializer(stringRedisSerializer); + redisTemplate.setHashKeySerializer(stringRedisSerializer); + + // 解决 value 序列化 + GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); + redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer); + + return redisTemplate; + } + + @Bean + public RedisTemplate redisCacheTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); + template.setConnectionFactory(connectionFactory); + return template; + } + + @Bean + public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) { + RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory())); + + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()) + ); + + return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/SecurityConfig.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/SecurityConfig.java new file mode 100644 index 0000000..32478c1 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/SecurityConfig.java @@ -0,0 +1,218 @@ +package edu.ncst.carbon.config; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import edu.ncst.carbon.config.security.DataBaseUrlVoter; + +import edu.ncst.carbon.config.security.filter.AuthCheckFilter; +import edu.ncst.carbon.config.security.filter.LoginFilter; +import edu.ncst.carbon.config.security.provider.WechatIdLoginProvider; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.service.ILoginLogService; +import edu.ncst.carbon.service.impl.system.UserServiceImpl; +import edu.ncst.carbon.utils.ResultUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.AccessDecisionManager; +import org.springframework.security.access.AccessDecisionVoter; +import org.springframework.security.access.vote.AuthenticatedVoter; +import org.springframework.security.access.vote.RoleVoter; +import org.springframework.security.access.vote.UnanimousBased; +import org.springframework.security.authentication.AuthenticationManager; +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.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.access.expression.WebExpressionVoter; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.List; + +/** + * 安全配置 + */ +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(securedEnabled=true) +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + + @Autowired + private UserServiceImpl userService; + @Autowired + private ILoginLogService loginLogService; + @Autowired + private DataBaseUrlVoter dataBaseUrlVoter; + @Autowired + private RedisTemplate redisCacheTemplate; + + @Autowired + private WechatIdLoginProvider wechatIdLoginProvider; + /** + * 认证失败处理类 + */ + @Autowired + CustomAccessDeniedHandler accessDeniedHandler; + +//org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) + /** + * 解决 无法直接注入 AuthenticationManager + * + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception + { + return super.authenticationManagerBean(); + } + + /** + * 权限白名单 + * 注意:该名单下匹配的 URL 不会经过鉴权,因此也无法获取当前用户的信息 + */ + private final String[] WHITE_LIST = { + "/v2/api-docs", + "/configuration/ui", + "/swagger-resources/**", + "/configuration/**", + "/swagger-ui.html", + "/webjars/**", + "/api/captcha.jpg", + "/websocket/**", + "/api/image/get/**", + "/common/download/**", + "/test/**", + "/*.html", + "/**/*.html", + "/**/*.css", + "/**/*.js", + "/error*" + }; + + /** + * 密码加密器 + */ + @Bean + public PasswordEncoder passwordEncoderBean() { + return new BCryptPasswordEncoder(); + } + + /** + * 权限投票访问决策管理器 + */ + @Bean + public AccessDecisionManager accessDecisionManager() { + List> decisionVoters + = Arrays.asList( + new WebExpressionVoter(), + new RoleVoter(),//主要用来判断当前请求是否具备该接口所需要的角色 + dataBaseUrlVoter, + new AuthenticatedVoter()); + return new UnanimousBased(decisionVoters);//要求所有 AccessDecisionVoter 均返回肯定的结果时,才代表授予权限。 + } + + /** + * 此处给AuthenticationManager添加登陆验证的逻辑。 + * 这里添加了两个AuthenticationProvider分别用于用户名密码登陆的验证以及token授权登陆两种方式。 + * 在处理登陆信息的过滤器执行的时候会调用这两个provider进行登陆验证。 + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userService); + auth.authenticationProvider(wechatIdLoginProvider); + } + + + /** + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + //权限验证 基于资源配置 + // HttpSecurity 及WebSecurity 作用是不一样的: + // WebSecurity 主要针对的全局的忽略规则, + // HttpSecurity主要是权限控制规则。 + @Override + protected void configure(HttpSecurity http) throws Exception { + + //允许跨域 + http.cors().and().anonymous().and() + // CRSF禁用,因为不使用session + .csrf().disable() + .formLogin().disable().httpBasic().disable() + .authorizeRequests() + .accessDecisionManager(accessDecisionManager())//访问决策管理器 + .antMatchers("/api/login").permitAll() + .antMatchers("/system/init").permitAll() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated() + // 授权异常处理,权限拦截器,提示用户没有当前权限 + .and().exceptionHandling().accessDeniedHandler(accessDeniedHandler).and() + // 不需要session(不创建会话) + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + + // LoginFilter:统一登录接口 + // AuthCheckFilter:用户凭证检查过滤器 + http.addFilterBefore( new AuthCheckFilter(redisCacheTemplate), UsernamePasswordAuthenticationFilter.class ) + .addFilterAt( new LoginFilter(authenticationManager(), loginLogService, redisCacheTemplate), UsernamePasswordAuthenticationFilter.class ) + .exceptionHandling()//登录认证失败 + .authenticationEntryPoint(((request, response, authException) -> { + response.setCharacterEncoding("utf-8"); + response.setContentType("application/json;charset=utf-8"); + + PrintWriter out = response.getWriter(); + out.write(new ObjectMapper().writeValueAsString(ResultUtils.error(CodeMsg.USER_NEED_LOGIN))); + out.flush(); + out.close(); + })); + + // 退出登录 + http.logout() + .logoutUrl("/logout") + .deleteCookies("JSESSIONID") + .logoutSuccessHandler(((request, response, authentication) -> { + PrintWriter out = response.getWriter(); + response.setContentType("application/json"); + out.write(new ObjectMapper().writeValueAsString(ResultUtils.success("注销成功"))); + out.flush(); + out.close(); + })); + } + + +// @Override +// protected void configure(HttpSecurity httpSecurity) throws Exception{ +// //调试阶段 +// httpSecurity.csrf().disable().authorizeRequests(); +// httpSecurity.authorizeRequests().anyRequest() +// .permitAll().and().logout().permitAll(); +// } + + //用于配置全局的某些通用事物,例如静态资源等 + @Override + public void configure(WebSecurity web) throws Exception { + web.ignoring().antMatchers(WHITE_LIST); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/exception/CodeBeenUsedException.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/exception/CodeBeenUsedException.java new file mode 100644 index 0000000..38da264 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/exception/CodeBeenUsedException.java @@ -0,0 +1,13 @@ +package edu.ncst.carbon.config.exception; + +import org.springframework.security.core.AuthenticationException; + +public class CodeBeenUsedException extends AuthenticationException { + public CodeBeenUsedException(String msg, Throwable t) { + super(msg, t); + } + + public CodeBeenUsedException(String msg) { + super(msg); + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/exception/NotBindUserException.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/exception/NotBindUserException.java new file mode 100644 index 0000000..2fcf310 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/exception/NotBindUserException.java @@ -0,0 +1,15 @@ +package edu.ncst.carbon.config.exception; + +import org.springframework.security.core.AuthenticationException; + +public class NotBindUserException extends AuthenticationException { + + public NotBindUserException(String msg, Throwable t) { + super(msg, t); + } + + public NotBindUserException(String msg) { + super(msg); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/DataBaseUrlVoter.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/DataBaseUrlVoter.java new file mode 100644 index 0000000..bafe656 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/DataBaseUrlVoter.java @@ -0,0 +1,109 @@ +package edu.ncst.carbon.config.security; + +import edu.ncst.carbon.model.system.Role; +import edu.ncst.carbon.service.IResourceService; +import edu.ncst.carbon.utils.URLUtils; +import edu.ncst.carbon.vo.user.UserInfoVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.AccessDecisionVoter; +import org.springframework.security.access.ConfigAttribute; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.web.FilterInvocation; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * URL 鉴权投票器 + */ +@Component +public class DataBaseUrlVoter implements AccessDecisionVoter { + + @Autowired + private IResourceService resourceService; + + @Override + public boolean supports(ConfigAttribute attribute) { + return true; + } + + @Override + public boolean supports(Class clazz) { + return true; + } + + @Override + public int vote(Authentication authentication, FilterInvocation fi, Collection attributes) { + if (authentication == null) { + return ACCESS_DENIED; // 反对票 + } + + String url = fi.getRequestUrl(); // 当前请求的URL + String urlWithoutQueryString = URLUtils.removeQueryString(url); + + // Current User Info + Object details = authentication.getDetails(); + + if (details instanceof UserInfoVO) { + UserInfoVO userInfoVO = (UserInfoVO) details; + AntPathMatcher antPathMatcher = new AntPathMatcher(); + + //获取不限用户角色的资源 + List permitAllResourceURLs = resourceService.getPermitAllResourceURLs(); + // Permit All Resource + for (String permitUrl : permitAllResourceURLs) { + boolean match = antPathMatcher.match(permitUrl, urlWithoutQueryString); + if (match) { + return ACCESS_GRANTED; // 赞同票 + } + } + + // 判断用户角色信息 + // 反对票:1、没有角色信息 2、角色未绑定该资源 + // 赞成票:用户是超级管理员 + + List roles = userInfoVO.getRoles(); + if (roles == null || roles.isEmpty()) { + return ACCESS_DENIED; // 反对票 + } + + List roleNames = roles.stream().map(Role::getName).collect(Collectors.toList()); + + // Super Admin User Always Pass + if (roleNames.contains("SUPER_ADMIN")) { + return ACCESS_GRANTED; // 赞同票 + } + + List rolesResourceList = resourceService.getRolesResourceList(roleNames);//获取目标角色绑定的资源 + + + + + // Role Resource + if (rolesResourceList == null) { + return ACCESS_DENIED; // 反对票 + } + + for (String allowUrl : rolesResourceList) { + boolean match = antPathMatcher.match(allowUrl, urlWithoutQueryString); + if (match) { + return ACCESS_GRANTED; // 赞同票 + } + } + } + + return ACCESS_DENIED; + } + + Collection extractAuthorities( + Authentication authentication) { + return authentication.getAuthorities(); + } + + +} + diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/filter/AuthCheckFilter.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/filter/AuthCheckFilter.java new file mode 100644 index 0000000..12435e3 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/filter/AuthCheckFilter.java @@ -0,0 +1,121 @@ +package edu.ncst.carbon.config.security.filter; + +import com.fasterxml.jackson.databind.ObjectMapper; +import edu.ncst.carbon.config.security.token.JwtAuthenticationToken; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.model.system.Role; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ResultVO; +import edu.ncst.carbon.vo.user.UserInfoVO; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.Jws; +import io.jsonwebtoken.Jwts; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 用户凭证检查过滤器 + * 并不是所有的container都像我们期望的只过滤一次,servlet版本不同,表现也不同 + * OncePerRequestFilter可以保证一次请求只通过一次过滤器。推荐自定义的授权过滤器继承OncePerRequestFilter + */ +@Slf4j +public class AuthCheckFilter extends OncePerRequestFilter { + private final RedisTemplate stringRedisTemplate; + + public AuthCheckFilter(RedisTemplate stringRedisTemplate) { + super(); + this.stringRedisTemplate = stringRedisTemplate; + } + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + String jwtToken = null; + + // 优先从 Cookie 中获取 TOKEN + Cookie[] cookies = request.getCookies(); + + boolean cookieHasToken = false; + if (cookies != null) { + for (Cookie cookie : cookies) { + if ("SYS_TOKEN".equals(cookie.getName())) { + jwtToken = cookie.getValue(); + cookieHasToken = true; + } + } + } + + // 如果 Cookie 中不存在 TOKEN,则尝试从 Header 中获取 TOKEN + if (!cookieHasToken) { + String authorization = request.getHeader("Authorization"); + log.info("开始鉴权====header Authorization====" + authorization); + if (authorization != null && authorization.startsWith("Bearer ")) { + jwtToken = authorization.replace("Bearer ", ""); + log.info("获取到token====header===="); + } else { + log.info("header中无token,进入过滤器链"); + filterChain.doFilter(request, response); + return; + } + } + + if (jwtToken == null || "".equals(jwtToken)) { + log.error("鉴权TOKEN:未获取,用户需要登录"); + ResultVO resultVO = ResultUtils.error(CodeMsg.USER_NEED_LOGIN); + ResponseUtils.output(response, resultVO); + } else { + log.info("鉴权TOKEN:" +"Bearer " + jwtToken); + } + + try { + // 解析TOKEN + Jws jws = Jwts.parser().setSigningKey("ncst20221003") + .parseClaimsJws(jwtToken); + + Claims claims = jws.getBody(); + String userName = claims.getSubject(); + //可以通过控制redis数据从服务端强制下线用户 + if(!stringRedisTemplate.hasKey("jwt_token:"+userName)){ + throw new ExpiredJwtException(null,jws.getBody(),"登录失效"); + } + + // 获取用户信息 + String userInfoJSON = (String) claims.get("userInfo"); + ObjectMapper objectMapper = new ObjectMapper(); + UserInfoVO userInfoVO = objectMapper.readValue(userInfoJSON, UserInfoVO.class); + + // 获取角色列表 + List roles = userInfoVO.getRoles(); + List authorities = new ArrayList<>(); + + if (roles != null && !roles.isEmpty()) { + for (Role role : roles) { + authorities.add(new SimpleGrantedAuthority("ROLE_" + role.getName())); + } + } + + // 将 TOKEN 存到 CONTEXT 当中 + JwtAuthenticationToken token = new JwtAuthenticationToken(userName, authorities, userInfoVO); + SecurityContextHolder.getContext().setAuthentication(token); + } catch (ExpiredJwtException e) { + ResultVO resultVO = ResultUtils.error(CodeMsg.USER_TOKEN_EXPIRED);// 用户凭证过期 + ResponseUtils.output(response, resultVO); + } finally { + filterChain.doFilter(request, response); + } + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/filter/LoginFilter.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/filter/LoginFilter.java new file mode 100644 index 0000000..2c00234 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/filter/LoginFilter.java @@ -0,0 +1,322 @@ +package edu.ncst.carbon.config.security.filter; + +import com.fasterxml.jackson.databind.ObjectMapper; +import edu.ncst.carbon.config.security.token.MobileCaptchaAuthenticationToken; +import edu.ncst.carbon.config.security.token.WechatIdAuthenticationToken; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.model.system.Role; +import edu.ncst.carbon.model.system.User; +import edu.ncst.carbon.service.ILoginLogService; +import edu.ncst.carbon.utils.CookieUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.utils.WeChatUtils; +import edu.ncst.carbon.vo.ResultVO; +import edu.ncst.carbon.vo.user.UserInfoVO; +import edu.ncst.carbon.vo.user.UserLoginDTO; +import edu.ncst.carbon.vo.wechat.AccessTokenDTO; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.*; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * 统一登录入口 + */ +@Slf4j +public class LoginFilter extends AbstractAuthenticationProcessingFilter {//OncePerRequestFilter + + private static final String loginUrl = "/api/login"; + + private final ILoginLogService loginLogService; + + private final RedisTemplate stringRedisTemplate; + + private String tempToken=""; + private final int MAX_ATTEMPT = 20; + + public LoginFilter(AuthenticationManager authenticationManager, ILoginLogService loginLogService, RedisTemplate stringRedisTemplate) { + super(new AntPathRequestMatcher(loginUrl, HttpMethod.POST.name())); + setAuthenticationManager(authenticationManager); + this.loginLogService = loginLogService; + this.stringRedisTemplate = stringRedisTemplate; + } + + /** + * 尝试登录 + * 根据登录表单的类型(type)将登录凭证分发给对应的 AuthenticationProvider + * 当前filter的认证逻辑 + */ + @Override + public Authentication attemptAuthentication( + HttpServletRequest request, HttpServletResponse response + ) throws AuthenticationException, IOException, ServletException { + UserLoginDTO paramUserLoginVO = new ObjectMapper().readValue(request.getInputStream(), UserLoginDTO.class); + AuthenticationManager authenticationManager = getAuthenticationManager(); + + request.setAttribute("userLoginVO", paramUserLoginVO); + log.info("尝试登录===="+ paramUserLoginVO); + + /* + WechatIdAuthenticationToken token = new WechatIdAuthenticationToken(paramUserLoginVO.getWeChatCode()); + request.setAttribute("token", token); + return authenticationManager.authenticate(token); + */ + + // 登录类型 + String loginType = paramUserLoginVO.getType(); + log.info("loginType:" + loginType); + + if ("ACCOUNT".equalsIgnoreCase(loginType)) { + // 校验 TOKEN + Cookie tempTokenCookie = CookieUtils.getCookie(request, "TEMP_TOKEN"); + + + if (tempTokenCookie == null || "".equals(tempTokenCookie.getValue())) { + throw new InternalAuthenticationServiceException("无效的请求"); + } + + String tempToken = tempTokenCookie.getValue(); + Boolean tokenIsValid = stringRedisTemplate.hasKey("tempToken:" + tempToken); + + if (tokenIsValid == null || !tokenIsValid) { + throw new InternalAuthenticationServiceException("无效的请求"); + } + + // 校验验证码 + String rightCaptcha = stringRedisTemplate.opsForValue().get("captcha:" + tempToken); + String loginCaptcha = paramUserLoginVO.getLoginCaptcha(); +/* + if (loginCaptcha == null || "".equals(loginCaptcha)) { + throw new CaptchaIsEmptyException(CodeMsg.CAPTCHA_IS_NOT_RIGHT.getMsg()); + } else if (rightCaptcha == null || "".equals(rightCaptcha)) { + throw new CaptchaIsExpiredException(CodeMsg.CAPTCHA_IS_EXPIRED.getMsg()); + } else if (!loginCaptcha.equalsIgnoreCase(rightCaptcha)) { + throw new CaptchaIsNotRightException(CodeMsg.CAPTCHA_IS_NOT_RIGHT.getMsg()); + } + */ + + // 用户名密码登录,用户名可以是用户账号名、手机号或电子邮箱 + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(paramUserLoginVO.getUsername(), paramUserLoginVO.getPassword()); + request.setAttribute("token", token); + + return authenticationManager.authenticate(token); + } else if ("MOBILE".equalsIgnoreCase(loginType)) { + // 手机号验证码登录 + MobileCaptchaAuthenticationToken token = new MobileCaptchaAuthenticationToken(paramUserLoginVO.getPhone(), paramUserLoginVO.getMobileCaptcha()); + request.setAttribute("token", token); + + return authenticationManager.authenticate(token); + } else if ("WECHAT".equalsIgnoreCase(loginType)) { + // 微信登录凭证登录 + // 如何获取登录凭证:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html + // 通过微信登录凭证获取OpenID:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html + WechatIdAuthenticationToken token = new WechatIdAuthenticationToken(paramUserLoginVO.getWeChatCode()); + request.setAttribute("token", token); + + return authenticationManager.authenticate(token); + } else { + throw new AuthenticationServiceException("登录方式错误"); + } + } + +// @Override +// public Authentication attemptAuthentication( +// HttpServletRequest request, HttpServletResponse response +// ) throws AuthenticationException, IOException, ServletException { +// UserLoginDTO paramUserLoginVO = new ObjectMapper().readValue(request.getInputStream(), UserLoginDTO.class); +// AuthenticationManager authenticationManager = getAuthenticationManager(); +// +// request.setAttribute("userLoginVO", paramUserLoginVO); +// log.info("尝试登录====" + paramUserLoginVO); +// +// // 登录类型 +// String loginType = paramUserLoginVO.getType(); +// log.info("loginType" + loginType); +// log.info("尝试登录"); +// +// if ("ACCOUNT".equalsIgnoreCase(loginType)) { +// // 校验 TOKEN +// Cookie tempTokenCookie = CookieUtils.getCookie(request, "TEMP_TOKEN"); +// +// if (tempTokenCookie == null || "".equals(tempTokenCookie.getValue())) { +// throw new InternalAuthenticationServiceException("无效的请求"); +// } +// +// String tempToken = tempTokenCookie.getValue(); +// Boolean tokenIsValid = stringRedisTemplate.hasKey("tempToken:" + tempToken); +// +// if (tokenIsValid == null || !tokenIsValid) { +// throw new InternalAuthenticationServiceException("无效的请求"); +// } +// // 校验验证码 +// String rightCaptcha = stringRedisTemplate.opsForValue().get("captcha:" + tempToken); +// String loginCaptcha = paramUserLoginVO.getLoginCaptcha(); +// +// // 用户名密码登录,用户名可以是用户账号名、手机号或电子邮箱 +// UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(paramUserLoginVO.getUsername(), paramUserLoginVO.getPassword()); +// request.setAttribute("token", token); +// +// return authenticationManager.authenticate(token); +// } else { +// throw new AuthenticationServiceException("登录方式错误"); +// } +// +// } + + + /** + * 登录成功 + * 无论以何种方式登录,登录成功后都向客户端返回 JWT,前端将该 JWT 临时存储到 localStorage 当中,以便后续的请求在请求头中携带 JWT。 + */ + @Override + protected void successfulAuthentication( + HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult + ) throws IOException { + Object principal = authResult.getPrincipal(); + log.info("principal:" + principal); + UserInfoVO userInfoVO = new UserInfoVO(); + if (principal instanceof User) { + User user = (User) principal; + BeanUtils.copyProperties(user, userInfoVO); + } + log.info("userInfoVO:" + userInfoVO); + + ObjectMapper objectMapper = new ObjectMapper(); + String userInfoJSON = objectMapper.writeValueAsString(userInfoVO); + +// UUID uuid = UUID.randomUUID(); +// String jwtTokenId = uuid.toString(); + String openId = stringRedisTemplate.opsForValue().get("user_openid:"+ userInfoVO.getUsername()); + if(openId==null){ + openId= ""; + } + + log.info("openId:" + openId);//这里是空的??? + + /* + * Jwts组成:第一部分为头部header,第二部分为载荷payload(可以理解为消息主体),第三部分为签证signature + * */ + // 生成 jwt + String jwt = Jwts.builder() + // 注入参数 + .claim("userInfo", userInfoJSON) + .setSubject(authResult.getName()) + // 设置过期时间 + .setExpiration(new Date(System.currentTimeMillis() + 48 * 60 * 60 * 1000)) // 60小时有效 + // 设置算法及密钥 + .signWith(SignatureAlgorithm.HS512, "ncst20221003") + .setId(openId) + .compact(); + + log.info("生成jwt====" + jwt); + stringRedisTemplate.opsForValue().set("jwt_token:"+authResult.getName(),jwt); + // stringRedisTemplate.delete("user_attempts:"+request.getRemoteAddr()); + // 记录登录日志 + loginLogService.addLoginLog(userInfoVO.getId(), true); + + // 返回结果 + ResultVO result = ResultUtils.success("登录成功", jwt); + response.setContentType("application/json;charset=utf-8"); + Cookie cookieToken = new Cookie("SYS_TOKEN", jwt); + cookieToken.setHttpOnly(true); + response.addCookie(cookieToken); + + log.info("登录成功"); + PrintWriter out = response.getWriter(); + out.print(new ObjectMapper().writeValueAsString(result)); + out.flush(); + out.close(); + } + + // 将权限列表转换成逗号分隔的字符串 + private String convertRoleToString(List roleList) { + StringBuilder roleStrings = new StringBuilder(); + + if (roleList == null) { + return ""; + } + + for (Role role : roleList) { + roleStrings.append(role.getName()).append(","); + } + + if (roleStrings.length() > 0) { + roleStrings.deleteCharAt(roleStrings.length() - 1); + } + + return roleStrings.toString(); + } + + // 将权限列表转换成逗号分隔的字符串 + private String convertAuthorityToString(Collection authorities) { + StringBuilder authorityString = new StringBuilder(); + + for (GrantedAuthority authority : authorities) { + authorityString.append(authority.getAuthority()).append(","); + } + + if (authorityString.length() > 0) { + authorityString.deleteCharAt(authorityString.length() - 1); + } + + return authorityString.toString(); + } + + /** + * 登录失败 + * 向前端返回登录失败的错误信息 + */ + @Override + protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException { + ResultVO resultVO; + log.debug("登录失败:"+failed); + if (failed instanceof LockedException) { + resultVO = ResultUtils.error(CodeMsg.USER_IS_LOCKED); + } else if (failed instanceof CredentialsExpiredException) { + resultVO = ResultUtils.error(CodeMsg.USER_CREDENTIALS_EXPIRED); + } else if (failed instanceof AccountExpiredException) { + resultVO = ResultUtils.error(CodeMsg.USER_ACCOUNT_EXPIRED); + } else if (failed instanceof DisabledException) { + resultVO = ResultUtils.error(CodeMsg.USER_IS_DISABLED); + } else if (failed instanceof AuthenticationException) { + Throwable cause = failed.getCause(); + if (cause instanceof BusinessException) { + BusinessException businessException = (BusinessException) cause; + resultVO = ResultUtils.error(businessException.getError()); + } else { + resultVO = ResultUtils.error(CodeMsg.USER_BAD_CREDENTIALS); + } + } else { + resultVO = ResultUtils.error(CodeMsg.LOGIN_FAIL); + } + + // 拦截后直接将错误信息反馈给前端,不经过全局异常处理器(GlobalExceptionHandler)处理 + response.setCharacterEncoding("utf-8"); + response.setContentType("application/json;charset=utf-8"); + PrintWriter out = response.getWriter(); + out.write(new ObjectMapper().writeValueAsString(resultVO)); + out.flush(); + out.close(); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/provider/WechatIdLoginProvider.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/provider/WechatIdLoginProvider.java new file mode 100644 index 0000000..82b367d --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/provider/WechatIdLoginProvider.java @@ -0,0 +1,94 @@ +package edu.ncst.carbon.config.security.provider; + +import edu.ncst.carbon.config.exception.CodeBeenUsedException; +import edu.ncst.carbon.config.security.token.WechatIdAuthenticationToken; +import edu.ncst.carbon.model.system.User; +import edu.ncst.carbon.service.IUserService; +import edu.ncst.carbon.utils.WeChatUtils; +import edu.ncst.carbon.vo.wechat.AccessTokenDTO; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +@Slf4j +public class WechatIdLoginProvider implements AuthenticationProvider { + + @Autowired + private IUserService userService; + + private final RedisTemplate stringRedisTemplate; + + @Autowired + public WechatIdLoginProvider(IUserService userService, RedisTemplate stringRedisTemplate) { + this.userService = userService; + this.stringRedisTemplate = stringRedisTemplate; + } + @SneakyThrows + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + log.info("进入到微信登录接口"); + // 获取 Code + if (!(authentication instanceof WechatIdAuthenticationToken)) { + return null; + } + + WechatIdAuthenticationToken token = (WechatIdAuthenticationToken) authentication; + String code = token.getWechatCode(); + + //公众号 + /* + SessionKeyDTO sessionKeyDTO = WeChatUtils.code2session(code); + if (sessionKeyDTO == null) { + return null; + } + String wechatId = sessionKeyDTO.getWeChatId(); + String sessionKey = sessionKeyDTO.getSessionKey(); + */ + + //小程序 + AccessTokenDTO accessTokenDTO = WeChatUtils.code2session(code); + log.info("========== 通过code2session得到:" + accessTokenDTO); + + String openId = accessTokenDTO.getOpenid(); + stringRedisTemplate.opsForValue().set("session_key:" + accessTokenDTO.getOpenid() , accessTokenDTO.getSessionKey()); + + if (openId != null && !"".equals(openId)) { + + log.info("小程序登录成功:" + openId); + + // 查找该 wechatID 已经绑定用户 +// UserWeChatDTO userWeChatDTO = userService.loadUserByOpenId(openId); + + //根据openId查询用户 + Optional userOptional = Optional.ofNullable( (User) userService.loadUserByOpenId(openId)); + + //用户存在则获取,不存在则注册 + User user = userOptional.orElseGet(() -> userService.registerByWechat(openId)); + + stringRedisTemplate.opsForValue().set("user_openid:"+ user.getUsername(),openId); + log.info("user_openid:" + openId); + return new WechatIdAuthenticationToken(user); + }else{ + throw new CodeBeenUsedException("微信登录授权code短时间重复使用."); + } + +// if (userDetails == null) { +// throw new NotBindUserException("微信授权openid无效,请重新登陆."); +// } else { +// return new WechatIdAuthenticationToken(userDetails); +// } + } + + @Override + public boolean supports(Class authentication) { + return authentication.equals(WechatIdAuthenticationToken.class); + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/JwtAuthenticationToken.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/JwtAuthenticationToken.java new file mode 100644 index 0000000..58dae64 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/JwtAuthenticationToken.java @@ -0,0 +1,39 @@ +package edu.ncst.carbon.config.security.token; + +import edu.ncst.carbon.vo.user.UserInfoVO; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import java.util.List; + +/** + * JWT认证凭证(Security Context) + */ +public class JwtAuthenticationToken extends AbstractAuthenticationToken { + + private final Object principal; + + private final Object details; + + public JwtAuthenticationToken(Object principal, List authorities, UserInfoVO userInfoVO) { + super(authorities); + this.principal = principal; + this.details = userInfoVO; + this.setAuthenticated(true); + } + + @Override + public Object getCredentials() { + return null; + } + + @Override + public Object getPrincipal() { + return this.principal; + } + + @Override + public Object getDetails() { + return this.details; + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/MobileCaptchaAuthenticationToken.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/MobileCaptchaAuthenticationToken.java new file mode 100644 index 0000000..91b0f9c --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/MobileCaptchaAuthenticationToken.java @@ -0,0 +1,39 @@ +package edu.ncst.carbon.config.security.token; + +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; + +/** + * 手机验证码方式登录凭证 + */ +public class MobileCaptchaAuthenticationToken extends AbstractAuthenticationToken { + + // 手机号码 + private String phoneNumber; + + // 验证码 + private String captchaCode; + + public MobileCaptchaAuthenticationToken(String phoneNumber, String captchaCode) { + super(null); + this.phoneNumber = phoneNumber; + this.captchaCode = captchaCode; + } + + public MobileCaptchaAuthenticationToken(Collection authorities) { + super(authorities); + } + + @Override + public Object getCredentials() { + return this.phoneNumber; + } + + @Override + public Object getPrincipal() { + return this.captchaCode; + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/WechatIdAuthenticationToken.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/WechatIdAuthenticationToken.java new file mode 100644 index 0000000..3309197 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/config/security/token/WechatIdAuthenticationToken.java @@ -0,0 +1,52 @@ +package edu.ncst.carbon.config.security.token; + +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; + +/** + * OpenId 登录 + */ +public class WechatIdAuthenticationToken extends AbstractAuthenticationToken { + + private String wechatCode; + + private final Object principal; + + public WechatIdAuthenticationToken(String wechatCode) { + super(null); + this.principal = wechatCode; + this.wechatCode = wechatCode; + } + + public WechatIdAuthenticationToken(Object principal) { + super(null); + this.principal = principal; + super.setAuthenticated(true); + } + + public WechatIdAuthenticationToken(String openId, Collection authorities) { + super(authorities); + this.principal = openId; + setAuthenticated(true); + } + + @Override + public Object getCredentials() { + return this.wechatCode; + } + + @Override + public Object getPrincipal() { + return this.principal; + } + + public String getWechatCode() { + return wechatCode; + } + + public void setWechatCode(String wechatCode) { + this.wechatCode = wechatCode; + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/CaptchaController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/CaptchaController.java new file mode 100644 index 0000000..e8395a1 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/CaptchaController.java @@ -0,0 +1,78 @@ +package edu.ncst.carbon.controller; + +import edu.ncst.carbon.utils.CaptchaUtil; +import edu.ncst.carbon.utils.CookieUtils; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@Api(description = "验证码") +@Controller +@CrossOrigin +@RequestMapping("/api") +public class CaptchaController { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @GetMapping("/captcha.jpg") + public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException { + Cookie tempTokenCookie = CookieUtils.getCookie(request, "TEMP_TOKEN"); + String tempToken = null; + Boolean tokenIsValid = false; + + // 校验 TOKEN 是否存在 + if (tempTokenCookie != null && tempTokenCookie.getValue() != null && !"".equals(tempTokenCookie.getValue())) { + tempToken = tempTokenCookie.getValue(); + } + + // 校验 TOKEN 是否有效 + if (tempToken != null) { + tokenIsValid = stringRedisTemplate.hasKey("tempToken:" + tempToken); + } + + // 如果没有 TOKEN 或者 TOKEN 失效都会生成一个新的TOKEN + if (tokenIsValid == null || !tokenIsValid) { + UUID uuid = UUID.randomUUID(); + tempToken = uuid.toString(); + + // 将临时 TOKEN 存入Redis,设置24小时的过期时间 + stringRedisTemplate.opsForValue().set("tempToken:" + tempToken, "1", 24, TimeUnit.HOURS); + + // 将临时TOKEN存入Cookie同步设置24小时过期时间 + Cookie newCookie = new Cookie("TEMP_TOKEN", tempToken); + newCookie.setMaxAge(24 * 59 * 60); + newCookie.setHttpOnly(true); + + response.addCookie(newCookie); + } + + // 生成验证码 + response.setHeader("Cache-Control", "no-store, no-cache"); + response.setContentType("image/jpeg"); + + BufferedImage image = CaptchaUtil.createImage(); + String randomText = CaptchaUtil.drawRandomText(image); + + // 将验证码存入 Redis,设置两分钟的过期时间 + stringRedisTemplate.opsForValue().set("captcha:" + tempToken, randomText, 2, TimeUnit.MINUTES); + ServletOutputStream out = response.getOutputStream(); + + ImageIO.write(image, "jpeg", out); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/SystemController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/SystemController.java new file mode 100644 index 0000000..2f010ff --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/SystemController.java @@ -0,0 +1,109 @@ +package edu.ncst.carbon.controller; + +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.system.RoleMapper; +import edu.ncst.carbon.model.system.Role; +import edu.ncst.carbon.service.IResourceService; +import edu.ncst.carbon.service.ISystemService; +import edu.ncst.carbon.service.impl.system.UserServiceImpl; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.utils.SessionUtils; +import edu.ncst.carbon.vo.ResultVO; +import edu.ncst.carbon.vo.user.AddUserDTO; +import edu.ncst.carbon.vo.user.UserInfoVO; +import edu.ncst.carbon.vo.wechat.BindUserDTO; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.DigestUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@Api(hidden = true) +@RestController +@CrossOrigin +@RequestMapping("/api/system") +@Slf4j +public class SystemController { + + @Autowired + private UserServiceImpl userService; + + @Autowired + private ISystemService systemService; + + @Autowired + private IResourceService resourceService; + + @Autowired + private RoleMapper roleMapper; + + @GetMapping("/init") + @Transactional + public ResponseEntity initSystem() { + // 创建角色 + Role adminRole = roleMapper.getRoleByName("SUPER_ADMIN"); + + if (adminRole == null) { + Role role = new Role(); + role.setEnable(true); + role.setName("SUPER_ADMIN"); + role.setLabel("超级管理员"); + roleMapper.insert(role); + adminRole = role; + } + + UserDetails admin = null; + + try { + admin = userService.loadUserByUsername("admin"); + } catch (BusinessException ex) { + log.info("没有找到超级管理员账号,重新创建。"); + } + + if (admin == null) { + AddUserDTO adminUser = new AddUserDTO(); + adminUser.setUsername("super-admin"); + adminUser.setFullName("超级管理员"); + adminUser.setPhone("10100000000"); + adminUser.setEmail("smart@ncst.com"); + + String password = DigestUtils.md5DigestAsHex("123456ncstslat".getBytes()); + log.info(password); + adminUser.setPassword(password); + + List roleIds = new ArrayList<>(); + roleIds.add(adminRole.getId()); + adminUser.setRoles(roleIds); + + userService.addUser(adminUser); + } + + return ResponseUtils.success("初始化成功"); + } + + @PostMapping("/interface/meta/reimport/") + public ResultVO reimportInterfaceMeta() { + UserInfoVO currentUser = SessionUtils.getCurrentUser(); + List roles = currentUser.getRoles(); + + boolean isSuperAdmin = roles.contains(Role.forName("SUPER_ADMIN")); + + if (isSuperAdmin) { + resourceService.reimportInterfaceMeta(); + return ResultUtils.success("ok", null); + } else { + return ResultUtils.error(CodeMsg.CAN_NOT_DATA_ACCESS); + } + } + + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaController.java new file mode 100644 index 0000000..73033be --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaController.java @@ -0,0 +1,108 @@ +package edu.ncst.carbon.controller.carbon; + +import edu.ncst.carbon.aspect.LogOperate; +import edu.ncst.carbon.model.carbon.CarFormula; +import edu.ncst.carbon.service.ICarbonFormulaService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import edu.ncst.carbon.vo.carbon.CalculationResults; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 碳公式 控制器 + */ +@Api(description = "碳公式 控制器", tags = "CarbonFormulaController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/carbon-formula") +public class CarbonFormulaController { + + private final ICarbonFormulaService carbonFormulaService; + + public CarbonFormulaController(ICarbonFormulaService carbonFormulaService) { + this.carbonFormulaService = carbonFormulaService; + } + + // 主要用于计算碳排放量和碳积分 + /* + * 参数:计算参数 CalculateParameters(内部可自行修改) + * 返回值:计算结果 CalculationResults(内部可自行修改) + * + * */ + @ApiOperation("计算") + @GetMapping("/calculation") + public ResultVO calculation(@RequestParam Integer carFormulaId) { + CalculationResults result = carbonFormulaService.calculation(carFormulaId); + + return ResultUtils.success("ok", result); + } + + // 主要用于碳公式的小程序计算页面的渲染 + /* + * 参数:分类id(可自行修改) + * 返回值:列表list,每行为一个碳公式CarFormula + * + * */ + @ApiOperation("按照分类获取碳公式列表") + @GetMapping("/getListByTypeId") + public ResultVO> getCarFormulaListByTypeId(@RequestParam Integer typeId) { + List CarFormulaList = null; + + return ResultUtils.success("ok", CarFormulaList); + } + + // 主要用于碳公式的管理页面 + @ApiOperation("获取碳公式列表") + @GetMapping("/list") + public ResultVO> getCarFormulaList(Query query) { + ListResultVO CarFormulaList = carbonFormulaService.getCarFormulaList(query); + + return ResultUtils.success("ok", CarFormulaList); + } + + @ApiOperation("获取碳公式详情") + @GetMapping("/detail") + public ResultVO getCarFormulaDetail(@RequestParam Integer id) { + CarFormula CarFormulaDetail = carbonFormulaService.getCarFormulaDetail(id); + + return ResultUtils.success("ok", CarFormulaDetail); + } + + @ApiOperation("添加碳公式") + @LogOperate + @PostMapping("/add") + public ResultVO addCarFormula(@RequestBody CarFormula carFormula) { + CarFormula result = carbonFormulaService.addCarFormula(carFormula); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改碳公式") + @LogOperate + @PostMapping("/modify") + public ResultVO modifyCarFormula(@RequestBody CarFormula carFormula) { + CarFormula result = carbonFormulaService.modifyCarFormula(carFormula); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除碳公式") + @LogOperate + @PostMapping("/delete") + public ResponseEntity deleteCarFormula(@RequestParam Integer id) { + carbonFormulaService.deleteCarFormula(id); + + return ResponseUtils.success("删除成功"); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaTypeController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaTypeController.java new file mode 100644 index 0000000..5ce0f3c --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaTypeController.java @@ -0,0 +1,75 @@ +package edu.ncst.carbon.controller.carbon; + +import edu.ncst.carbon.aspect.LogOperate; +import edu.ncst.carbon.model.carbon.CarFormulaType; +import edu.ncst.carbon.service.ICarbonFormulaTypeService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +/** + * 碳公式类别 控制器 + */ +@Api(description = "碳公式类别 控制器", tags = "CarbonFormulaTypeController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/carbon-formula-type") +public class CarbonFormulaTypeController { + private final ICarbonFormulaTypeService carbonFormulaTypeService; + + public CarbonFormulaTypeController(ICarbonFormulaTypeService carbonFormulaTypeService) { + this.carbonFormulaTypeService = carbonFormulaTypeService; + } + + // 主要用于碳公式类别的管理页面 + @ApiOperation("获取碳公式类别列表") + @GetMapping("/list") + public ResultVO> getCarFormulaTypeList(Query query) { + ListResultVO CarFormulaTypeList = carbonFormulaTypeService.getCarFormulaTypeList(query); + + return ResultUtils.success("ok", CarFormulaTypeList); + } + + @ApiOperation("获取碳公式类别详情") + @GetMapping("/detail") + public ResultVO getCarFormulaTypeDetail(@RequestParam Integer id) { + CarFormulaType CarFormulaTypeDetail = carbonFormulaTypeService.getCarFormulaTypeDetail(id); + + return ResultUtils.success("ok", CarFormulaTypeDetail); + } + + @ApiOperation("添加碳公式类别") + @LogOperate + @PostMapping("/add") + public ResultVO addCarFormulaType(@RequestBody CarFormulaType carFormulaType) { + CarFormulaType result = carbonFormulaTypeService.addCarFormulaType(carFormulaType); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改碳公式类别") + @LogOperate + @PostMapping("/modify") + public ResultVO modifyCarFormulaType(@RequestBody CarFormulaType carFormulaType) { + CarFormulaType result = carbonFormulaTypeService.modifyCarFormulaType(carFormulaType); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除碳公式类别") + @LogOperate + @PostMapping("/delete") + public ResponseEntity deleteCarFormulaType(@RequestParam Integer id) { + carbonFormulaTypeService.deleteCarFormulaType(id); + + return ResponseUtils.success("删除成功"); + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaUnitController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaUnitController.java new file mode 100644 index 0000000..3d1f3ce --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/carbon/CarbonFormulaUnitController.java @@ -0,0 +1,75 @@ +package edu.ncst.carbon.controller.carbon; + +import edu.ncst.carbon.aspect.LogOperate; +import edu.ncst.carbon.model.carbon.CarFormulaUnit; +import edu.ncst.carbon.service.ICarbonFormulaUnitService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +/** + * 碳公式单位 控制器 + */ +@Api(description = "碳公式单位 控制器", tags = "CarbonFormulaUnitController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/carbon-formula-unit") +public class CarbonFormulaUnitController { + private final ICarbonFormulaUnitService carbonFormulaUnitService; + + public CarbonFormulaUnitController(ICarbonFormulaUnitService carbonFormulaUnitService) { + this.carbonFormulaUnitService = carbonFormulaUnitService; + } + + // 主要用于碳公式单位的管理页面 + @ApiOperation("获取碳公式单位列表") + @GetMapping("/list") + public ResultVO> getCarFormulaUnitList(Query query) { + ListResultVO CarFormulaUnitList = carbonFormulaUnitService.getCarFormulaUnitList(query); + + return ResultUtils.success("ok", CarFormulaUnitList); + } + + @ApiOperation("获取碳公式单位详情") + @GetMapping("/detail") + public ResultVO getCarFormulaUnitDetail(@RequestParam Integer id) { + CarFormulaUnit CarFormulaUnitDetail = carbonFormulaUnitService.getCarFormulaUnitDetail(id); + + return ResultUtils.success("ok", CarFormulaUnitDetail); + } + + @ApiOperation("添加碳公式单位") + @LogOperate + @PostMapping("/add") + public ResultVO addCarFormulaUnit(@RequestBody CarFormulaUnit carFormulaUnit) { + CarFormulaUnit result = carbonFormulaUnitService.addCarFormulaUnit(carFormulaUnit); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改碳公式单位") + @LogOperate + @PostMapping("/modify") + public ResultVO modifyCarFormulaUnit(@RequestBody CarFormulaUnit carFormulaUnit) { + CarFormulaUnit result = carbonFormulaUnitService.modifyCarFormulaUnit(carFormulaUnit); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除碳公式单位") + @LogOperate + @PostMapping("/delete") + public ResponseEntity deleteCarFormulaUnit(@RequestParam Integer id) { + carbonFormulaUnitService.deleteCarFormulaUnit(id); + + return ResponseUtils.success("删除成功"); + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/charity/CharityController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/charity/CharityController.java new file mode 100644 index 0000000..622ce57 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/charity/CharityController.java @@ -0,0 +1,4 @@ +package edu.ncst.carbon.controller.charity; + +public class CharityController { +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/goods/GoodsController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/goods/GoodsController.java new file mode 100644 index 0000000..96bece5 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/goods/GoodsController.java @@ -0,0 +1,81 @@ +package edu.ncst.carbon.controller.goods; + +import edu.ncst.carbon.aspect.LogOperate; +import edu.ncst.carbon.model.goods.Goods; +import edu.ncst.carbon.service.IGoodsService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 商品 控制器 + */ +@Api(description = "商品 控制器", tags = "GoodsController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/goods") +public class GoodsController { + + private final IGoodsService GoodsService; + + public GoodsController(IGoodsService GoodsService) { + this.GoodsService = GoodsService; + } + + // 主要用于商品的管理页面 + @ApiOperation("获取商品列表") + @GetMapping("/list") + public ResultVO> getGoodsList(Query query) { + ListResultVO GoodsList = GoodsService.getGoodsList(query); + + return ResultUtils.success("ok", GoodsList); + } + + @ApiOperation("获取商品详情") + @GetMapping("/detail") + public ResultVO getGoodsDetail(@RequestParam Integer id) { + Goods GoodsDetail = GoodsService.getGoodsDetail(id); + + return ResultUtils.success("ok", GoodsDetail); + } + + @ApiOperation("添加商品") + @LogOperate + @PostMapping("/add") + public ResultVO addGoods(@RequestBody Goods Goods) { + Goods result = GoodsService.addGoods(Goods); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改商品") + @LogOperate + @PostMapping("/modify") + public ResultVO modifyGoods(@RequestBody Goods Goods) { + Goods result = GoodsService.modifyGoods(Goods); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除商品") + @LogOperate + @PostMapping("/delete") + public ResponseEntity deleteGoods(@RequestParam Integer id) { + GoodsService.deleteGoods(id); + + return ResponseUtils.success("删除成功"); + } + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/image/ImageController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/image/ImageController.java new file mode 100644 index 0000000..0e6cc5c --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/image/ImageController.java @@ -0,0 +1,63 @@ +package edu.ncst.carbon.controller.image; + +import edu.ncst.carbon.service.impl.image.ImageServiceImpl; +import edu.ncst.carbon.utils.SessionUtils; +import edu.ncst.carbon.vo.user.UserInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.*; + +@RestController +@Slf4j +@CrossOrigin +@Api(description = "图片上传管理", tags = "ImageController") +@RequestMapping("/api/image") +public class ImageController { + + @Autowired + ImageServiceImpl imageService; + + // 读取配置文件中上传路径 + @Value("${file.file-dir}") + String imagePath; + + @ApiOperation("上传图片") + @PostMapping("/upload/{namePrefix}") + public String uploadImage(@RequestParam(value = "file",required = false) MultipartFile file , HttpServletRequest request,@PathVariable String namePrefix) throws FileNotFoundException { + UserInfoVO currentUser = SessionUtils.getCurrentUser(); + log.debug("上传图片的用户:" + currentUser.getUsername()); + String result = imageService.uploadImage(file, request,namePrefix); + return result; + } + + + @ApiOperation("获取图片") + @GetMapping("/get/{imageName}") + public void getImage(HttpServletRequest request, HttpServletResponse response, @PathVariable String imageName) throws IOException { + // UserInfoVO currentUser = SessionUtils.getCurrentUser(); + log.info(imagePath + imageName); + BufferedImage image = null; + try { + image = ImageIO.read(new File(imagePath + "/" + imageName)); + } catch (IOException e) { + return; + } + + response.setHeader("Cache-Control", "no-store, no-cache"); + response.setContentType("image/jpeg"); + ServletOutputStream out = response.getOutputStream(); + + ImageIO.write(image, "jpeg", out); + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserController.java new file mode 100644 index 0000000..df912c8 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserController.java @@ -0,0 +1,87 @@ +package edu.ncst.carbon.controller.log; + +import edu.ncst.carbon.aspect.LogOperate; +import edu.ncst.carbon.model.log.LogUser; +import edu.ncst.carbon.service.ILogUserService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +/** + * 用户当前数据 控制器 + */ +@Api(description = "用户信息 控制器", tags = "LogUserController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/log-user") +public class LogUserController { + + private final ILogUserService logUserService; + + public LogUserController(ILogUserService logUserService) { + this.logUserService = logUserService; + } + + // 主要用于商品的管理页面 + @ApiOperation("获取商品列表") + @GetMapping("/list") + public ResultVO> getLogUserList(Query query) { + ListResultVO LogUserList = logUserService.getLogUserList(query); + + return ResultUtils.success("ok", LogUserList); + } + + @ApiOperation("获取商品详情") + @GetMapping("/detail") + public ResultVO getLogUserDetail(@RequestParam Integer id) { + LogUser LogUserDetail = logUserService.getLogUserDetail(id); + + return ResultUtils.success("ok", LogUserDetail); + } + + @ApiOperation("添加商品") + @LogOperate + @PostMapping("/add") + public ResultVO addLogUser(@RequestBody LogUser LogUser) { + LogUser result = logUserService.addLogUser(LogUser); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改商品") + @LogOperate + @PostMapping("/modify") + public ResultVO modifyLogUser(@RequestBody LogUser LogUser) { + LogUser result = logUserService.modifyLogUser(LogUser); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除商品") + @LogOperate + @PostMapping("/delete") + public ResponseEntity deleteLogUser(@RequestParam Integer id) { + logUserService.deleteLogUser(id); + + return ResponseUtils.success("删除成功"); + } + + /* + * 参数:用户id + * 返回值:碳积分 + * */ + @ApiOperation("获取当前用户碳积分总数") + @GetMapping("/getUserIntegral") + public ResultVO getUserIntegral(Integer userId) { + Integer result = null; + return ResultUtils.success("ok", result); + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserFootprintController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserFootprintController.java new file mode 100644 index 0000000..edd03dd --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserFootprintController.java @@ -0,0 +1,88 @@ +package edu.ncst.carbon.controller.log; + +import edu.ncst.carbon.aspect.LogOperate; +import edu.ncst.carbon.model.log.LogUserFootprint; +import edu.ncst.carbon.service.ILogUserFootprintService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 用户碳足迹 控制器 + */ +@Api(description = "用户碳足迹 控制器", tags = "LogUserFootprintController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/log-user-footprint") +public class LogUserFootprintController { + + private final ILogUserFootprintService logUserFootprintService; + + public LogUserFootprintController(ILogUserFootprintService logUserFootprintService) { + this.logUserFootprintService = logUserFootprintService; + } + + // 主要用于用户碳足迹的管理页面 + @ApiOperation("获取所有碳足迹列表") + @GetMapping("/list") + public ResultVO> getLogFootprintList(Query query) { + ListResultVO LogUserFootprintList = logUserFootprintService.getLogFootprintList(query); + + return ResultUtils.success("ok", LogUserFootprintList); + } + + // 主要用于用户碳足迹的管理页面 + @ApiOperation("获取用户碳足迹列表") + @GetMapping("/listByUserId") + public ResultVO> getLogUserFootprintList(Integer userId) { + List LogUserFootprintList = logUserFootprintService.getLogUserFootprintList(userId); + + return ResultUtils.success("ok", LogUserFootprintList); + } + + @ApiOperation("获取用户碳足迹详情") + @GetMapping("/detail") + public ResultVO getLogUserFootprintDetail(@RequestParam Integer id) { + LogUserFootprint LogUserFootprintDetail = logUserFootprintService.getLogUserFootprintDetail(id); + + return ResultUtils.success("ok", LogUserFootprintDetail); + } + + @ApiOperation("添加用户碳足迹") + @LogOperate + @PostMapping("/add") + public ResultVO addLogUserFootprint(@RequestBody LogUserFootprint LogUserFootprint) { + LogUserFootprint result = logUserFootprintService.addLogUserFootprint(LogUserFootprint); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改用户碳足迹") + @LogOperate + @PostMapping("/modify") + public ResultVO modifyLogUserFootprint(@RequestBody LogUserFootprint LogUserFootprint) { + LogUserFootprint result = logUserFootprintService.modifyLogUserFootprint(LogUserFootprint); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除用户碳足迹") + @LogOperate + @PostMapping("/delete") + public ResponseEntity deleteLogUserFootprint(@RequestParam Integer id) { + logUserFootprintService.deleteLogUserFootprint(id); + + return ResponseUtils.success("删除成功"); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserGoodsController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserGoodsController.java new file mode 100644 index 0000000..ffe6c03 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/log/LogUserGoodsController.java @@ -0,0 +1,76 @@ +package edu.ncst.carbon.controller.log; + +import edu.ncst.carbon.aspect.LogOperate; +import edu.ncst.carbon.model.log.LogUserGoods; +import edu.ncst.carbon.service.ILogUserGoodsService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +/** + * 用户商品购买记录 控制器 + */ +@Api(description = "用户商品购买记录 控制器", tags = "LogUserGoodsController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/log-user-goods") +public class LogUserGoodsController { + + private final ILogUserGoodsService LogUserGoodsService; + + public LogUserGoodsController(ILogUserGoodsService LogUserGoodsService) { + this.LogUserGoodsService = LogUserGoodsService; + } + + // 主要用于用户商品购买记录的管理页面 + @ApiOperation("获取用户商品购买记录列表") + @GetMapping("/list") + public ResultVO> getLogUserGoodsList(Query query) { + ListResultVO LogUserGoodsList = LogUserGoodsService.getLogUserGoodsList(query); + + return ResultUtils.success("ok", LogUserGoodsList); + } + + @ApiOperation("获取用户商品购买记录详情") + @GetMapping("/detail") + public ResultVO getLogUserGoodsDetail(@RequestParam Integer id) { + LogUserGoods LogUserGoodsDetail = LogUserGoodsService.getLogUserGoodsDetail(id); + + return ResultUtils.success("ok", LogUserGoodsDetail); + } + + @ApiOperation("添加用户商品购买记录") + @LogOperate + @PostMapping("/add") + public ResultVO addLogUserGoods(@RequestBody LogUserGoods LogUserGoods) { + LogUserGoods result = LogUserGoodsService.addLogUserGoods(LogUserGoods); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改用户商品购买记录") + @LogOperate + @PostMapping("/modify") + public ResultVO modifyLogUserGoods(@RequestBody LogUserGoods LogUserGoods) { + LogUserGoods result = LogUserGoodsService.modifyLogUserGoods(LogUserGoods); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除用户商品购买记录") + @LogOperate + @PostMapping("/delete") + public ResponseEntity deleteLogUserGoods(@RequestParam Integer id) { + LogUserGoodsService.deleteLogUserGoods(id); + + return ResponseUtils.success("删除成功"); + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/MenuController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/MenuController.java new file mode 100644 index 0000000..ab31d80 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/MenuController.java @@ -0,0 +1,130 @@ +package edu.ncst.carbon.controller.system; + +import edu.ncst.carbon.aspect.LoginUserScope; +import edu.ncst.carbon.model.system.Menu; +import edu.ncst.carbon.service.IMenuService; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +; + +/** + * 菜单 控制器 + */ +@Api(description = "菜单管理", tags = "MenuController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/menu") +public class MenuController { + + private final IMenuService menuService; + + public MenuController(IMenuService menuService) { + this.menuService = menuService; + } + + @ApiOperation("获取菜单列表") + @GetMapping("/list") + public ResultVO> getMenuList(Query query) { + ListResultVO menuList = menuService.getMenuList(query); + + return ResultUtils.success("ok", menuList); + } + + @ApiOperation("获取菜单树") + @GetMapping("/tree") + public ResultVO> getMenuTree() { + List menuTree = menuService.getMenuTree(); + return ResultUtils.success("ok", menuTree); + } + + @ApiOperation("获取指定角色能够访问的菜单ID列表") + @GetMapping("/ids/role") + public ResultVO> getRoleMenuIds(Integer roleId) { + List menuIds = menuService.getRoleMenuIds(roleId,true); + return ResultUtils.success("ok", menuIds); + } + + @ApiOperation("获取菜单详情") + @PostMapping("/detail") + public ResultVO getMenuDetail(@RequestParam Integer id) { + Menu menuDetail = menuService.getMenuDetail(id); + + return ResultUtils.success("ok", menuDetail); + } + + @ApiOperation("添加菜单") + @PostMapping("/add") + public ResultVO addMenu(@RequestBody Menu menu) { + log.info("将要添加的菜单:" + menu); + Menu result = menuService.addMenu(menu); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改菜单") + @PostMapping("/modify") + public ResultVO modifyMenu(@RequestBody Menu menu) { + Menu result = menuService.modifyMenu(menu); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除菜单") + @PostMapping("/delete") + public ResultVO deleteMenu(@RequestParam Integer id) { + menuService.deleteMenu(id); + + return ResultUtils.success("ok", null); + } + +// @ApiOperation("批量删除菜单") +// @PostMapping("/batch/delete") +// public ResultVO batchDeleteMenu(@RequestBody BatchDeleteDTO batchDeleteDTO) { +// menuService.batchDeleteMenu(batchDeleteDTO); +// +// return ResultUtils.success("ok", null); +// } + + @ApiOperation("获取指定用户可访问的菜单列表") + @GetMapping("/user/{userId}") + public ResultVO> getUserMenuList(@PathVariable Integer userId) { + return ResultUtils.success("ok", null); + } + + @ApiOperation("获取当前用户可访问的菜单列表") + @GetMapping("/user/current") + public ResultVO> getCurrentUserMenuTree() { + List currentUserMenuTree = menuService.getCurrentUserMenuTree(); + + return ResultUtils.success("ok", currentUserMenuTree); + } + + @ApiOperation("获取当前用户可访问的菜单列表") + @LoginUserScope + @GetMapping("/user/authority") + public ResultVO> getCurrentUserMenuAuthority() { + List currentUserMenuTree = menuService.getCurrentUserMenuAuthority(); + + return ResultUtils.success("ok", currentUserMenuTree); + } + + +// @ApiOperation("重置菜单元信息") +// @PostMapping("/reset") +// public ResponseEntity resetMenuMeta(@RequestBody ResetMenuDTO resetMenuDTO) { +// menuService.resetMenuMeta(resetMenuDTO); +// +// return ResponseUtils.success("ok", null); +// } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/RoleController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/RoleController.java new file mode 100644 index 0000000..d39adc6 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/RoleController.java @@ -0,0 +1,120 @@ +package edu.ncst.carbon.controller.system; + +import edu.ncst.carbon.model.system.Role; +import edu.ncst.carbon.service.IRoleService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import edu.ncst.carbon.vo.role.ModifyRoleInterfacePermissionDTO; +import edu.ncst.carbon.vo.role.ModifyRoleMenuPermissionDTO; +import edu.ncst.carbon.vo.role.RoleDetailVO; +import edu.ncst.carbon.vo.role.RoleShortItemVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 角色 控制器 + */ +@Api(description = "角色管理", tags = "RoleController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/role") +public class RoleController { + + private final IRoleService roleService; + + public RoleController(IRoleService roleService) { + this.roleService = roleService; + } + + @ApiOperation("获取角色列表") + @GetMapping("/list") + public ResultVO> getRoleList(Query query) { + ListResultVO roleList = roleService.getRoleList(query); + + return ResultUtils.success("ok", roleList); + } + + @ApiOperation("选取角色列表") + @GetMapping("/list/select") + public ResultVO> selectRoleList() { + List roleList = roleService.selectRoleList(); + + return ResultUtils.success("ok", roleList); + } + + @ApiOperation("获取角色详情") + @PostMapping("/detail") + public ResultVO getRoleDetail(@RequestParam Integer id) { + RoleDetailVO roleDetail = roleService.getRoleDetail(id); + + return ResultUtils.success("ok", roleDetail); + } + + @ApiOperation("添加角色") + @PostMapping("/add") + public ResultVO addRole(@RequestBody RoleDetailVO addRoleDTO) { + RoleDetailVO result = roleService.addRole(addRoleDTO); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改角色") + @PostMapping("/modify") + public ResultVO modifyRole(@RequestBody RoleDetailVO role) { + RoleDetailVO result = roleService.modifyRole(role); + + return ResultUtils.success("ok", result); + } + + // Not OK + @ApiOperation("修改角色菜单权限") + @PostMapping("/modify/permission/menu") + public ResultVO modifyRoleMenuPermission(@RequestBody ModifyRoleMenuPermissionDTO modifyDTO) { + roleService.modifyRoleMenuPermission(modifyDTO); + + return ResultUtils.success("ok", null); + } + // Not OK + @ApiOperation("修改角色资源权限") + @PostMapping("/modify/permission/resource") + public ResultVO modifyRoleInterfacePermission(@RequestBody ModifyRoleInterfacePermissionDTO modifyDTO) { + roleService.modifyRoleInterfacePermission(modifyDTO); + + return ResultUtils.success("ok", null); + } + + // Not OK + @ApiOperation("删除角色") + @PostMapping("/delete") + public ResponseEntity deleteRole(@RequestParam Integer id) { + roleService.deleteRole(id); + + return ResponseUtils.success("删除成功"); + } + + @ApiOperation("批量删除角色") + @PostMapping("/batch/delete") + public ResponseEntity deleteRoles(@RequestParam List ids) { + roleService.deleteRoles(ids); + + return ResponseUtils.success("删除成功"); + } + + @ApiOperation("修改角色启用状态") + @PostMapping("/enable") + public ResponseEntity setRoleEnable(Integer roleId, Boolean enable) { + roleService.setRoleEnable(roleId, enable); + + return ResponseUtils.success("ok"); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/RoleMenuController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/RoleMenuController.java new file mode 100644 index 0000000..6e79337 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/RoleMenuController.java @@ -0,0 +1,60 @@ +package edu.ncst.carbon.controller.system; + +import edu.ncst.carbon.model.system.RoleMenu; +import edu.ncst.carbon.service.IRoleMenuService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +; + +/** + * 角色菜单 控制器 + */ +@Api(description = "角色菜单 控制器", tags = "RoleMenuController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/role-menu") +public class RoleMenuController { + + private final IRoleMenuService roleMenuService; + + public RoleMenuController(IRoleMenuService roleMenuService) { + this.roleMenuService = roleMenuService; + } + + @ApiOperation("获取角色菜单列表") + @GetMapping("/list") + public ResultVO> getRoleMenuList(Query query) { + ListResultVO roleMenuList = roleMenuService.getRoleMenuList(query); + + return ResultUtils.success("ok", roleMenuList); + } + + + @ApiOperation("添加角色菜单") + @PostMapping("/add") + public ResultVO addRoleMenu(@RequestBody RoleMenu roleMenu) { + RoleMenu result = roleMenuService.addRoleMenu(roleMenu); + + return ResultUtils.success("ok", result); + } + + + @ApiOperation("删除角色菜单") + @PostMapping("/delete") + public ResponseEntity deleteRoleMenu(@RequestParam Integer id) { + roleMenuService.deleteRoleMenu(id); + + return ResponseUtils.success("删除成功"); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/UserController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/UserController.java new file mode 100644 index 0000000..2f30a40 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/system/UserController.java @@ -0,0 +1,174 @@ +package edu.ncst.carbon.controller.system; + +import edu.ncst.carbon.aspect.LoginUserScope; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.model.system.Role; +import edu.ncst.carbon.model.system.User; +import edu.ncst.carbon.service.IUserService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.utils.SessionUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.ResultVO; +import edu.ncst.carbon.vo.query.UserQuery; +import edu.ncst.carbon.vo.user.*; +import edu.ncst.carbon.vo.wechat.BindUserDTO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.util.DigestUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +; +import java.util.ArrayList; +import java.util.List; + +/** + * 用户 控制器 + */ +@Api(description = "用户管理", tags = "UserController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/user") +public class UserController { + + private final IUserService userService; + + public UserController(IUserService userService ) { + this.userService = userService; + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public ResultVO> getUserList(UserQuery query) { + + ListResultVO userList = userService.getUserList(query);//List + + return ResultUtils.success("ok", userList); + } + + @ApiOperation("选择用户列表") + @GetMapping("/select") + public ResultVO> selectUserList(String keyword) { + List userList = userService.selectUserList(keyword); + + return ResultUtils.success("ok", userList); + } + + @ApiOperation("获取用户详情") + @PostMapping("/detail") + public ResultVO getUserDetail(@RequestParam Integer id) { + UserInfoVO userDetail = userService.getUserDetail(id); + return ResultUtils.success("ok", userDetail); + } + + @ApiOperation("添加用户") + @PostMapping("/add") + public ResultVO addUser(@RequestBody AddUserDTO addUserDTO, BindingResult bindingResult) { + + // BindingResult用在实体类校验信息返回结果绑定 + if (bindingResult.hasErrors()) { + throw new BusinessException(CodeMsg.BIND_ERROR.fillFieldError(bindingResult)); + } + + UserInfoVO result = userService.addUser(addUserDTO); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改用户") + @PostMapping("/modify") + public ResultVO modifyUser(@RequestBody UpdateUserDTO updateUserDTO ,BindingResult bindingResult) { + if (bindingResult.hasErrors()) { + throw new BusinessException(CodeMsg.BIND_ERROR.fillFieldError(bindingResult)); + } + + UserInfoVO result = userService.modifyUser(updateUserDTO); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除用户") + @PostMapping("/delete") + public ResponseEntity deleteUser(@RequestParam Integer id) { + userService.deleteUser(id); + + return ResponseUtils.success("删除成功"); + } + + //not ok + @ApiOperation("获取当前用户信息") + //@LoginUserScope + @GetMapping("/current") + public ResponseEntity getCurrentUser() { + //if(SessionUtils.userIsLogin()){ + + UserInfoVO currentUser = SessionUtils.getCurrentUser(); + UserInfoVO UserInfoVO = new UserInfoVO(); + + CurrentUserDTO currentUserDTO = new CurrentUserDTO(); + currentUserDTO.setUsername(currentUser.getUsername()); + currentUserDTO.setFullName(currentUser.getFullName()); + //currentUserDTO.setNickname(currentUser.getNickname()); + currentUserDTO.setAvatar("http://pic.17qq.com/img_qqtouxiang/11761377.jpeg"); + //currentUserDTO.setUnreadCount(0); + //currentUserDTO.setUnitId(currentUser.getUnitId()); + currentUserDTO.setUserId(currentUser.getId()); + + //if(1==currentUser.getUnitId()){ + + for(Role role:currentUser.getRoles()){ + if(role.getName().compareTo("EQUIPMENT_ADMIN")==0||role.getName().compareTo("SUPER_ADMIN")==0){ + // return true; + //是否总公司管理员 + //currentUserDTO.setIsHeadOfficer(Boolean.TRUE); + break; + } + } + //} + + BeanUtils.copyProperties(currentUser, UserInfoVO); + + return ResponseUtils.success(currentUserDTO); + +// }else{ +// return ResponseUtils.error(CodeMsg.USER_NEED_LOGIN); +// } + } + + @ApiOperation("修改用户启用状态") + @PostMapping("/enable") + public ResponseEntity setUserEnable(Integer userId, Boolean enable) { + userService.setUserEnable(userId, enable); + + return ResponseUtils.success("ok"); + } + + @ApiOperation("重置用户密码") + @PostMapping("/resetPassword") + public ResultVO resetUserPassword(@RequestBody ResetUserPasswordDTO resetUserPasswordDTO, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { + throw new BusinessException(CodeMsg.BIND_ERROR.fillFieldError(bindingResult)); + } + + UserInfoVO result = userService.resetUserPassword(resetUserPasswordDTO); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("绑定微信用户信息") + @PostMapping("/bind") + public ResponseEntity bindUserInfo(@RequestBody BindUserDTO bindUserInfo) { + + userService.bindWeChat(bindUserInfo); + + return ResponseUtils.success("绑定成功"); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/task/TaskAuditController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/task/TaskAuditController.java new file mode 100644 index 0000000..eb8ada5 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/task/TaskAuditController.java @@ -0,0 +1,142 @@ +package edu.ncst.carbon.controller.task; + + +import edu.ncst.carbon.aspect.LogOperate; +import edu.ncst.carbon.model.task.TaskAudit; +import edu.ncst.carbon.service.ITaskAuditService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.utils.SessionUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import edu.ncst.carbon.vo.user.UserInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + +@Api(description = "任务审核管理", tags = "TaskAuditController") +@RestController +@Slf4j +@CrossOrigin +@RequestMapping("/api/task-audit") +public class TaskAuditController { + + private final ITaskAuditService taskAuditService; + + // 读取配置文件中上传路径 + @Value("${file.file-dir}") + String imagePath; + + public TaskAuditController(ITaskAuditService taskAuditService) { + this.taskAuditService = taskAuditService; + } + + // 主要用于审核任务的管理页面 + @ApiOperation("获取审核任务列表") + @GetMapping("/list") + public ResultVO> getTaskAuditList(Query query) { + ListResultVO TaskAuditList = taskAuditService.getTaskAuditList(query); + + return ResultUtils.success("ok", TaskAuditList); + } + + @ApiOperation("获取审核任务详情") + @GetMapping("/detail") + public ResultVO getTaskAuditDetail(@RequestParam Integer id) { + TaskAudit TaskAuditDetail = taskAuditService.getTaskAuditDetail(id); + + return ResultUtils.success("ok", TaskAuditDetail); + } + + @ApiOperation("添加审核任务") + @LogOperate + @PostMapping("/add") + public ResultVO addTaskAudit(@RequestBody TaskAudit TaskAudit) { + TaskAudit result = taskAuditService.addTaskAudit(TaskAudit); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改审核任务") + @LogOperate + @PostMapping("/modify") + public ResultVO modifyTaskAudit(@RequestBody TaskAudit TaskAudit) { + TaskAudit result = taskAuditService.modifyTaskAudit(TaskAudit); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除审核任务") + @LogOperate + @PostMapping("/delete") + public ResponseEntity deleteTaskAudit(@RequestParam Integer id) { + taskAuditService.deleteTaskAudit(id); + + return ResponseUtils.success("删除成功"); + } + + @ApiOperation("上传审核任务") + @PostMapping("/upload") + public ResponseEntity uploadAudit( @RequestParam(value = "file",required = false) MultipartFile file , + HttpServletRequest request, + @RequestParam Integer integral, + @RequestParam Integer taskId, + @RequestParam String text) throws FileNotFoundException { + + taskAuditService.uploadAudit(file, request, text, taskId, integral); + return ResponseUtils.success("上传成功"); + } + + @ApiOperation("获取审核任务") + @GetMapping("/get/{imageName}") + public void getImage(HttpServletRequest request, HttpServletResponse response, @PathVariable String imageName) throws IOException { + // UserInfoVO currentUser = SessionUtils.getCurrentUser(); + log.info(imagePath + imageName); + BufferedImage image = null; + try { + image = ImageIO.read(new File(imagePath + "/" + imageName)); + } catch (IOException e) { + return; + } + + response.setHeader("Cache-Control", "no-store, no-cache"); + response.setContentType("image/jpeg"); + ServletOutputStream out = response.getOutputStream(); + + ImageIO.write(image, "jpeg", out); + } + + + @ApiOperation("开始审核任务") + @PostMapping("/Audit") + public ResultVO Audit( @RequestParam Integer taskAuditId, @RequestParam Boolean yesNo) { + + TaskAudit result = taskAuditService.audit(taskAuditId, yesNo); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("用户确认审核任务") + @PostMapping("/confirm") + public ResultVO confirmAudit( @RequestParam Integer taskAuditId) { + + TaskAudit result = taskAuditService.confirmAudit(taskAuditId); + + return ResultUtils.success("ok", result); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/task/TaskController.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/task/TaskController.java new file mode 100644 index 0000000..165e4b0 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/controller/task/TaskController.java @@ -0,0 +1,101 @@ +package edu.ncst.carbon.controller.task; + +import com.alibaba.fastjson.JSONArray; +import edu.ncst.carbon.aspect.LogOperate; +import edu.ncst.carbon.model.task.Task; +import edu.ncst.carbon.service.ITaskService; +import edu.ncst.carbon.utils.ResponseUtils; +import edu.ncst.carbon.utils.ResultUtils; +import edu.ncst.carbon.utils.WeChatUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.ResultVO; +import edu.ncst.carbon.vo.wechat.SportData; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 低碳任务 控制器 + */ +@Api(description = "低碳任务 控制器", tags = "TaskController") +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/api/task") +public class TaskController { + + private final ITaskService TaskService; + + public TaskController(ITaskService TaskService) { + this.TaskService = TaskService; + } + + // 主要用于低碳任务的管理页面 + @ApiOperation("获取低碳任务列表") + @GetMapping("/list") + public ResultVO> getTaskList(Query query) { + ListResultVO TaskList = TaskService.getTaskList(query); + + return ResultUtils.success("ok", TaskList); + } + + @ApiOperation("获取低碳任务详情") + @GetMapping("/detail") + public ResultVO getTaskDetail(@RequestParam Integer id) { + Task TaskDetail = TaskService.getTaskDetail(id); + + return ResultUtils.success("ok", TaskDetail); + } + + @ApiOperation("添加低碳任务") + @LogOperate + @PostMapping("/add") + public ResultVO addTask(@RequestBody Task Task) { + Task result = TaskService.addTask(Task); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("修改低碳任务") + @LogOperate + @PostMapping("/modify") + public ResultVO modifyTask(@RequestBody Task Task) { + Task result = TaskService.modifyTask(Task); + + return ResultUtils.success("ok", result); + } + + @ApiOperation("删除低碳任务") + @LogOperate + @PostMapping("/delete") + public ResponseEntity deleteTask(@RequestParam Integer id) { + TaskService.deleteTask(id); + + return ResponseUtils.success("删除成功"); + } + + @ApiOperation("获取用户微信步数") + @LogOperate + @GetMapping("/encryptWeRunData") + public ResultVO encryptWeRunData(@RequestParam String encryptedData, String iv) { + + SportData steplist = TaskService.encryptWeRunData(encryptedData, iv); + + return ResultUtils.success("ok", steplist); + } + @ApiOperation("获取今日骑行数据") + @LogOperate + @GetMapping("/getRideData") + public ResultVO getRideData() { + Random r = new Random(); + return ResultUtils.success("ok", r.nextInt(20)); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/EnumType.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/EnumType.java new file mode 100644 index 0000000..c71e86e --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/EnumType.java @@ -0,0 +1,13 @@ +package edu.ncst.carbon.enums; + +public interface EnumType { + + String getName(); + + void setName(String name); + + String getLabel(); + + void setLabel(String label); + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/LogType.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/LogType.java new file mode 100644 index 0000000..9d5e956 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/LogType.java @@ -0,0 +1,39 @@ +package edu.ncst.carbon.enums; + +// 日志类型 +public enum LogType implements EnumType { + + INFO("INFO", "信息"), + DEBUG("DEBUG", "调试"), + WARN("WARN", "警告"), + ERROR("ERROR", "错误"); + + private String name; + + private String label; + + LogType(String name, String label) { + this.name = name; + this.label = label; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getLabel() { + return label; + } + + @Override + public void setLabel(String label) { + this.label = label; + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/LoginType.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/LoginType.java new file mode 100644 index 0000000..5adb22b --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/LoginType.java @@ -0,0 +1,35 @@ +package edu.ncst.carbon.enums; + +// 登录方式 +public enum LoginType implements EnumType { + + ACCOUNT("ACCOUNT", "用户名密码方式"), + MOBILE("MOBILE", "手机验证码方式"), + WECHAT("WECHAT", "微信登录方式"); + + private String name; + + private String label; + + LoginType(String name, String label) { + this.name = name; + this.label = label; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/MenuType.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/MenuType.java new file mode 100644 index 0000000..5c3de79 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/MenuType.java @@ -0,0 +1,38 @@ +package edu.ncst.carbon.enums; + +// 菜单类型 +public enum MenuType implements EnumType { + + MENU("MENU", "菜单"), + PAGE("PAGE", "页面"), + BUTTON("BUTTON", "按钮"); + + private String name; + + private String label; + + MenuType(String name, String label) { + this.name = name; + this.label = label; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getLabel() { + return label; + } + + @Override + public void setLabel(String label) { + this.label = label; + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/UnitTreeType.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/UnitTreeType.java new file mode 100644 index 0000000..e93d907 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/UnitTreeType.java @@ -0,0 +1,38 @@ +package edu.ncst.carbon.enums; + +public enum UnitTreeType implements EnumType { + + ALL("ALL", "全部单位"), + COMPANY("COMPANY", "公司单位"), + DEPARTMENT("DEPARTMENT", "部门级及以上单位"); + + private String name; + + private String label; + + UnitTreeType(String name, String label) { + this.name = name; + this.label = label; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getLabel() { + return label; + } + + @Override + public void setLabel(String label) { + this.label = label; + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/UnitType.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/UnitType.java new file mode 100644 index 0000000..51834e4 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/enums/UnitType.java @@ -0,0 +1,38 @@ +package edu.ncst.carbon.enums; + +// 单位类型 +public enum UnitType implements EnumType { + + COMPANY("COMPANY", "公司"), + DEPARTMENT("DEPARTMENT", "部门"), + STATION("STATION","所"); + + private String name; + + private String label; + + UnitType(String name, String label) { + this.name = name; + this.label = label; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getLabel() { + return label; + } + + @Override + public void setLabel(String label) { + this.label = label; + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/BusinessException.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/BusinessException.java new file mode 100644 index 0000000..24b7cf6 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/BusinessException.java @@ -0,0 +1,41 @@ +package edu.ncst.carbon.exception; + +import org.springframework.security.core.AuthenticationException; + +public class BusinessException extends AuthenticationException { + + private CodeMsg codeMsg; + + public BusinessException(String msg){ + super(msg); + codeMsg = CodeMsg.BUSINESS_ERROR.fillArgs(msg); + } + + public BusinessException(CodeMsg msg){ + super(msg.getMsg()); + if(msg==null){ + msg=CodeMsg.BUSINESS_ERROR.fillArgs("未知错误"); + } + + this.codeMsg = msg; + } + public CodeMsg getError() { + if(codeMsg==null){ + codeMsg=CodeMsg.BUSINESS_ERROR.fillArgs("未知错误"); + } + return codeMsg; + } + + @Override + public String getMessage() { + if(codeMsg==null){ + String msg = super.getMessage(); + if(msg==null){ + return CodeMsg.BUSINESS_ERROR.fillArgs("未知错误").getMsg(); + } else{ + return msg; + } + } + return codeMsg.getMsg(); + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/CaptchaException.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/CaptchaException.java new file mode 100644 index 0000000..05c5c48 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/CaptchaException.java @@ -0,0 +1,30 @@ +//package edu.ncst.carbon.exception; +// +//import org.springframework.security.core.AuthenticationException; +// +//public class CaptchaException extends AuthenticationException { +// +// public Throwable CaptchaIsEmptyException(String msg, Throwable t) { +// super(msg, t); +// } +// +// public Throwable CaptchaIsEmptyException(String msg) { +// super(msg); +// } +// +// public Throwable CaptchaIsExpiredException(String msg, Throwable t) { +// super(msg, t); +// } +// +// public Throwable CaptchaIsExpiredException(String msg) { +// super(msg); +// } +// +// public Throwable CaptchaIsNotRightException(String msg, Throwable t) { +// super(msg, t); +// } +// +// public Throwable CaptchaIsNotRightException(String msg) { +// super(msg); +// } +//} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/CodeMsg.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/CodeMsg.java new file mode 100644 index 0000000..7631eb3 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/CodeMsg.java @@ -0,0 +1,96 @@ +package edu.ncst.carbon.exception; + +import lombok.Data; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; + +import java.util.List; + +@Data +public class CodeMsg { + + public static final CodeMsg SUCCESS = new CodeMsg(0, "成功"); + public static final CodeMsg SUCCESS_MSG = new CodeMsg(0, "%s"); + public final static CodeMsg SERVER_ERROR = new CodeMsg(500, "服务器错误:%s"); + public static final CodeMsg PARAM_ERROR = new CodeMsg(501, "参数错误:%s"); + public static final CodeMsg GLOBAL_ERROR = new CodeMsg(502, "全局错误:%s"); + public static final CodeMsg BUSINESS_ERROR = new CodeMsg(503, "业务错误:%s"); + ; + public final static CodeMsg BIND_ERROR = new CodeMsg(500, "参数错误:%s"); + + /** + * 用户权限 100XX + */ + public final static CodeMsg USER_NEED_LOGIN = new CodeMsg(10000, "尚未登录,请登录。"); + public final static CodeMsg USERNAME_REQUIRE_NOT_NULL = new CodeMsg(10001, "用户名不能为空"); + public final static CodeMsg PASSWORD_REQUIRE_NOT_NULL = new CodeMsg(10002, "用户密码不能为空"); + public final static CodeMsg USER_NOT_FOUND = new CodeMsg(10003, "该用户不存在。"); + public final static CodeMsg USERNAME_OR_PASSWORD_ERROR = new CodeMsg(10004, "用户名或密码错误"); + public final static CodeMsg USER_IS_LOCKED = new CodeMsg(10005, "当前IP已被锁定,请1小时后再试。"); + public final static CodeMsg USER_CREDENTIALS_EXPIRED = new CodeMsg(10006, "用户登录凭证过期,请重新登录。"); + public final static CodeMsg USER_ACCOUNT_EXPIRED = new CodeMsg(10007, "用户账号过期,请联系管理员。"); + public final static CodeMsg USER_IS_DISABLED = new CodeMsg(10008, "该用户已被禁用,请联系管理员。"); + public final static CodeMsg USER_BAD_CREDENTIALS = new CodeMsg(10009, "无效的登录凭证,请尝试重新登录"); + public final static CodeMsg USER_TOKEN_EXPIRED = new CodeMsg(10010, "用户凭证已过期,请联系管理员。"); + public final static CodeMsg NOT_GET_CURRENT_USER_INFO = new CodeMsg(10011, "无法获取当前用户信息。"); + public final static CodeMsg CAN_NOT_DATA_ACCESS = new CodeMsg(10012, "当前用户没有访问相关数据的权限。"); + public final static CodeMsg BIND_USER_FAIL = new CodeMsg(10014, "绑定用户失败 %s"); + public final static CodeMsg LOGIN_FAIL = new CodeMsg(10015, "登录失败,未知原因。"); + public final static CodeMsg CAN_NOT_GET_OPEN_ID = new CodeMsg(10016, "无法获取 OpenID。"); + public final static CodeMsg CAPTCHA_IS_NOT_RIGHT = new CodeMsg(10018, "验证码错误。"); + public final static CodeMsg CAPTCHA_IS_EMPTY = new CodeMsg(10019, "验证码不能为空。"); + public final static CodeMsg CAPTCHA_IS_EXPIRED = new CodeMsg(10020, "验证码已过期。"); + public static final CodeMsg TEMP_TOKEN_NOT_FOUND = new CodeMsg(10021, "无法获取临时授权"); + public static final CodeMsg TEMP_TOKEN_EXPIRED = new CodeMsg(10022, "临时授权已过期"); + + /** + * 基本操作 101XX + */ + public final static CodeMsg FETCH_ERROR = new CodeMsg(10100, "获取数据失败"); + public final static CodeMsg ADD_ERROR = new CodeMsg(10101, "添加失败%s"); + public final static CodeMsg MODIFY_ERROR = new CodeMsg(10102, "修改失败"); + public final static CodeMsg DELETE_ERROR = new CodeMsg(10103, "删除失败"); + public final static CodeMsg DELETE_ERROR_RELATION_DATA = new CodeMsg(101031, "存在关联业务数据,删除或禁用失败"); + public final static CodeMsg REPEAT_RECORD = new CodeMsg(10104, "字段与已有记录重复"); + public final static CodeMsg ENABLE_OR_DISABLE_ERROR = new CodeMsg(10105, "启用或禁用出错。"); + public final static CodeMsg CAN_FOUND_DICT = new CodeMsg(10106, "找不到字典。"); + public final static CodeMsg FORM_ERROR = new CodeMsg(10107, "表单参数错误"); + public static final CodeMsg MORE_THAN_ONE_ITEM = new CodeMsg(10108, "多余一条数据被查出"); + public static final CodeMsg ALREADY_EXIST_ITEM = new CodeMsg(10109, "数据重复"); + public static final CodeMsg UPLOAD_ERROR = new CodeMsg(10110, "上传错误"); + + + /** + * 角色管理 102XX + */ + public final static CodeMsg ENABLE_OR_DISABLE_ROLE_ERROR = new CodeMsg(10201, "启用或禁用出错。"); + + + private int code; + private String msg; + + public CodeMsg(int i, String s) { + this.code = i; + this.msg = s; + } + + public CodeMsg fillArgs(Object... args) { + String message = String.format(msg, args); + return new CodeMsg(code, message); + } + + public CodeMsg fillFieldError(BindingResult bindingResult) { + String defaultMessage = ""; + + if (bindingResult.hasErrors()) { + List allErrors = bindingResult.getAllErrors(); + + if (!allErrors.isEmpty()) { + defaultMessage = allErrors.get(0).getDefaultMessage(); + } + } + String message = String.format(msg, defaultMessage); + return new CodeMsg(code, message); + } + +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/handler/InterfaceExceptionHandler.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/handler/InterfaceExceptionHandler.java new file mode 100644 index 0000000..893486e --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/exception/handler/InterfaceExceptionHandler.java @@ -0,0 +1,54 @@ +package edu.ncst.carbon.exception.handler; + +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.utils.ResponseUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; + + +import lombok.extern.slf4j.Slf4j; + +/** + * 自定义异常处理器 + * + * @author ieflex + */ +@RestControllerAdvice +@Slf4j +public class InterfaceExceptionHandler { + + /** + * 接口 业务异常 + */ + @ResponseBody + @ExceptionHandler(BusinessException.class) + public ResponseEntity businessInterfaceException(BusinessException e) { + log.error(e.getMessage(), e); + return ResponseUtils.error(CodeMsg.BUSINESS_ERROR.fillArgs(e.getError())); + } + + /** + * 拦截所有运行时的全局异常 + */ + @ExceptionHandler(RuntimeException.class) + @ResponseBody + public ResponseEntity runtimeException(RuntimeException e) { + log.error(e.getMessage(), e); + // 返回 JOSN + return ResponseUtils.error(CodeMsg.GLOBAL_ERROR.fillArgs(e.toString())); + } + + /** + * 系统异常捕获处理 + */ + @ExceptionHandler(Exception.class) + @ResponseBody + public ResponseEntity exception(Exception e) { + log.error(e.getMessage(), e); + return ResponseUtils.error(CodeMsg.SERVER_ERROR.fillArgs(e.toString())); + + } +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/BaseMapperPlus.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/BaseMapperPlus.java new file mode 100644 index 0000000..24668f0 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/BaseMapperPlus.java @@ -0,0 +1,34 @@ +package edu.ncst.carbon.mapper; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; + +import java.util.List; + +/** + * 自定义 Mapper 接口, 实现 自定义扩展 + * + * @param mapper 泛型 + * @param table 泛型 + * @param vo 泛型 + * @author Lion Li + * @since 2021-05-13 + */ +@SuppressWarnings("unchecked") +public interface BaseMapperPlus extends BaseMapper { + + Log log = LogFactory.getLog(BaseMapperPlus.class); + + int DEFAULT_BATCH_SIZE = 1000; + + + default List selectList() { + return this.selectList(new QueryWrapper<>()); + } + + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaMapper.java new file mode 100644 index 0000000..56a0231 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaMapper.java @@ -0,0 +1,20 @@ +package edu.ncst.carbon.mapper.carbon; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import edu.ncst.carbon.model.carbon.CarFormula; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +/** + * 碳公式 Mapper 接口 + */ +@Repository +public interface CarbonFormulaMapper extends BaseMapper { + + Page getCarFormulaList(Page pageRequest, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + + CarFormula getCarFormulaDetail(Integer id); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaTypeMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaTypeMapper.java new file mode 100644 index 0000000..8f1f52b --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaTypeMapper.java @@ -0,0 +1,13 @@ +package edu.ncst.carbon.mapper.carbon; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.carbon.CarFormulaType; +import org.springframework.stereotype.Repository; + +/** + * 碳公式类型 Mapper 接口 + */ +@Repository +public interface CarbonFormulaTypeMapper extends BaseMapper { + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaUnitMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaUnitMapper.java new file mode 100644 index 0000000..5109113 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/carbon/CarbonFormulaUnitMapper.java @@ -0,0 +1,12 @@ +package edu.ncst.carbon.mapper.carbon; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.carbon.CarFormulaUnit; +import org.springframework.stereotype.Repository; + +/** + * 碳公式单位 Mapper 接口 + */ +@Repository +public interface CarbonFormulaUnitMapper extends BaseMapper { +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/goods/GoodsMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/goods/GoodsMapper.java new file mode 100644 index 0000000..1cbdbfc --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/goods/GoodsMapper.java @@ -0,0 +1,12 @@ +package edu.ncst.carbon.mapper.goods; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.goods.Goods; +import org.springframework.stereotype.Repository; + +/** + * 碳公式类型 Mapper 接口 + */ +@Repository +public interface GoodsMapper extends BaseMapper { +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/image/ImageMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/image/ImageMapper.java new file mode 100644 index 0000000..cdba2a5 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/image/ImageMapper.java @@ -0,0 +1,12 @@ +package edu.ncst.carbon.mapper.image; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.image.Image; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface ImageMapper extends BaseMapper { + + int uploadImage(@Param("image")Image image); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserFootprintMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserFootprintMapper.java new file mode 100644 index 0000000..c237b8a --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserFootprintMapper.java @@ -0,0 +1,12 @@ +package edu.ncst.carbon.mapper.log; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.log.LogUserFootprint; +import org.springframework.stereotype.Repository; + +/** + * 用户碳足迹 Mapper 接口 + */ +@Repository +public interface LogUserFootprintMapper extends BaseMapper { +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserGoodsMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserGoodsMapper.java new file mode 100644 index 0000000..0c2e455 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserGoodsMapper.java @@ -0,0 +1,13 @@ +package edu.ncst.carbon.mapper.log; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.log.LogUserGoods; +import org.springframework.stereotype.Repository; + +/** + * 用户碳足迹 Mapper 接口 + */ +@Repository +public interface LogUserGoodsMapper extends BaseMapper { +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserMapper.java new file mode 100644 index 0000000..e48d322 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LogUserMapper.java @@ -0,0 +1,12 @@ +package edu.ncst.carbon.mapper.log; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.log.LogUser; +import org.springframework.stereotype.Repository; + +/** + * 用户当前数据 Mapper 接口 + */ +@Repository +public interface LogUserMapper extends BaseMapper { +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LoginLogMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LoginLogMapper.java new file mode 100644 index 0000000..eb4231f --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/log/LoginLogMapper.java @@ -0,0 +1,18 @@ +package edu.ncst.carbon.mapper.log; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import edu.ncst.carbon.model.log.LoginLog; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +/** + * 登录日志 Mapper 接口 + */ +@Repository +public interface LoginLogMapper extends BaseMapper { + + Page getLoginLogList(@Param("pageRequest") Page pageRequest, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/MenuMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/MenuMapper.java new file mode 100644 index 0000000..ed1ae18 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/MenuMapper.java @@ -0,0 +1,36 @@ +package edu.ncst.carbon.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import edu.ncst.carbon.model.system.Menu; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 菜单 Mapper 接口 + */ +@Repository +public interface MenuMapper extends BaseMapper { + + int batchInsert(List menuList); + + int batchInsertOrUpdate(List menuList); + + Page getMenuList(Page pageRequest, @Param("parentId") Integer parentId); + + List getMenuTree(@Param("parentId") Integer parentId); + + // 清空菜单项 + int removeAllMenuItem(); + + // 获取指定角色能够访问的菜单ID + List getRoleMenuIds(Integer roleId); + + List getCurrentUserMenuAuthority(List roleNames); + + List getParentMenuid(List menuIds); + + List getRoleMenuIdsWithParent(Integer roleId); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/ResourceMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/ResourceMapper.java new file mode 100644 index 0000000..4e5a579 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/ResourceMapper.java @@ -0,0 +1,38 @@ +package edu.ncst.carbon.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.system.Resource; +import org.springframework.stereotype.Repository; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@Repository +public interface ResourceMapper extends BaseMapper { + + List getRolesResourceUrls(List roleNames); + + int batchReplaceOrInsert(List resources); + + int batchInsert(List resources); + + int replaceOrInsert(@RequestParam("resource") Resource resource); + + Integer getIdByName(String name); + + int insertNotExisted(@RequestParam("resource") Resource resource); + + List getRoleResourceIds(Integer roleId); + + List getResourceTree(); + + List getPermitAllResourceList(); + List getUserScopeResourceList(); + + List getPermitAllResourceURLs(); + + List getUserScopeResourceURLs(); + + // 所有用户都可以访问的查询接口 + List getAllResourceIds(); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleMapper.java new file mode 100644 index 0000000..591e53d --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleMapper.java @@ -0,0 +1,29 @@ +package edu.ncst.carbon.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.mapper.BaseMapperPlus; +import edu.ncst.carbon.model.system.Role; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * 角色表 数据层 + * + * @author Lion Li + */ +public interface RoleMapper extends BaseMapper { + + @Update("UPDATE sys_role SET enable = #{ enable } WHERE id = #{ id }") + int setRoleEnable(Integer id, Boolean enable); + + @Select("SELECT * FROM sys_role WHERE name = #{ name }") + Role getRoleByName(String name); + + void setDefaultResource(@Param("id") Integer id, @Param("resourcesIds") List resourcesIds); + + int getNumOfUserByRoleId(Integer id); + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleMenuMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleMenuMapper.java new file mode 100644 index 0000000..fb87cfa --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleMenuMapper.java @@ -0,0 +1,17 @@ +package edu.ncst.carbon.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.system.RoleMenu; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 角色菜单 Mapper 接口 + */ +@Repository +public interface RoleMenuMapper extends BaseMapper { + int batchInsert(Integer roleId, List menuIds); + + void selectParentMenu(List menuIds); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleResourceMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleResourceMapper.java new file mode 100644 index 0000000..02913e5 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/RoleResourceMapper.java @@ -0,0 +1,16 @@ +package edu.ncst.carbon.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.system.RoleResource; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 角色资源 Mapper 接口 + */ +@Repository +public interface RoleResourceMapper extends BaseMapper { + int batchInsert(Integer roleId, List resourceIds); + int batchDelete(Integer roleId); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/UserMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/UserMapper.java new file mode 100644 index 0000000..2b3779d --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/UserMapper.java @@ -0,0 +1,42 @@ +package edu.ncst.carbon.mapper.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import edu.ncst.carbon.model.system.User; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 用户 Mapper 接口 + */ +@Repository +//从Service层 到了现在的 Mapper接口层,在之后才是Mapper层 +public interface UserMapper extends BaseMapper { + + Page getUserPage( + @Param("pageRequest") Page pageRequest, + @Param(Constants.WRAPPER) QueryWrapper queryWrapper + ); + + List getUserList( @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + + User getUserDetail(Integer userId); + + + //User getUserByWechatId(String wechatId); + + + @Update("UPDATE sys_user SET enable = #{ enable } WHERE id = #{ userId }") + int setUserEnable(Integer userId, Boolean enable); + + User getUserByAccount(String username); + + User getUserByOpenId(String openId); + + int bindUserOpenId(Integer id, String openId); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/UserRoleMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/UserRoleMapper.java new file mode 100644 index 0000000..e71cdf6 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/system/UserRoleMapper.java @@ -0,0 +1,13 @@ +package edu.ncst.carbon.mapper.system; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.system.UserRole; +import org.springframework.stereotype.Repository; + +/** + * 用户角色 Mapper 接口 + */ +@Repository +public interface UserRoleMapper extends BaseMapper { + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/task/TaskAuditMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/task/TaskAuditMapper.java new file mode 100644 index 0000000..1e34570 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/task/TaskAuditMapper.java @@ -0,0 +1,14 @@ +package edu.ncst.carbon.mapper.task; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import edu.ncst.carbon.model.task.Task; +import edu.ncst.carbon.model.task.TaskAudit; +import org.springframework.stereotype.Repository; + +/** + * 任务审核 Mapper 接口 + */ +@Repository +public interface TaskAuditMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/task/TaskMapper.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/task/TaskMapper.java new file mode 100644 index 0000000..a60a2d4 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/mapper/task/TaskMapper.java @@ -0,0 +1,31 @@ +package edu.ncst.carbon.mapper.task; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import edu.ncst.carbon.model.task.Task; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +/** + * 低碳任务Mapper 接口 + */ +@Repository +public interface TaskMapper extends BaseMapper { + Page getTaskList(Page pageRequest, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + + Task getTaskDetail(Integer id); + + int deleteByPrimaryKey(Integer id); + + int insert(Task record); + + int insertSelective(Task record); + + Task selectByPrimaryKey(Integer id); + + int updateByPrimaryKeySelective(Task record); + + int updateByPrimaryKey(Task record); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/BaseEntity.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/BaseEntity.java new file mode 100644 index 0000000..2554ffa --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/BaseEntity.java @@ -0,0 +1,40 @@ +package edu.ncst.carbon.model; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public abstract class BaseEntity implements Serializable { + + @ApiModelProperty(value = "创建时间") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人") + @TableField(value = "create_user_id", fill = FieldFill.INSERT) + private Integer createUserId; + + @ApiModelProperty(value = "最后更新时间") + @TableField(value = "last_modify_time", fill = FieldFill.INSERT_UPDATE) + private Date lastModifyTime; + + @ApiModelProperty(value = "最后更新者") + @TableField(value = "last_modify_user_id", fill = FieldFill.INSERT_UPDATE) + private Integer lastModifyUserId; + + @ApiModelProperty(value = "删除时间") + @TableField("delete_time") + @TableLogic + private Date deleteTime; + + @ApiModelProperty(value = "删除者") + @TableField("delete_user_id") + private Integer deleteUserId; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormula.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormula.java new file mode 100644 index 0000000..b6c5719 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormula.java @@ -0,0 +1,58 @@ +package edu.ncst.carbon.model.carbon; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import edu.ncst.carbon.model.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * 碳公式 + * + * @author 强子烨 + * @version 1.0 + * @since 2022-11-24 + */ +@ApiModel(value="CarFormula", description="碳公式") +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "car_formula", autoResultMap = true) +public class CarFormula extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 8919112438414925446L; + + @ApiModelProperty(value = "碳公式基础信息表") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "碳公式名称") + private String name; + + @ApiModelProperty(value = "碳排放量/每碳单位") + private Float emission; + + @ApiModelProperty(value = "碳积分/每碳单位") + private Float intergral; + + @ApiModelProperty(value = "碳类型id") + private Integer typeId; + + @ApiModelProperty(value = "碳类型") + @TableField(exist = false) + private CarFormulaType type; + + @ApiModelProperty(value = "碳排放单位id") + private Integer unitId; + + @ApiModelProperty(value = "碳排放单位") + @TableField(exist = false) + private CarFormulaUnit unit; + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormulaType.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormulaType.java new file mode 100644 index 0000000..c2ea050 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormulaType.java @@ -0,0 +1,47 @@ +package edu.ncst.carbon.model.carbon; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + +/** + * 碳公式类别 + * + * @author 强子烨 + * @version 1.0 + * @since 2022-11-24 + */ +@ApiModel(value="CarFormulaType", description="碳类别") +@Data +//@EqualsAndHashCode(callSuper = true)、 +@TableName(value = "car_formula_type", autoResultMap = true) +public class CarFormulaType implements Serializable { + + private static final long serialVersionUID = 1916757432923294628L; + + @ApiModelProperty(value = "碳类别id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "碳类别") + private String name; + + @ApiModelProperty(value = "碳类别名称") + private String label; + + @ApiModelProperty(value = "是否启用") + private Boolean enable; + + @ApiModelProperty(value = "删除时间") + @TableLogic + @JsonIgnore + private Date deleteTime; +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormulaUnit.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormulaUnit.java new file mode 100644 index 0000000..42d6ecf --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/carbon/CarFormulaUnit.java @@ -0,0 +1,43 @@ +package edu.ncst.carbon.model.carbon; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + +/** + * 碳公式单位 + * + * @author 强子烨 + * @version 1.0 + * @since 2022-11-24 + */ +@ApiModel(value="CarFormulaUnit", description="碳公式单位") +@Data +//@EqualsAndHashCode(callSuper = true) +@TableName(value = "car_formula_unit", autoResultMap = true) +public class CarFormulaUnit implements Serializable { + + private static final long serialVersionUID = 814435312663136536L; + + @ApiModelProperty(value = "碳排放单位id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "碳排放单位") + private String name; + + @ApiModelProperty(value = "碳排放单位名称") + private String label; + + @ApiModelProperty(value = "是否启用") + private String enable; + + @ApiModelProperty(value = "删除时间") + private Date deleteTime; +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/goods/Goods.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/goods/Goods.java new file mode 100644 index 0000000..eafeb3f --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/goods/Goods.java @@ -0,0 +1,68 @@ +package edu.ncst.carbon.model.goods; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import edu.ncst.carbon.model.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * goods_detail + * @author + */ +@ApiModel(value="GoodsDetail", description="商品基础信息") +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "goods_detail", autoResultMap = true) +public class Goods extends BaseEntity implements Serializable { + + @ApiModelProperty(value = "商品基础信息id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商品名称") + private String name; + + /** + * 商品详情 + */ + @ApiModelProperty(value = "商品详情") + private String detail; + + /** + * 供应商id + */ + @ApiModelProperty(value = "供应商id") + private Integer supplierId; + + /** + * 价格 + */ + @ApiModelProperty(value = "价格") + private Integer price; + + /** + * 数量 + */ + @ApiModelProperty(value = "数量") + private Integer quantity; + + /** + * 销量 + */ + @ApiModelProperty(value = "销量") + private Integer sales; + + /** + * 商品图片id + */ + @ApiModelProperty(value = "商品图片id") + private Integer imageId; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/image/Image.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/image/Image.java new file mode 100644 index 0000000..94ecdde --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/image/Image.java @@ -0,0 +1,27 @@ +package edu.ncst.carbon.model.image; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 图片 + */ +@ApiModel(value="Image", description="图片") +@Data +@TableName(value = "Image") +public class Image { + + @ApiModelProperty(value = "ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("图片的线上地址") + private String imgUrl; + + @ApiModelProperty("图片名称") + private String imgName; +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUser.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUser.java new file mode 100644 index 0000000..4f83c35 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUser.java @@ -0,0 +1,47 @@ +package edu.ncst.carbon.model.log; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * log_user + * @author + */ +@ApiModel(value="LogUser", description="用户当前数据") +@Data +@TableName(value = "log_user", autoResultMap = true) +public class LogUser implements Serializable { + /** + * 用户当前信息 + */ + @TableId(type = IdType.INPUT) + private Integer id; + + /** + * 用户id + */ + private Integer userId; + + /** + * 当前积分总数 + */ + private Integer integralTotal; + + /** + * 累计减碳 + */ + private double emissionTotal; + + /** + * 审批中的碳任务总数 + */ + private Integer auditingTaskTotal; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUserFootprint.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUserFootprint.java new file mode 100644 index 0000000..5beaa3f --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUserFootprint.java @@ -0,0 +1,69 @@ +package edu.ncst.carbon.model.log; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import edu.ncst.carbon.model.BaseEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * log_user_footprint + * @author + */ +@ApiModel(value="LogUserFootprint", description="用户碳足迹") +@Data +@TableName(value = "log_user_footprint", autoResultMap = true) +public class LogUserFootprint implements Serializable { + /** + * ID + */ + @TableId(type = IdType.INPUT) + private Integer id; + + /** + * 用户id + */ + private Integer userId; + + /** + * 碳公式id + */ + private Integer formulaId; + + /** + * 获取积分 + */ + private float integral; + + /** + * 碳排放量 + */ + private float emission; + + /** + * 低碳任务id + */ + private Integer taskId; + + /** + * 该记录创建时间 + */ + private Date createTime; + + /** + * 是否删除 + */ + private Boolean isDelete; + + /** + * 删除时间 + */ + private Date deleteTime; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUserGoods.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUserGoods.java new file mode 100644 index 0000000..81b2c04 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LogUserGoods.java @@ -0,0 +1,62 @@ +package edu.ncst.carbon.model.log; + +import com.baomidou.mybatisplus.annotation.TableName; +import edu.ncst.carbon.model.BaseEntity; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * log_user_goods + * @author + */ +@ApiModel(value="CarFormula", description="碳公式") +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "car_formula", autoResultMap = true) +public class LogUserGoods extends BaseEntity implements Serializable { + /** + * 商品购买记录表 + */ + private Integer id; + + /** + * 商品id + */ + private Integer goodsId; + + /** + * 商品名称 + */ + private String goodsName; + + /** + * 用户id + */ + private Integer userId; + + /** + * 购买数量 + */ + private Integer number; + + /** + * 消耗积分 + */ + private Integer costIntegral; + + /** + * 购买时间 + */ + private Date buyTime; + + /** + * 订单编号 + */ + private String orderNumber; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LoginLog.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LoginLog.java new file mode 100644 index 0000000..a635d2e --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/log/LoginLog.java @@ -0,0 +1,50 @@ +package edu.ncst.carbon.model.log; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import edu.ncst.carbon.model.system.User; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 登录日志 + */ +@ApiModel(value="LoginLog", description="登录日志") +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("log_login_log") +public class LoginLog implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "登录方式") + private String type; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "登錄用户") + @TableField(exist = false) + private User user; + + @ApiModelProperty(value = "登录凭证", notes = "用户名、手机号、电子邮箱或微信登录凭证code") + private String principal; + + @ApiModelProperty(value = "IP地址") + private String ipAddress; + + @ApiModelProperty(value = "登录时间") + private Date loginTime; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Menu.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Menu.java new file mode 100644 index 0000000..09abff7 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Menu.java @@ -0,0 +1,91 @@ +package edu.ncst.carbon.model.system; + +import com.baomidou.mybatisplus.annotation.*; +import edu.ncst.carbon.enums.MenuType; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 菜单 + */ +@ApiModel(value="Menu", description="菜单") +@Data +@TableName("sys_menu") +public class Menu implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "菜单ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "菜单类型 1:菜单 2:页面 3.按钮 ") + private MenuType type; + + @ApiModelProperty(value = "菜单名称") + private String name; + + @ApiModelProperty(value = "菜单标题") + private String title; + + @ApiModelProperty(value = "菜单图标") + private String icon; + + @ApiModelProperty(value = "菜单链接") + private String url; + +// @ApiModelProperty(value = "路由名称") +// private String routeName; +// +// @ApiModelProperty(value = "路由路径") +// private String routePath; +// +// @ApiModelProperty(value = "路由组件") +// private String routeComponentName; +// +// @ApiModelProperty(value = "是否开启路由缓存") +// private Boolean routeCache; + +// @ApiModelProperty(value = "关联权限ID") +// private Integer authorityId; + + @ApiModelProperty(value = "上级菜单") + private Integer parentId; + + @ApiModelProperty(value = "下级菜单") + @TableField(exist = false) + private List children; + + @ApiModelProperty(value = "是否显示在菜单上") + private Boolean showInMenu = true; + + @ApiModelProperty(value = "显示排序") + private Integer sort = 0; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "删除时间") + @TableLogic + private Date deleteTime; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Menu menu = (Menu) o; + return Objects.equals(name, menu.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Resource.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Resource.java new file mode 100644 index 0000000..e7779bf --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Resource.java @@ -0,0 +1,58 @@ +package edu.ncst.carbon.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; + +@ApiModel(value="Resource", description="资源") +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_resource") +public class Resource implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "资源ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "显示文本") + private String label; + + @ApiModelProperty(value = "资源名称(方法签名)") + private String name; + + @ApiModelProperty(value = "请求方法类型") + private String method; + + @ApiModelProperty(value = "链接") + private String url; + + @ApiModelProperty(value = "允许所有访问", notes = "不需要用户登录") + private Boolean permitAll = false; + + @ApiModelProperty(value = "用户作用域") + private Boolean userScope = false; + + @ApiModelProperty(value = "上级菜单ID") + private Integer parentId; + + @ApiModelProperty(value = "上级菜单ID") + @TableField(exist = false) + private List children; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "是否對所有角色開放",notes = "需要用户登录") + private Boolean isForAll = true; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Role.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Role.java new file mode 100644 index 0000000..218abcc --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/Role.java @@ -0,0 +1,77 @@ +package edu.ncst.carbon.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import edu.ncst.carbon.model.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; +import java.util.Objects; + +/** + * 角色 + */ +@ApiModel(value="Role", description="角色") +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_role") +public class Role implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "角色ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "角色名称") + private String name; + + @ApiModelProperty(value = "显示文本") + private String label; + + @ApiModelProperty(value = "是否启用") + private Boolean enable; + + @ApiModelProperty(value = "删除时间") + @TableLogic + @JsonIgnore + private Date deleteTime; + + public Role(Integer id) { + this.id = id; + } + + public Role() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + Role role = (Role) o; + + return Objects.equals(name, role.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + + public static Role forName(String name) { + Role role = new Role(); + role.setName(name); + return role; + } + +} + diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/RoleMenu.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/RoleMenu.java new file mode 100644 index 0000000..576a7d9 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/RoleMenu.java @@ -0,0 +1,28 @@ +package edu.ncst.carbon.model.system; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * 角色菜单 + */ +@ApiModel(value="RoleMenu", description="角色菜单") +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_role_menu") +public class RoleMenu implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "角色ID") + private Integer roleId; + + @ApiModelProperty(value = "菜单ID") + private Integer menuId; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/RoleResource.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/RoleResource.java new file mode 100644 index 0000000..9a7cc40 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/RoleResource.java @@ -0,0 +1,28 @@ +package edu.ncst.carbon.model.system; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * 角色资源 + */ +@ApiModel(value="RoleResource", description="角色资源") +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_role_resource") +public class RoleResource implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "角色ID") + private Integer roleId; + + @ApiModelProperty(value = "资源ID") + private Integer resourceId; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/User.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/User.java new file mode 100644 index 0000000..ac7fd7f --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/User.java @@ -0,0 +1,114 @@ +package edu.ncst.carbon.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import edu.ncst.carbon.model.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户 + */ +@ApiModel(value="User", description="用户") +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_user") +public class User extends BaseEntity implements Serializable, UserDetails { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户名") + private String username; + + @ApiModelProperty(value = "用户密码") + private String password; + + @ApiModelProperty(value = "电子邮箱") + private String email; + + @ApiModelProperty(value = "用户真实名") + private String fullName; + + @ApiModelProperty(value = "手机号") + private String phone; + +// @ApiModelProperty(value = "微信小程序id") +// private Integer OpenId; + + @ApiModelProperty(value = "OpenID") + private String openId; + + @ApiModelProperty(value = "角色列表") + @TableField(exist = false) + private List roles; + + @ApiModelProperty(value = "是否启用 1:启用 0:禁用") + private Boolean enable; + + @ApiModelProperty(value = "最后登录时间") + private Date lastLoginTime; + + @ApiModelProperty(value = "最后登录IP地址") + private String lastLoginIp; + + + + /** + * 在角色标识前添加 "ROLE_" 前缀,加入到权限列表当中。 + * @return 整合的权限列表 + */ + @Override + public Collection getAuthorities() { + List grantedAuthorities = new ArrayList<>(); + + if (this.roles != null && this.roles.size() > 0) { + List roleAuthority = roles.stream() + .map((role) -> new SimpleGrantedAuthority("ROLE_" + role.getName())) + .collect(Collectors.toList()); + grantedAuthorities.addAll(roleAuthority); + } + + return grantedAuthorities; + } + + @JsonIgnore + public boolean isAccountNonExpired() { + return true; + }//用户是否未过期 + + @JsonIgnore + @Override + public boolean isAccountNonLocked() { + return true; + }//用户是否未锁定 + + @JsonIgnore + @Override + public boolean isCredentialsNonExpired() { + return true; + }//凭证是否未过期 + + @Override + public boolean isEnabled() { + return this.enable; + }//是否启用 +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/UserRole.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/UserRole.java new file mode 100644 index 0000000..1e3e1b2 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/system/UserRole.java @@ -0,0 +1,32 @@ +package edu.ncst.carbon.model.system; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 用户角色 + */ +@ApiModel(value="UserRole", description="用户角色") +@Data +@EqualsAndHashCode(callSuper = false) +@AllArgsConstructor +@NoArgsConstructor +@TableName("sys_user_role") +public class UserRole implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "角色ID") + private Integer roleId; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/task/Task.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/task/Task.java new file mode 100644 index 0000000..ee7e867 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/task/Task.java @@ -0,0 +1,47 @@ +package edu.ncst.carbon.model.task; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 低碳任务 + * + * @author + */ +@ApiModel(value="Task", description="低碳任务") +@Data +//@EqualsAndHashCode(callSuper = true) +@TableName(value = "task", autoResultMap = true) +public class Task implements Serializable { + + @ApiModelProperty(value = "碳公式基础信息表") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "任务名称") + private String name; + + @ApiModelProperty(value = "是否启用") + private Boolean enable; + + @ApiModelProperty(value = "删除时间") + private Date deleteTime; + + @ApiModelProperty(value = "对应碳公式id") + private Integer carbonFormulaId; + + @ApiModelProperty(value = "供应商id") + private Integer supplierId; + + @ApiModelProperty(value = "图像url") + private Integer imageId; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/task/TaskAudit.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/task/TaskAudit.java new file mode 100644 index 0000000..a522dde --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/model/task/TaskAudit.java @@ -0,0 +1,57 @@ +package edu.ncst.carbon.model.task; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import edu.ncst.carbon.model.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * task_audit + * @author 强子烨 + */ +@ApiModel(value="Task", description="低碳任务") +@Data +@TableName(value = "task_audit", autoResultMap = true) +public class TaskAudit implements Serializable { + + + @ApiModelProperty(value = "任务审核ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "审核图片id") + private Integer imageId; + + @ApiModelProperty(value = "审核文本") + private String text; + + @ApiModelProperty(value = "审批积分") + private Integer integral; + + @ApiModelProperty(value = "碳排放量") + private double emission; + + @ApiModelProperty(value = "创建用户id") + private Integer createUserId; + + @ApiModelProperty(value = "创建用户时间") + private Integer createTime; + + @ApiModelProperty(value = "审核者id") + private Integer auditUserId; + + @ApiModelProperty(value = "审核时间") + private Date auditTime; + + @ApiModelProperty(value = "审批状态:待审核 1 审核通过 2 审核未通过 3 完成 0") + private String status; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaService.java new file mode 100644 index 0000000..1a89422 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaService.java @@ -0,0 +1,26 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.carbon.CarFormula; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.carbon.CalculationResults; + +/** + * 碳公式 服务类 + */ +public interface ICarbonFormulaService extends IService { + CarFormula getCarFormulaDetail(Integer id); + + ListResultVO getCarFormulaList(Query query); + + //ListResultVO getCarFormulaListByTypeId(Integer id); + + CarFormula addCarFormula(CarFormula carFormula); + + CarFormula modifyCarFormula(CarFormula carFormula); + + boolean deleteCarFormula(Integer id); + + CalculationResults calculation(Integer id); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaTypeService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaTypeService.java new file mode 100644 index 0000000..29e3e79 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaTypeService.java @@ -0,0 +1,21 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.carbon.CarFormulaType; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; + +public interface ICarbonFormulaTypeService extends IService { + CarFormulaType getCarFormulaTypeDetail(Integer id); + + ListResultVO getCarFormulaTypeList(Query query); + + CarFormulaType addCarFormulaType(CarFormulaType carFormulaType); + + CarFormulaType modifyCarFormulaType(CarFormulaType carFormulaType); + + boolean deleteCarFormulaType(Integer id); + + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaUnitService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaUnitService.java new file mode 100644 index 0000000..30837a7 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ICarbonFormulaUnitService.java @@ -0,0 +1,18 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.carbon.CarFormulaUnit; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; + +public interface ICarbonFormulaUnitService extends IService { + CarFormulaUnit getCarFormulaUnitDetail(Integer id); + + ListResultVO getCarFormulaUnitList(Query query); + + CarFormulaUnit addCarFormulaUnit(CarFormulaUnit carFormulaUnit); + + CarFormulaUnit modifyCarFormulaUnit(CarFormulaUnit carFormulaUnit); + + boolean deleteCarFormulaUnit(Integer id); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IGoodsService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IGoodsService.java new file mode 100644 index 0000000..a888305 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IGoodsService.java @@ -0,0 +1,21 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.goods.Goods; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; + +/** + * 商品 服务类 + * */ +public interface IGoodsService extends IService { + Goods getGoodsDetail(Integer id); + + ListResultVO getGoodsList(Query query); + + Goods addGoods(Goods Goods); + + Goods modifyGoods(Goods Goods); + + boolean deleteGoods(Integer id); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IImageService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IImageService.java new file mode 100644 index 0000000..69cd4bc --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IImageService.java @@ -0,0 +1,19 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.image.Image; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.FileNotFoundException; + + +/** + * 图片处理 服务类 + * */ +public interface IImageService extends IService { + + String uploadImage(@RequestParam MultipartFile uploadFile, HttpServletRequest request, String recordID) throws FileNotFoundException; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserFootprintService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserFootprintService.java new file mode 100644 index 0000000..e508398 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserFootprintService.java @@ -0,0 +1,23 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.log.LogUserFootprint; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; + +import java.util.List; + +public interface ILogUserFootprintService extends IService { + + LogUserFootprint getLogUserFootprintDetail(Integer id); + + ListResultVO getLogFootprintList(Query query); + + List getLogUserFootprintList(Integer userId); + + LogUserFootprint addLogUserFootprint(LogUserFootprint LogUserFootprint); + + LogUserFootprint modifyLogUserFootprint(LogUserFootprint LogUserFootprint); + + boolean deleteLogUserFootprint(Integer id); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserGoodsService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserGoodsService.java new file mode 100644 index 0000000..6974c03 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserGoodsService.java @@ -0,0 +1,18 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.log.LogUserGoods; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; + +public interface ILogUserGoodsService extends IService { + LogUserGoods getLogUserGoodsDetail(Integer id); + + ListResultVO getLogUserGoodsList(Query query); + + LogUserGoods addLogUserGoods(LogUserGoods LogUserGoods); + + LogUserGoods modifyLogUserGoods(LogUserGoods LogUserGoods); + + boolean deleteLogUserGoods(Integer id); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserService.java new file mode 100644 index 0000000..f6832db --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILogUserService.java @@ -0,0 +1,24 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.log.LogUser; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; + +/** + * 商品 服务类 + * */ +public interface ILogUserService extends IService{ + + LogUser getLogUserDetail(Integer id); + + ListResultVO getLogUserList(Query query); + + LogUser addLogUser(LogUser LogUser); + + LogUser modifyLogUser(LogUser LogUser); + + boolean deleteLogUser(Integer id); + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILoginLogService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILoginLogService.java new file mode 100644 index 0000000..0aa6ceb --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ILoginLogService.java @@ -0,0 +1,18 @@ +package edu.ncst.carbon.service; + +import edu.ncst.carbon.model.log.LoginLog; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.query.LoginLogQuery; + +/** + * 登录日志 服务类 + */ +public interface ILoginLogService { + + // 查询登录日志列表 + ListResultVO getLoginLogList(LoginLogQuery query); + + // 添加登录日志 + void addLoginLog(Integer userId, Boolean success); + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IMenuService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IMenuService.java new file mode 100644 index 0000000..7e7015c --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IMenuService.java @@ -0,0 +1,62 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.system.Menu; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; + +import java.util.List; + +/** + * 菜单 服务类 + */ +public interface IMenuService extends IService { + + // 获取菜单列表 + ListResultVO getMenuList(Query query); + + // 获取菜单详情 + Menu getMenuDetail(Integer id); + + // 添加菜单 + Menu addMenu(Menu menu); + + // 修改菜单 + Menu modifyMenu(Menu menu); + + // 删除菜单 + boolean deleteMenu(Integer id); + +// // 批量删除菜单 +// boolean batchDeleteMenu(BatchDeleteDTO deleteDTO); + + /** + * 导入菜单元信息 + * @param resetMenuDTO + */ +// void resetMenuMeta(ResetMenuDTO resetMenuDTO); + + /** + * 获取菜单树 + * @return 菜单树 + */ + List getMenuTree(); + + /** + * 获取当前用户菜单树 + * @return 菜单树 + */ + List getCurrentUserMenuTree(); + + /** + * 获取当前用户菜单权限列表 + * @return 菜单树 + */ + List getCurrentUserMenuAuthority(); + + /** + * 获取指定角色能够访问的菜单ID + * @param roleId + */ + List getRoleMenuIds(Integer roleId, boolean withParent); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IResourceService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IResourceService.java new file mode 100644 index 0000000..119843b --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IResourceService.java @@ -0,0 +1,26 @@ +package edu.ncst.carbon.service; + +import edu.ncst.carbon.model.system.Resource; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; + +import java.util.List; + +public interface IResourceService { + + ListResultVO getResourceList(Query query); + + + List getRoleResourceIds(Integer roleId); + + List getRolesResourceList(List roleNames); + + List getPermitAllResourceList(); + + List getResourceTree(); + + List getPermitAllResourceURLs(); + + void reimportInterfaceMeta(); + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IRoleMenuService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IRoleMenuService.java new file mode 100644 index 0000000..613b113 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IRoleMenuService.java @@ -0,0 +1,21 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.system.RoleMenu; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; + +/** + * 角色菜单 服务类 + */ +public interface IRoleMenuService extends IService { + + ListResultVO getRoleMenuList(Query query); + + + RoleMenu addRoleMenu(RoleMenu roleMenu); + + + boolean deleteRoleMenu(Integer id); + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IRoleService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IRoleService.java new file mode 100644 index 0000000..747010a --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IRoleService.java @@ -0,0 +1,40 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.system.Role; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.role.ModifyRoleInterfacePermissionDTO; +import edu.ncst.carbon.vo.role.ModifyRoleMenuPermissionDTO; +import edu.ncst.carbon.vo.role.RoleDetailVO; +import edu.ncst.carbon.vo.role.RoleShortItemVO; + +import java.util.List; + +/** + * 角色业务层 + * + */ +public interface IRoleService extends IService { + + ListResultVO getRoleList(Query query); + + RoleDetailVO getRoleDetail(Integer id); + + RoleDetailVO addRole(RoleDetailVO addRoleDTO); + + RoleDetailVO modifyRole(RoleDetailVO modifyRoleDTO); + + boolean deleteRole(Integer id); + + boolean deleteRoles(List ids); + + boolean setRoleEnable(Integer id, Boolean enable); + + List selectRoleList(); + + void modifyRoleMenuPermission(ModifyRoleMenuPermissionDTO modifyDTO); + + void modifyRoleInterfacePermission(ModifyRoleInterfacePermissionDTO modifyDTO); + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ISystemService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ISystemService.java new file mode 100644 index 0000000..8978c0c --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ISystemService.java @@ -0,0 +1,6 @@ +package edu.ncst.carbon.service; + + +public interface ISystemService { + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ITaskAuditService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ITaskAuditService.java new file mode 100644 index 0000000..4358f5a --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ITaskAuditService.java @@ -0,0 +1,32 @@ +package edu.ncst.carbon.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.task.TaskAudit; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.FileNotFoundException; + +/** + * 任务审核 服务类 + * */ +public interface ITaskAuditService extends IService{ + TaskAudit getTaskAuditDetail(Integer id); + + ListResultVO getTaskAuditList(Query query); + + TaskAudit addTaskAudit(TaskAudit TaskAudit); + + TaskAudit modifyTaskAudit(TaskAudit TaskAudit); + + boolean deleteTaskAudit(Integer id); + + void uploadAudit(MultipartFile uploadFile, HttpServletRequest request, String text, Integer taskId, Integer integral) throws FileNotFoundException; + + TaskAudit audit(Integer taskAuditId, Boolean yesNo); + + TaskAudit confirmAudit(Integer taskAuditId); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ITaskService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ITaskService.java new file mode 100644 index 0000000..45444a1 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/ITaskService.java @@ -0,0 +1,24 @@ +package edu.ncst.carbon.service; + +import com.alibaba.fastjson.JSONArray; +import edu.ncst.carbon.model.task.Task; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.wechat.SportData; + +/** + * 低碳任务 服务类 + */ +public interface ITaskService { + Task getTaskDetail(Integer id); + + ListResultVO getTaskList(Query query); + + Task addTask(Task Task); + + Task modifyTask(Task Task); + + boolean deleteTask(Integer id); + + SportData encryptWeRunData(String encryptedData, String iv); +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IUserService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IUserService.java new file mode 100644 index 0000000..7a610f2 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/IUserService.java @@ -0,0 +1,46 @@ +package edu.ncst.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import edu.ncst.carbon.model.system.User; + +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.query.UserQuery; +import edu.ncst.carbon.vo.user.*; +import edu.ncst.carbon.vo.wechat.BindUserDTO; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.List; + +/** + * 用户 服务类 + */ +//从 controller层 到 service层 的接口 +public interface IUserService extends IService { + + ListResultVO getUserList(UserQuery query); + + List selectUserList(String keyword); + + UserInfoVO getUserDetail(Integer id); + + UserDetails loadUserByOpenId(String openId); + + UserInfoVO addUser(AddUserDTO addUserDTO); + + UserInfoVO modifyUser(UpdateUserDTO updateUserDTO); + + boolean deleteUser(Integer id); + + boolean setUserEnable(Integer userId, Boolean enable); + + // 用户绑定微信 + void bindWeChat(BindUserDTO bindUserDTO); + + // 用户注册微信小程序 + User registerByWechat(String openId); + + UserInfoVO resetUserPassword(ResetUserPasswordDTO resetUserPasswordDTO); + + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaServiceImpl.java new file mode 100644 index 0000000..3adfb22 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaServiceImpl.java @@ -0,0 +1,240 @@ +package edu.ncst.carbon.service.impl.carbon; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.carbon.CarbonFormulaMapper; +import edu.ncst.carbon.mapper.carbon.CarbonFormulaTypeMapper; +import edu.ncst.carbon.mapper.carbon.CarbonFormulaUnitMapper; +import edu.ncst.carbon.model.carbon.CarFormula; +import edu.ncst.carbon.model.carbon.CarFormulaType; +import edu.ncst.carbon.service.ICarbonFormulaService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.carbon.CalculationResults; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 碳公式 服务实现类 + */ +@Service +@Slf4j +public class CarbonFormulaServiceImpl extends ServiceImpl implements ICarbonFormulaService { + + private final CarbonFormulaMapper carbonFormulaMapper; + + private final CarbonFormulaTypeMapper carbonFormulaTypeMapper; + + private final CarbonFormulaUnitMapper carbonFormulaUnitMapper; + + public CarbonFormulaServiceImpl(CarbonFormulaMapper carbonFormulaMapper, CarbonFormulaTypeMapper carbonFormulaTypeMapper, CarbonFormulaUnitMapper carbonFormulaUnitMapper){ + this.carbonFormulaMapper = carbonFormulaMapper; + this.carbonFormulaTypeMapper = carbonFormulaTypeMapper; + this.carbonFormulaUnitMapper = carbonFormulaUnitMapper; + } + + // 获取碳公式列表(普通列表结构) + @Override + public ListResultVO getCarFormulaList(Query query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = carbonFormulaMapper.getCarFormulaList(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + } + + + // 按照分类获取碳公式列表(普通列表结构) + /*@Override + public ListResultVO getCarFormulaListByTypeId(Integer id){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = carbonFormulaMapper.getCarFormulaList(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + }*/ + + // 获取碳公式详情 + @Override + @Cacheable(cacheNames="carFormula", key="#id", condition="#id > 0") + public CarFormula getCarFormulaDetail(Integer id) { + + CarFormula CarFormula = carbonFormulaMapper.getCarFormulaDetail(id); + + if (CarFormula == null) { + throw new BusinessException(CodeMsg.FETCH_ERROR); + } + + return CarFormula; + } + + // 添加碳公式 + @Transactional + @Override + @CachePut(value = {"carFormula"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "carFormula:list", "carFormula:options" }, allEntries = true + ) + public CarFormula addCarFormula(CarFormula carFormula){ + int insert = carbonFormulaMapper.insert(carFormula); + if (insert == 1) { + + return getCarFormulaDetail(carFormula.getId()); + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改碳公式 + @Transactional + @Override + @CachePut(value = {"carFormula"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "carFormula:list", "carFormula:options" }, allEntries = true + ) + public CarFormula modifyCarFormula(CarFormula carFormula) { + Integer carFormulaId = carFormula.getId(); + if (carFormulaId == null) { + throw new BusinessException(CodeMsg.FORM_ERROR); + } + // 更新碳公式分类信息 + int update = carbonFormulaMapper.updateById(carFormula); + + + if (update == 1) { + return getCarFormulaDetail(carFormulaId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + //删除碳公式 + @Transactional + @Override + @Caching( + evict = { + @CacheEvict(value = "carFormula", key = "#id"), + @CacheEvict(cacheNames = { "carFormula:list", "carFormula:options" }, allEntries = true) + } + ) + public boolean deleteCarFormula(Integer id) { + CarFormula carFormula = carbonFormulaMapper.selectById(id); + if( carFormula==null){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + int delete = carbonFormulaMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } + + + public CalculationResults calculation(Integer id) { + + CarFormula carFormula = carbonFormulaMapper.selectById(id); + CalculationResults results = new CalculationResults(); + BeanUtils.copyProperties(carFormula, results); + + CarFormulaType carbonFormulaType = carbonFormulaTypeMapper.selectById(carFormula.getTypeId()); + results.setUnit(carbonFormulaType.getLabel()); + + return results; + } + + + /** + * 封装查询对象 + * + * @param query 传入 CarbonFormulaQuery 对象 + * @return QueryWrapper + */ + + /** + * 获取碳公式列表 + * + * @param query 传入 CarbonFormulaQuery 对象 + * @return 碳公式列表 + */ + + /** + * 获取碳公式列表(不分页) + * + * @param query 传入 CarbonFormulaQuery 对象 + * @return 碳公式列表 + */ + + /** + * 获取碳公式详情 + * + * @param id 碳公式 ID + * @return 碳公式信息 + */ + + /** + * 添加碳公式 + * + * @param CarbonFormula 碳公式信息 + */ + + /** + * 删除碳公式 + * + * @param id 待删除碳公式ID + * @return 是否删除成功 + */ + + /** + * 获取已启用的碳公式 + * + * @param paramMap 查询条件 + * @return 碳公式信息 + */ + + /** + * 根据碳公式名称获取碳公式信息 + * 【注意】:需要保证同一使用单位下的碳公式不能重名 + * FIXME: 添加同一单位下的重名碳公式进行测试 + * @param name 碳公式名称 + * @return 碳公式信息 + */ + + /** + * 批量导入 + * + * @param list 碳公式信息列表 + * @param recordID 导入记录 ID + * @param fatherEqu + * @return 导入结果 + */ + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaTypeServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaTypeServiceImpl.java new file mode 100644 index 0000000..73e84ea --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaTypeServiceImpl.java @@ -0,0 +1,154 @@ +package edu.ncst.carbon.service.impl.carbon; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.carbon.CarbonFormulaTypeMapper; +import edu.ncst.carbon.model.carbon.CarFormulaType; +import edu.ncst.carbon.service.ICarbonFormulaTypeService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 碳公式类别 服务实现类 + */ +@Service +@Slf4j +public class CarbonFormulaTypeServiceImpl extends ServiceImpl implements ICarbonFormulaTypeService { + + private final CarbonFormulaTypeMapper carbonFormulaTypeMapper; + + public CarbonFormulaTypeServiceImpl(CarbonFormulaTypeMapper carbonFormulaTypeMapper) { + this.carbonFormulaTypeMapper = carbonFormulaTypeMapper; + } + + + // 获取碳类别列表(普通列表结构) + @Override + public ListResultVO getCarFormulaTypeList(Query query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = carbonFormulaTypeMapper.selectPage(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + } + + // 获取碳类别详情 + @Override + @Cacheable(cacheNames="carFormulaType", key="#id", condition="#id > 0") + public CarFormulaType getCarFormulaTypeDetail(Integer id) { + + CarFormulaType CarFormulaType = carbonFormulaTypeMapper.selectById(id); + + if (CarFormulaType == null) { + throw new BusinessException(CodeMsg.FETCH_ERROR); + } + + return CarFormulaType; + } + + // 添加碳类别 + @Transactional + @Override + @CachePut(value = {"carFormulaType"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "carFormulaType:list", "carFormulaType:options" }, allEntries = true + ) + public CarFormulaType addCarFormulaType(CarFormulaType carFormulaType){ + int insert = carbonFormulaTypeMapper.insert(carFormulaType); + int a= insert; + if (insert == 1) { + return getCarFormulaTypeDetail(carFormulaType.getId()); + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改碳类别 + @Transactional + @Override + @CachePut(value = {"carFormulaType"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "carFormulaType:list", "carFormulaType:options" }, allEntries = true + ) + public CarFormulaType modifyCarFormulaType(CarFormulaType carFormulaType) { + Integer carFormulaTypeId = carFormulaType.getId(); + if (carFormulaTypeId == null) { + throw new BusinessException(CodeMsg.FORM_ERROR); + } + // 更新碳公式分类信息 + int update = carbonFormulaTypeMapper.updateById(carFormulaType); + + + if (update == 1) { + return getCarFormulaTypeDetail(carFormulaTypeId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + //删除碳类别 + @Transactional + @Override + @Caching( + evict = { + @CacheEvict(value = "carFormulaType", key = "#id"), + @CacheEvict(cacheNames = { "carFormulaType:list", "carFormulaType:options" }, allEntries = true) + } + ) + public boolean deleteCarFormulaType(Integer id) { + CarFormulaType carFormulaType = carbonFormulaTypeMapper.selectById(id); + if( carFormulaType==null){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + int delete = carbonFormulaTypeMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } + + //获取已启用的碳类别 + + + /** + * 根据碳类别名称获取碳类别信息 + * 【注意】:需要保证同一使用单位下的碳类别不能重名 + * FIXME: 添加同一单位下的重名碳类别进行测试 + * @param name 碳类别名称 + * @return 碳类别信息 + */ + + /** + * 批量导入 + * + * @param list 碳类别信息列表 + * @param recordID 导入记录 ID + * @param fatherEqu + * @return 导入结果 + */ + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaUnitServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaUnitServiceImpl.java new file mode 100644 index 0000000..599478d --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/carbon/CarbonFormulaUnitServiceImpl.java @@ -0,0 +1,130 @@ +package edu.ncst.carbon.service.impl.carbon; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.carbon.CarbonFormulaUnitMapper; +import edu.ncst.carbon.model.carbon.CarFormulaUnit; +import edu.ncst.carbon.service.ICarbonFormulaUnitService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 碳公式单位 服务实现类 + */ +@Service +@Slf4j +public class CarbonFormulaUnitServiceImpl extends ServiceImpl implements ICarbonFormulaUnitService { + + private final CarbonFormulaUnitMapper carbonFormulaUnitMapper; + + public CarbonFormulaUnitServiceImpl(CarbonFormulaUnitMapper carbonFormulaUnitMapper) { + this.carbonFormulaUnitMapper = carbonFormulaUnitMapper; + } + + // 获取碳类别列表(普通列表结构) + @Override + public ListResultVO getCarFormulaUnitList(Query query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = carbonFormulaUnitMapper.selectPage(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + } + + // 获取碳类别详情 + @Override + @Cacheable(cacheNames="carFormulaUnit", key="#id", condition="#id > 0") + public CarFormulaUnit getCarFormulaUnitDetail(Integer id) { + + CarFormulaUnit CarFormulaUnit = carbonFormulaUnitMapper.selectById(id); + + if (CarFormulaUnit == null) { + throw new BusinessException(CodeMsg.FETCH_ERROR); + } + + return CarFormulaUnit; + } + + // 添加碳类别 + @Transactional + @Override + @CachePut(value = {"carFormulaUnit"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "carFormulaUnit:list", "carFormulaUnit:options" }, allEntries = true + ) + public CarFormulaUnit addCarFormulaUnit(CarFormulaUnit carFormulaUnit){ + int insert = carbonFormulaUnitMapper.insert(carFormulaUnit); + int a= insert; + if (insert == 1) { + return getCarFormulaUnitDetail(carFormulaUnit.getId()); + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改碳类别 + @Transactional + @Override + @CachePut(value = {"carFormulaUnit"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "carFormulaUnit:list", "carFormulaUnit:options" }, allEntries = true + ) + public CarFormulaUnit modifyCarFormulaUnit(CarFormulaUnit carFormulaUnit) { + Integer carFormulaUnitId = carFormulaUnit.getId(); + if (carFormulaUnitId == null) { + throw new BusinessException(CodeMsg.FORM_ERROR); + } + // 更新碳公式分类信息 + int update = carbonFormulaUnitMapper.updateById(carFormulaUnit); + + + if (update == 1) { + return getCarFormulaUnitDetail(carFormulaUnitId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + //删除碳类别 + @Transactional + @Override + @Caching( + evict = { + @CacheEvict(value = "carFormulaUnit", key = "#id"), + @CacheEvict(cacheNames = { "carFormulaUnit:list", "carFormulaUnit:options" }, allEntries = true) + } + ) + public boolean deleteCarFormulaUnit(Integer id) { + CarFormulaUnit carFormulaUnit = carbonFormulaUnitMapper.selectById(id); + if( carFormulaUnit==null){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + int delete = carbonFormulaUnitMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/goods/GoodsServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/goods/GoodsServiceImpl.java new file mode 100644 index 0000000..62c407e --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/goods/GoodsServiceImpl.java @@ -0,0 +1,130 @@ +package edu.ncst.carbon.service.impl.goods; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.goods.GoodsMapper; +import edu.ncst.carbon.model.goods.Goods; +import edu.ncst.carbon.service.IGoodsService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 商品 服务实现类 + */ +@Service +@Slf4j +public class GoodsServiceImpl extends ServiceImpl implements IGoodsService { + + private final GoodsMapper GoodsMapper; + + public GoodsServiceImpl(GoodsMapper GoodsMapper) { + this.GoodsMapper = GoodsMapper; + } + + + // 获取商品列表(普通列表结构) + @Override + public ListResultVO getGoodsList(Query query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = GoodsMapper.selectPage(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + } + + // 获取商品详情 + @Override + @Cacheable(cacheNames="Goods", key="#id", condition="#id > 0") + public Goods getGoodsDetail(Integer id) { + + Goods Goods = GoodsMapper.selectById(id); + + if (Goods == null) { + throw new BusinessException(CodeMsg.FETCH_ERROR); + } + + return Goods; + } + + // 添加商品 + @Transactional + @Override + @CachePut(value = {"Goods"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "Goods:list", "Goods:options" }, allEntries = true + ) + public Goods addGoods(Goods Goods){ + int insert = GoodsMapper.insert(Goods); + int a= insert; + if (insert == 1) { + return getGoodsDetail(Goods.getId()); + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改商品 + @Transactional + @Override + @CachePut(value = {"Goods"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "Goods:list", "Goods:options" }, allEntries = true + ) + public Goods modifyGoods(Goods Goods) { + Integer GoodsId = Goods.getId(); + if (GoodsId == null) { + throw new BusinessException(CodeMsg.FORM_ERROR); + } + // 更新碳公式分类信息 + int update = GoodsMapper.updateById(Goods); + + + if (update == 1) { + return getGoodsDetail(GoodsId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + //删除商品 + @Transactional + @Override + @Caching( + evict = { + @CacheEvict(value = "Goods", key = "#id"), + @CacheEvict(cacheNames = { "Goods:list", "Goods:options" }, allEntries = true) + } + ) + public boolean deleteGoods(Integer id) { + Goods Goods = GoodsMapper.selectById(id); + if( Goods==null){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + int delete = GoodsMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/image/ImageServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/image/ImageServiceImpl.java new file mode 100644 index 0000000..9b6dabd --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/image/ImageServiceImpl.java @@ -0,0 +1,89 @@ +package edu.ncst.carbon.service.impl.image; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.mapper.image.ImageMapper; +import edu.ncst.carbon.model.image.Image; +import edu.ncst.carbon.model.task.Task; +import edu.ncst.carbon.service.IImageService; +import edu.ncst.carbon.service.ITaskService; +import edu.ncst.carbon.utils.SessionUtils; +import edu.ncst.carbon.vo.user.UserInfoVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.InetAddress; + +/** + * 图片上传服务 实现类 + * */ +@Service +@Slf4j +public class ImageServiceImpl extends ServiceImpl + implements IImageService { + + + // 读取配置文件中上传路径 + @Value("${file.file-dir}") + public String uploadFilePath; + + @Autowired + ImageMapper imageMapper; + + @Override + public String uploadImage(MultipartFile uploadFile, HttpServletRequest request, String namePrefix) + throws FileNotFoundException { + + + log.info("文件信息" + uploadFile); + // 获取存放文件的目录 + File uploadPath = new File(uploadFilePath); + + + if (!uploadPath.exists()) { + uploadPath.mkdirs(); + } + + //命名图片文件 + String oldName = uploadFile.getOriginalFilename(); + String newName =namePrefix + oldName.substring(oldName.lastIndexOf(".")); + + //存储图片文件 + try { + File file = new File(uploadPath, newName); + log.info(file.getAbsolutePath()); + + OutputStream outputStream = new FileOutputStream(file); + InputStream is = uploadFile.getInputStream(); + FileCopyUtils.copy(is, outputStream); + + // 文件的完整路径 + String filePath = uploadPath + File.separator + newName; + + InetAddress addr = InetAddress.getLocalHost(); + // 文件线上地址,回显给前端 + String url = request.getScheme() + "://" + addr.getHostAddress() + ":" + request.getServerPort() + "/images/" + newName; + + // 将图片信息存入数据库 + Image image = new Image(); + image.setImgUrl(url); + image.setImgName(newName); + int result = imageMapper.uploadImage(image); + + return newName; + } catch (IOException e) { + log.error(e.getMessage()); + } + return "上传失败"; + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserFootprintServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserFootprintServiceImpl.java new file mode 100644 index 0000000..939f924 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserFootprintServiceImpl.java @@ -0,0 +1,142 @@ +package edu.ncst.carbon.service.impl.log; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.log.LogUserFootprintMapper; +import edu.ncst.carbon.model.log.LogUserFootprint; +import edu.ncst.carbon.service.ILogUserFootprintService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 用户碳足迹 服务实现类 + */ +@Service +@Slf4j +public class LogUserFootprintServiceImpl extends ServiceImpl implements ILogUserFootprintService { + + private final LogUserFootprintMapper LogUserFootprintMapper; + + public LogUserFootprintServiceImpl(LogUserFootprintMapper LogUserFootprintMapper) { + this.LogUserFootprintMapper = LogUserFootprintMapper; + } + + + // 获取所有碳足迹列表(普通列表结构) + @Override + public ListResultVO getLogFootprintList(Query query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = LogUserFootprintMapper.selectPage(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + } + + // 获取用户碳足迹列表(普通列表结构) + @Override + public List getLogUserFootprintList(Integer userId){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id",userId); + + List resultVO = LogUserFootprintMapper.selectList(queryWrapper); + return resultVO; + } + + // 获取用户碳足迹详情 + @Override + @Cacheable(cacheNames="LogUserFootprint", key="#id", condition="#id > 0") + public LogUserFootprint getLogUserFootprintDetail(Integer id) { + + LogUserFootprint LogUserFootprint = LogUserFootprintMapper.selectById(id); + + if (LogUserFootprint == null) { + throw new BusinessException(CodeMsg.FETCH_ERROR); + } + + return LogUserFootprint; + } + + // 添加用户碳足迹 + @Transactional + @Override + @CachePut(value = {"LogUserFootprint"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "LogUserFootprint:list", "LogUserFootprint:options" }, allEntries = true + ) + public LogUserFootprint addLogUserFootprint(LogUserFootprint LogUserFootprint){ + int insert = LogUserFootprintMapper.insert(LogUserFootprint); + int a= insert; + if (insert == 1) { + return getLogUserFootprintDetail(LogUserFootprint.getId()); + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改用户碳足迹 + @Transactional + @Override + @CachePut(value = {"LogUserFootprint"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "LogUserFootprint:list", "LogUserFootprint:options" }, allEntries = true + ) + public LogUserFootprint modifyLogUserFootprint(LogUserFootprint LogUserFootprint) { + Integer LogUserFootprintId = LogUserFootprint.getId(); + if (LogUserFootprintId == null) { + throw new BusinessException(CodeMsg.FORM_ERROR); + } + // 更新碳公式分类信息 + int update = LogUserFootprintMapper.updateById(LogUserFootprint); + + + if (update == 1) { + return getLogUserFootprintDetail(LogUserFootprintId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + //删除用户碳足迹 + @Transactional + @Override + @Caching( + evict = { + @CacheEvict(value = "LogUserFootprint", key = "#id"), + @CacheEvict(cacheNames = { "LogUserFootprint:list", "LogUserFootprint:options" }, allEntries = true) + } + ) + public boolean deleteLogUserFootprint(Integer id) { + LogUserFootprint LogUserFootprint = LogUserFootprintMapper.selectById(id); + if( LogUserFootprint==null){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + int delete = LogUserFootprintMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserGoodsServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserGoodsServiceImpl.java new file mode 100644 index 0000000..c7f6553 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserGoodsServiceImpl.java @@ -0,0 +1,132 @@ +package edu.ncst.carbon.service.impl.log; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.log.LogUserGoodsMapper; +import edu.ncst.carbon.model.log.LogUserGoods; +import edu.ncst.carbon.service.ILogUserGoodsService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 用户碳足迹 服务实现类 + */ +@Service +@Slf4j +public class LogUserGoodsServiceImpl extends ServiceImpl implements ILogUserGoodsService { + + private final LogUserGoodsMapper LogUserGoodsMapper; + + public LogUserGoodsServiceImpl(LogUserGoodsMapper LogUserGoodsMapper) { + this.LogUserGoodsMapper = LogUserGoodsMapper; + } + + + // 获取碳类别列表(普通列表结构) + @Override + public ListResultVO getLogUserGoodsList(Query query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = LogUserGoodsMapper.selectPage(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + } + + // 获取碳类别详情 + @Override + @Cacheable(cacheNames="LogUserGoods", key="#id", condition="#id > 0") + public LogUserGoods getLogUserGoodsDetail(Integer id) { + + LogUserGoods LogUserGoods = LogUserGoodsMapper.selectById(id); + + if (LogUserGoods == null) { + throw new BusinessException(CodeMsg.FETCH_ERROR); + } + + return LogUserGoods; + } + + // 添加碳类别 + @Transactional + @Override + @CachePut(value = {"LogUserGoods"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "LogUserGoods:list", "LogUserGoods:options" }, allEntries = true + ) + public LogUserGoods addLogUserGoods(LogUserGoods LogUserGoods){ + int insert = LogUserGoodsMapper.insert(LogUserGoods); + int a= insert; + if (insert == 1) { + return getLogUserGoodsDetail(LogUserGoods.getId()); + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改碳类别 + @Transactional + @Override + @CachePut(value = {"LogUserGoods"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "LogUserGoods:list", "LogUserGoods:options" }, allEntries = true + ) + public LogUserGoods modifyLogUserGoods(LogUserGoods LogUserGoods) { + Integer LogUserGoodsId = LogUserGoods.getId(); + if (LogUserGoodsId == null) { + throw new BusinessException(CodeMsg.FORM_ERROR); + } + // 更新碳公式分类信息 + int update = LogUserGoodsMapper.updateById(LogUserGoods); + + + if (update == 1) { + return getLogUserGoodsDetail(LogUserGoodsId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + //删除碳类别 + @Transactional + @Override + @Caching( + evict = { + @CacheEvict(value = "LogUserGoods", key = "#id"), + @CacheEvict(cacheNames = { "LogUserGoods:list", "LogUserGoods:options" }, allEntries = true) + } + ) + public boolean deleteLogUserGoods(Integer id) { + LogUserGoods LogUserGoods = LogUserGoodsMapper.selectById(id); + if( LogUserGoods==null){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + int delete = LogUserGoodsMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } +} + diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserServiceImpl.java new file mode 100644 index 0000000..371e3c3 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LogUserServiceImpl.java @@ -0,0 +1,130 @@ +package edu.ncst.carbon.service.impl.log; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.log.LogUserMapper; +import edu.ncst.carbon.model.log.LogUser; +import edu.ncst.carbon.service.ILogUserService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 商品 服务实现类 + */ +@Service +@Slf4j +public class LogUserServiceImpl extends ServiceImpl implements ILogUserService { + + private final LogUserMapper logUserMapper; + + public LogUserServiceImpl(LogUserMapper logUserMapper) { + this.logUserMapper = logUserMapper; + } + + + // 获取商品列表(普通列表结构) + @Override + public ListResultVO getLogUserList(Query query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = logUserMapper.selectPage(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + } + + // 获取商品详情 + @Override + @Cacheable(cacheNames="LogUser", key="#id", condition="#id > 0") + public LogUser getLogUserDetail(Integer id) { + + LogUser LogUser = logUserMapper.selectById(id); + + if (LogUser == null) { + throw new BusinessException(CodeMsg.FETCH_ERROR); + } + + return LogUser; + } + + // 添加商品 + @Transactional + @Override + @CachePut(value = {"LogUser"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "LogUser:list", "LogUser:options" }, allEntries = true + ) + public LogUser addLogUser(LogUser LogUser){ + int insert = logUserMapper.insert(LogUser); + int a= insert; + if (insert == 1) { + return getLogUserDetail(LogUser.getId()); + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改商品 + @Transactional + @Override + @CachePut(value = {"LogUser"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "LogUser:list", "LogUser:options" }, allEntries = true + ) + public LogUser modifyLogUser(LogUser LogUser) { + Integer LogUserId = LogUser.getId(); + if (LogUserId == null) { + throw new BusinessException(CodeMsg.FORM_ERROR); + } + // 更新碳公式分类信息 + int update = logUserMapper.updateById(LogUser); + + + if (update == 1) { + return getLogUserDetail(LogUserId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + //删除商品 + @Transactional + @Override + @Caching( + evict = { + @CacheEvict(value = "LogUser", key = "#id"), + @CacheEvict(cacheNames = { "LogUser:list", "LogUser:options" }, allEntries = true) + } + ) + public boolean deleteLogUser(Integer id) { + LogUser LogUser = logUserMapper.selectById(id); + if( LogUser==null){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + int delete = logUserMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LoginLogServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LoginLogServiceImpl.java new file mode 100644 index 0000000..d5c401f --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/log/LoginLogServiceImpl.java @@ -0,0 +1,27 @@ +package edu.ncst.carbon.service.impl.log; + +import edu.ncst.carbon.model.log.LoginLog; +import edu.ncst.carbon.service.ILoginLogService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.query.LoginLogQuery; +import org.springframework.stereotype.Service; + +/** + * 登录日志 服务实现类 + */ +@Service +public class LoginLogServiceImpl implements ILoginLogService { + + + @Override + public ListResultVO getLoginLogList(LoginLogQuery query) { + return null; + } + + @Override + public void addLoginLog(Integer userId, Boolean success) { + + } + + //project/declarationAdd +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/MenuServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/MenuServiceImpl.java new file mode 100644 index 0000000..390211b --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/MenuServiceImpl.java @@ -0,0 +1,336 @@ +package edu.ncst.carbon.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.system.MenuMapper; +import edu.ncst.carbon.model.system.Menu; +import edu.ncst.carbon.model.system.Role; +import edu.ncst.carbon.service.IMenuService; +import edu.ncst.carbon.utils.SessionUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.user.UserInfoVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 菜单 服务实现类 + */ +@Service +@Slf4j +public class MenuServiceImpl extends ServiceImpl implements IMenuService { + + private final MenuMapper menuMapper; + + @Autowired + private SqlSession sqlSession; + + public MenuServiceImpl(MenuMapper menuMapper) { + this.menuMapper = menuMapper; + } + + // 获取菜单列表 + @Override + public ListResultVO getMenuList(Query query) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + Page page = menuMapper.getMenuList(pageRequest, null); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + + return listResultVO; + } + + // 获取菜单详情 + @Override + public Menu getMenuDetail(Integer id) { + Menu menu = menuMapper.selectById(id); + return menu; + } + + // 添加菜单 + @Transactional + @Override + public Menu addMenu(Menu menu) { + int insert = menuMapper.insert(menu); + Menu result = getMenuDetail(menu.getId()); + if (insert == 1) { + return result; + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改菜单 + @Transactional + @Override + public Menu modifyMenu(Menu menu) { + int update = menuMapper.updateById(menu); + Menu result = getMenuDetail(menu.getId()); + + if (update == 1) { + return result; + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + // 删除菜单 + @Transactional + @Override + public boolean deleteMenu(Integer id) { + int delete = menuMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } + + // 批量删除菜单 +// @Transactional +// @Override +// public boolean batchDeleteMenu(BatchDeleteDTO deleteDTO) { +// List ids = deleteDTO.getIds(); +// if (ids == null || ids.isEmpty()) return false; +// +// int delete = menuMapper.deleteBatchIds(ids); +// +// if (delete == ids.size()) { +// return true; +// } else { +// throw new BusinessException(CodeMsg.DELETE_ERROR); +// } +// } + +// /** +// * 导入菜单 +// * 说明:该操作会将原有的菜单元信息全部清空,然后再导入新的菜单元信息 +// * @param resetMenuDTO 重置菜单表单 +// */ +// @Transactional +// @Override +// public void resetMenuMeta(ResetMenuDTO resetMenuDTO) { +// List oldTree = getMenuTree(); +// List newTree = resetMenuDTO.getMenus(); +// Map waitDeleteMap = new HashMap<>(); +// +// findWaitDeleteMenu(oldTree, newTree, waitDeleteMap); +// diffMenuMeta(oldTree, newTree, waitDeleteMap, null); +// +// // 批量删除不存在的菜单 +// Collection deleteMenus = waitDeleteMap.values(); +// List menuIds = deleteMenus.stream().map(Menu::getId).collect(Collectors.toList()); +// +// if (!menuIds.isEmpty()) { +// menuMapper.deleteBatchIds(menuIds); +// } +// } + + private void findWaitDeleteMenu(List oldTree, List newTree, Map waitDeleteMap) { + HashMap newMenuMap = new HashMap<>(); + + for (Menu menu : newTree) { + newMenuMap.put(menu.getName(), menu); + } + + // 旧菜单列表存在 但 新菜单列表不存在 加入到待删除列表(旧有新无) + for (Menu oldMenu : oldTree) { + String key = oldMenu.getName(); + + if (!newMenuMap.containsKey(key)) { + waitDeleteMap.put(key, oldMenu); + } else { + Menu newMenu = newMenuMap.get(key); + List children = newMenu.getChildren(); + + if (children != null && children.size() > 0) { + findWaitDeleteMenu(oldMenu.getChildren(), children, waitDeleteMap); + } + } + } + } + + private void diffMenuMeta(List oldTree, List newTree, Map waitDeleteMap, Integer parentId) { + if (oldTree == null || newTree == null) return; + + HashMap oldMenuMap = new HashMap<>(); + + for (Menu menu : oldTree) { + oldMenuMap.put(menu.getName(), menu); + } + + // 遍历新菜单列表 + for (Menu newMenu : newTree) { + List children = newMenu.getChildren(); + List oldChildren = new ArrayList<>(); + String key = newMenu.getName(); + log.info(newMenu.toString()); + log.info(key); + Integer menuId; + + if (newMenu.getName() == null || "".equals(newMenu.getName())) { + continue; + } + + if (oldMenuMap.containsKey(key)) { + // 旧菜单列表存在 且 新菜单列表存在 执行更新操作(旧有新有) + Menu oldMenu = oldMenuMap.get(key); + oldChildren = oldMenu.getChildren(); + menuId = oldMenu.getId(); + + // 更新旧菜单数据 + BeanUtils.copyProperties(newMenu, oldMenu,"id", "children"); + oldMenu.setParentId(parentId); + + // 属性完全相同(除ID,新菜单没有ID可以进行比较)时没有必要进行更新操作 + if (!isMenuEquals(oldMenu, newMenu)) { + menuMapper.updateById(oldMenu); + } + } else if (waitDeleteMap.containsKey(key)) { + Menu oldMenu = waitDeleteMap.remove(key); + oldChildren = oldMenu.getChildren(); + menuId = oldMenu.getId(); + + // 更新旧菜单数据 + BeanUtils.copyProperties(newMenu, oldMenu, "id", "children"); + oldMenu.setParentId(parentId); + + if (!isMenuEquals(oldMenu, newMenu)) { + menuMapper.updateById(oldMenu); + } + } else { + log.info(newMenu.toString()); + // 旧菜单列表不存在 但 新菜单列表存在 执行插入操作(旧无新有) + newMenu.setParentId(parentId); + menuMapper.insert(newMenu); + menuId = newMenu.getId(); + } + + if (children != null && children.size() > 0) { + diffMenuMeta(oldChildren, children, waitDeleteMap, menuId); + } + } + } + + /** + * 判断两个菜单中的字段是否相等 + */ + private boolean isMenuEquals(Menu oldMenu, Menu newMenu) { + if (oldMenu == null && newMenu == null) { + return true; + } else if (oldMenu == null || newMenu == null) { + return false; + } + + return Objects.equals(oldMenu.getName(), newMenu.getName()) && + Objects.equals(oldMenu.getTitle(), newMenu.getTitle()) && + Objects.equals(oldMenu.getType(), newMenu.getType()) && + Objects.equals(oldMenu.getIcon(), newMenu.getIcon()) && + Objects.equals(oldMenu.getUrl(), newMenu.getUrl()) && + Objects.equals(oldMenu.getShowInMenu(), newMenu.getShowInMenu()) && + Objects.equals(oldMenu.getParentId(), newMenu.getParentId()) && + Objects.equals(oldMenu.getSort(), newMenu.getSort()) && + Objects.equals(oldMenu.getRemark(), newMenu.getRemark()); + } + + /** + * 获取菜单树 + * @return 菜单树 + */ + @Override + public List getMenuTree() { + return menuMapper.getMenuTree(null); + } + + /** + * 获取当前菜单树 + * @return 菜单树 + */ + @Override + public List getCurrentUserMenuTree() { + UserInfoVO userInfoVO = SessionUtils.getCurrentUser(); + List roles = userInfoVO.getRoles(); + Set allowMenuIdSet = new HashSet<>(); + + if (roles != null) { + for (Role role : roles) { + List roleMenuIds = getRoleMenuIds(role.getId(),true); + allowMenuIdSet.addAll(roleMenuIds); + } + } + + List menuTree = getMenuTree(); + + return filterMenuList(menuTree, allowMenuIdSet); + } + + /** + * 过滤掉不允许访问的菜单 + */ + private List filterMenuList(List menuTree, Set allowMenuIdSet) { + List allowMenuTree = new ArrayList<>(); + + if (menuTree == null || menuTree.size() == 0) { + return menuTree; + } + + for (Menu menu : menuTree) { + if (allowMenuIdSet.contains(menu.getId())) { + + if (menu.getChildren() != null && menu.getChildren().size() > 0) { + menu.setChildren(filterMenuList(menu.getChildren(), allowMenuIdSet)); + } + + allowMenuTree.add(menu); + } + } + + return allowMenuTree; + } + + /** + * 获取指定角色能够访问的菜单ID + */ + @Override + public List getRoleMenuIds(Integer roleId , boolean withParent) { + if(withParent){ + return menuMapper.getRoleMenuIdsWithParent(roleId); + }else{ + return menuMapper.getRoleMenuIds(roleId); + } + + } + + /** + * 获取当前用户 + * @return + */ + @Override + public List getCurrentUserMenuAuthority() { + UserInfoVO userInfoVO = SessionUtils.getCurrentUser(); + List roles = userInfoVO.getRoles(); + + if (roles != null && !roles.isEmpty()) { + List roleNames = roles.stream().map(Role::getName).collect(Collectors.toList()); + return menuMapper.getCurrentUserMenuAuthority(roleNames); + } else { + return new ArrayList<>(); + } + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/ResourceServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/ResourceServiceImpl.java new file mode 100644 index 0000000..8ea2172 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/ResourceServiceImpl.java @@ -0,0 +1,400 @@ +package edu.ncst.carbon.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import edu.ncst.carbon.aspect.LoginUserScope; +import edu.ncst.carbon.model.system.Resource; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.system.ResourceMapper; +import edu.ncst.carbon.service.IResourceService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.security.PermitAll; +import java.io.File; +import java.io.FileFilter; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; + +@Service +public class ResourceServiceImpl implements IResourceService { + + @Autowired + private ResourceMapper resourceMapper; + + // 欲扫描的包路径 + private static final String SCAN_PACKAGE = "edu.ncst.carbon.controller"; + + /** + * 重新导入接口元信息 + */ + @Caching( + evict = { + @CacheEvict(cacheNames = "permitAllResourceList"), + @CacheEvict(cacheNames = "userScopeResourceList"), + @CacheEvict(cacheNames = "permitAllResourceURLs"), + @CacheEvict(cacheNames = "userScopeResourceURLs") + } + ) + @Transactional + @Override + public void reimportInterfaceMeta() { + List newInterfaceMetas = getSystemInterfaceMetas(); + Set newInterfaceNameSet = new HashSet<>(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + List oldInterfaceMetas = resourceMapper.selectList(queryWrapper); + HashMap oldInterfaceNameMap = new HashMap<>(); + List insertResourceList = new ArrayList<>(); + + // 待删除接口列表 + List deleteInterfaceIds = new ArrayList<>(); + + for (Resource newInterfaceMeta : newInterfaceMetas) { + newInterfaceNameSet.add(newInterfaceMeta.getName()); + } + + for (Resource oldInterfaceMeta : oldInterfaceMetas) { + oldInterfaceNameMap.put(oldInterfaceMeta.getName(), oldInterfaceMeta); + + if (!newInterfaceNameSet.contains(oldInterfaceMeta.getName())) { + // 旧有新无,进行删除操作 + deleteInterfaceIds.add(oldInterfaceMeta.getId()); + } + } + + // 检查数据库中的接口是否还存在于当前系统当中 + for (Resource newInterface : newInterfaceMetas) { + String key = newInterface.getName(); + + if (oldInterfaceNameMap.containsKey(key)) { + // 新有旧有,进行 UPDATE + Resource oldResource = oldInterfaceNameMap.get(key); + + if (isResourceChange(oldResource, newInterface)) { + BeanUtils.copyProperties(newInterface, oldResource, "id"); + resourceMapper.updateById(oldResource); + } + } else { + // 新有旧无,进行 INSERT, 如果上级资源ID为空,说明是资源分组,资源分组已经在getSystemInterfaceMetas方法中插入到数据库 + if (newInterface.getParentId() != null) { + insertResourceList.add(newInterface); + } + } + } + + // 批量删除 + if (!deleteInterfaceIds.isEmpty()) { + resourceMapper.deleteBatchIds(deleteInterfaceIds); + } + + // 批量插入 + if (!insertResourceList.isEmpty()) { + resourceMapper.batchInsert(insertResourceList); + } + } + + /** + * 获取系统当前所有接口的元信息 + */ + public List getSystemInterfaceMetas() { + List> classes = findClassLocal(); + List resources = new ArrayList<>(); + + for (Class aClass : classes) { + RequestMapping baseRequestMapping = aClass.getAnnotation(RequestMapping.class); + Api apiAnnotation = aClass.getAnnotation(Api.class); + + String baseUrl = ""; // Base URL + String groupName = ""; // 分组标识名 + Resource parentResource = null; // 上级资源 + + if (baseRequestMapping != null) { + String[] urls = baseRequestMapping.value(); + if (urls.length > 0) { + baseUrl = urls[0]; + } + } + + if (apiAnnotation != null && !apiAnnotation.hidden()) { + parentResource = new Resource(); + groupName = aClass.getName(); + + parentResource.setLabel(apiAnnotation.description()); + parentResource.setName(groupName); + parentResource.setUrl(baseUrl); + parentResource.setMethod("ALL"); + + Integer parentResourceId = resourceMapper.getIdByName(groupName); + + if (parentResourceId == null) { + resourceMapper.insert(parentResource); + } else { + parentResource.setId(parentResourceId); + resourceMapper.updateById(parentResource); + } + + resources.add(parentResource); + } + + // 获取该类的所有方法 (不包括父类) + Method[] methods = aClass.getDeclaredMethods(); + + for (Method method : methods) { + if (!Modifier.isPublic(method.getModifiers())) { + continue; + } + + ApiOperation operationAnnotation = method.getAnnotation(ApiOperation.class); + LoginUserScope scopeAnnotation = method.getAnnotation(LoginUserScope.class); + PermitAll permitAllAnnotation = method.getAnnotation(PermitAll.class); + + if (operationAnnotation == null || operationAnnotation.hidden()) { + continue; + } + + List interfaceMethods = new ArrayList<>(); + String url = getInterfaceMethods(method, interfaceMethods); + String interfaceName = operationAnnotation.value(); + + // 添加到接口信息列表 + if (!"".equals(interfaceName) && url != null) { + for (String requestMethod : interfaceMethods) { + Resource resource = new Resource(); + + resource.setLabel(interfaceName); + resource.setName(groupName + "." + method.getName()); + resource.setMethod(requestMethod); + resource.setUrl(baseUrl + url); + + if (permitAllAnnotation != null) { + resource.setPermitAll(true); + } + + if (scopeAnnotation != null) { + resource.setUserScope(true); + } + + if (parentResource != null) { + resource.setParentId(parentResource.getId()); + } + + resources.add(resource); + } + } + } + } + + return resources; + } + + /** + * 判断资源元信息是否发生变更 + */ + private boolean isResourceChange(Resource newResource, Resource oldResource) { + if (newResource == null && oldResource == null) return true; + if (newResource == null || oldResource == null) return false; + + return !Objects.equals(newResource.getName(), oldResource.getName()) || + !Objects.equals(newResource.getParentId(), oldResource.getParentId()) || + !Objects.equals(newResource.getLabel(), oldResource.getLabel()) || + !Objects.equals(newResource.getMethod(), oldResource.getMethod()) || + !Objects.equals(newResource.getPermitAll(), oldResource.getPermitAll()) || + !Objects.equals(newResource.getUrl(), oldResource.getUrl()) || + !Objects.equals(newResource.getUserScope(), oldResource.getUserScope()); + } + + /** + * 获取接口的请求方法和URL + */ + private String getInterfaceMethods(Method method, List interfaceMethods) { + RequestMapping requestMapping = method.getDeclaredAnnotation(RequestMapping.class); + GetMapping getMapping = method.getDeclaredAnnotation(GetMapping.class); + PostMapping postMapping = method.getDeclaredAnnotation(PostMapping.class); + PutMapping putMapping = method.getDeclaredAnnotation(PutMapping.class); + DeleteMapping deleteMapping = method.getDeclaredAnnotation(DeleteMapping.class); + + String url = null; + + if (requestMapping != null) { + String[] urls = requestMapping.value(); + if (urls.length > 0) { + url = urls[0]; + } + + // 获取请求方法类型 + RequestMethod[] requestMethods = requestMapping.method(); + + if (requestMethods.length > 0) { + for (RequestMethod requestMethod : requestMethods) { + interfaceMethods.add(requestMethod.name()); + } + } + } else if (getMapping != null) { + String[] urls = getMapping.value(); + if (urls.length > 0) { + url = urls[0]; + } + interfaceMethods.add("GET"); + } else if (postMapping != null) { + String[] urls = postMapping.value(); + if (urls.length > 0) { + url = urls[0]; + } + interfaceMethods.add("POST"); + } else if (putMapping != null) { + String[] urls = putMapping.value(); + if (urls.length > 0) { + url = urls[0]; + } + interfaceMethods.add("PUT"); + } else if (deleteMapping != null) { + String[] urls = deleteMapping.value(); + if (urls.length > 0) { + url = urls[0]; + } + interfaceMethods.add("DELETE"); + } + + return url; + } + + /** + * 扫描指定包下的所有类 + * @return 类对象列表 + */ + private List> findClassLocal() { + ClassLoader classLoader = SystemService.class.getClassLoader();// 类加载器 + List> result = new ArrayList<>(); + + findClassLocalHelper(SCAN_PACKAGE, classLoader, result); + + return result; + } + + private void findClassLocalHelper(String packageName, ClassLoader classLoader, List> result) { + URI uri = null; + + try { + uri = Objects.requireNonNull(classLoader.getResource(packageName.replace(".", "/"))).toURI(); + } catch (URISyntaxException e) { + /*throw new BusinessException(CodeMsg.NOT_FOUND_EQUIPMENT);*/ + } + + File file = new File(uri); + file.listFiles(new FileFilter() { + @Override + public boolean accept(File pathname) { + if (pathname.isDirectory()) { + findClassLocalHelper(packageName + "." + pathname.getName(), classLoader, result); + } + + if (pathname.getName().endsWith(".class")) { + Class clazz = null; + + try { + clazz = classLoader.loadClass(packageName + "." + pathname.getName().replace(".class", "")); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + result.add(clazz); + + return true; + } + return false; + } + }); + } + + /** + * 获取资源列表 + */ + @Override + public ListResultVO getResourceList(Query query) { + Page pageRequest = query.toPageRequest(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page resourcePage = resourceMapper.selectPage(pageRequest, queryWrapper); + + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(resourcePage.getRecords()); + listResultVO.setTotal(resourcePage.getTotal()); + + return listResultVO; + } + + /** + * 获取资源树 + */ + @Override + public List getResourceTree() { + return resourceMapper.getResourceTree(); + } + + /** + * 获取角色能够访问的资源列表 + */ + @Override + public List getRoleResourceIds(Integer roleId) { + return resourceMapper.getRoleResourceIds(roleId); + } + + /** + * 获取多个角色能够访问的资源列表 + */ + @Override + public List getRolesResourceList(List roleNames) { + return resourceMapper.getRolesResourceUrls(roleNames); + } + + /** + * 获取不受限的接口 + */ + @Cacheable(cacheNames = "permitAllResourceList") + @Override + public List getPermitAllResourceList() { + return resourceMapper.getPermitAllResourceList(); + } + + /** + * 获取登录用户可访问的的接口 + */ + @Cacheable(cacheNames = "userScopeResourceList") + //@Override + public List getUserScopeResourceList() { + return resourceMapper.getUserScopeResourceList(); + } + + /** + * 获取不受限的URL + */ + @Cacheable(cacheNames = "permitAllResourceURLs") + @Override + public List getPermitAllResourceURLs() { + return resourceMapper.getPermitAllResourceURLs(); + } + + /** + * 获取登录用户可访问的 URL + */ + @Cacheable(cacheNames = "userScopeResourceURLs") + //@Override + public List getUserScopeResourceURLs() { + return resourceMapper.getUserScopeResourceURLs(); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/RoleMenuServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/RoleMenuServiceImpl.java new file mode 100644 index 0000000..aac46db --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/RoleMenuServiceImpl.java @@ -0,0 +1,70 @@ +package edu.ncst.carbon.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.system.RoleMenuMapper; +import edu.ncst.carbon.model.system.RoleMenu; +import edu.ncst.carbon.service.IRoleMenuService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 角色菜单 服务实现类 + */ +@Service +public class RoleMenuServiceImpl extends ServiceImpl implements IRoleMenuService { + + private final RoleMenuMapper roleMenuMapper; + + public RoleMenuServiceImpl(RoleMenuMapper roleMenuMapper) { + this.roleMenuMapper = roleMenuMapper; + } + + // 获取角色菜单列表 + @Override + public ListResultVO getRoleMenuList(Query query) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + Page page = roleMenuMapper.selectPage(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + + return listResultVO; + } + + + // 添加角色菜单 + @Transactional + @Override + public RoleMenu addRoleMenu(RoleMenu roleMenu) { + int insert = roleMenuMapper.insert(roleMenu); + if (insert == 1) { + return roleMenu; + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + + // 删除角色菜单 + @Transactional + @Override + public boolean deleteRoleMenu(Integer id) { + int delete = roleMenuMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/RoleServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/RoleServiceImpl.java new file mode 100644 index 0000000..b39722b --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/RoleServiceImpl.java @@ -0,0 +1,235 @@ +package edu.ncst.carbon.service.impl.system; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.system.MenuMapper; +import edu.ncst.carbon.mapper.system.RoleMapper; +import edu.ncst.carbon.mapper.system.RoleMenuMapper; +import edu.ncst.carbon.model.system.Role; +import edu.ncst.carbon.model.system.RoleMenu; +import edu.ncst.carbon.service.IRoleService; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.role.ModifyRoleInterfacePermissionDTO; +import edu.ncst.carbon.vo.role.ModifyRoleMenuPermissionDTO; +import edu.ncst.carbon.vo.role.RoleDetailVO; +import edu.ncst.carbon.vo.role.RoleShortItemVO; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 角色 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class RoleServiceImpl extends ServiceImpl implements IRoleService { + + private final RoleMapper roleMapper; + + private final RoleMenuMapper roleMenuMapper; + + private final MenuMapper menuMapper; + + + + // 获取角色列表 + @Override + public ListResultVO getRoleList(Query query) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + Page page = roleMapper.selectPage(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + + return listResultVO; + } + + // 选取角色列表 + @Override + public List selectRoleList() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("enable", true); + + List roleList = roleMapper.selectList(queryWrapper); + + return roleList.stream().map((roleItem) -> { + RoleShortItemVO roleShortItemDTO = new RoleShortItemVO(); + roleShortItemDTO.setId(roleItem.getId()); + roleShortItemDTO.setLabel(roleItem.getLabel()); + return roleShortItemDTO; + }).collect(Collectors.toList()); + } + + + + // 获取角色详情 + @Override + public RoleDetailVO getRoleDetail(Integer id) { + RoleDetailVO RoleDetailVO = new RoleDetailVO(); + Role role = roleMapper.selectById(id); + BeanUtils.copyProperties(role, RoleDetailVO); + + // 获取角色权限 + // RoleDetailVO.setAuthorityIds(getRoleAuthorityIds(role.getId())); + + return RoleDetailVO; + } + + + + + // 添加角色 + @Transactional + @Override + public RoleDetailVO addRole(RoleDetailVO addRoleDTO) { + // 添加角色 + Role newRole = new Role(); + BeanUtils.copyProperties(addRoleDTO, newRole); + newRole.setEnable(true); + + int insert = roleMapper.insert(newRole); + + if (insert != 1 || newRole.getId() == null) { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + + addRoleDTO.setId(newRole.getId()); +// // 为新角色添加默认权限:所有查看类型的接口 +// // log.info(resourceMapper.getAllResourceIds()); +// roleMapper.setDefaultResource(newRole.getId(),resourceMapper.getAllResourceIds()); + return addRoleDTO; + } + + // 修改角色 + @Transactional + @Override + public RoleDetailVO modifyRole(RoleDetailVO modifyRoleDTO) { + // 修改角色信息 + Role role = new Role(); + BeanUtils.copyProperties(modifyRoleDTO, role); + int update = roleMapper.updateById(role); + + // 返回修改结果 + if (update == 1) { + return getRoleDetail(role.getId()); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + /** + * 修改角色菜单权限 + * @param modifyDTO 修改表单 + */ + @Transactional + @Override + public void modifyRoleMenuPermission(ModifyRoleMenuPermissionDTO modifyDTO) { + List menuIds = modifyDTO.getMenuIds(); + Integer roleId = modifyDTO.getRoleId(); + + if (menuIds == null || menuIds.isEmpty()) { + return; + } + + // 删除已有的菜单关联 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("role_id", roleId); + roleMenuMapper.delete(queryWrapper); + List pids = menuMapper.getParentMenuid(menuIds); + if(pids!=null&&pids.size()>0){ + for (Integer pid : pids) { + if(!menuIds.contains(pid)){ + menuIds.add(pid); + } + } + } + // 重新插入 + roleMenuMapper.batchInsert(roleId, menuIds); + } + + /** + * 修改角色接口权限 + * @param modifyDTO 修改表单 + */ + @Override + public void modifyRoleInterfacePermission(ModifyRoleInterfacePermissionDTO modifyDTO) { + List interfaceIds = modifyDTO.getResourceIds(); + Integer roleId = modifyDTO.getRoleId(); + if (interfaceIds == null || interfaceIds.isEmpty()) { + return; + } +// roleResourceMapper.batchDelete(roleId); +// List permitAllRids = resourceMapper.getAllResourceIds(); +// for(Integer r:permitAllRids){ +// if(interfaceIds.contains(r)){ +// continue; +// } +// interfaceIds.add(r); +// } +// roleResourceMapper.batchInsert(roleId, interfaceIds); + } + + // 删除角色 + @Transactional + @Override + public boolean deleteRole(Integer id) { + + int count = roleMapper.getNumOfUserByRoleId(id); + if(count>0){ + throw new BusinessException(CodeMsg.DELETE_ERROR_RELATION_DATA); + } + + + int delete = roleMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } + + // 批量删除角色 + @Transactional + public boolean deleteRoles(List ids) { + int delete = roleMapper.deleteBatchIds(ids); + + if (delete == ids.size()) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } + + // 设置角色启用状态 + @Transactional + @Override + public boolean setRoleEnable(Integer id, Boolean enable) { + int update = roleMapper.setRoleEnable(id, enable); + + if (update == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.ENABLE_OR_DISABLE_ROLE_ERROR); + } + } + + + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/SystemService.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/SystemService.java new file mode 100644 index 0000000..cc80f4a --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/SystemService.java @@ -0,0 +1,15 @@ +package edu.ncst.carbon.service.impl.system; + +import edu.ncst.carbon.service.ISystemService; +import org.springframework.stereotype.Service; + +/** + * 系统核心服务 + */ +@Service +public class SystemService implements ISystemService { + + + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/UserServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/UserServiceImpl.java new file mode 100644 index 0000000..3e2b26a --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/system/UserServiceImpl.java @@ -0,0 +1,371 @@ +package edu.ncst.carbon.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.log.LogUserMapper; +import edu.ncst.carbon.mapper.system.UserMapper; +import edu.ncst.carbon.mapper.system.UserRoleMapper; +import edu.ncst.carbon.model.log.LogUser; +import edu.ncst.carbon.model.system.User; +import edu.ncst.carbon.model.system.UserRole; +import edu.ncst.carbon.service.IUserService; +import edu.ncst.carbon.utils.SessionUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.query.UserQuery; +import edu.ncst.carbon.vo.user.*; +import edu.ncst.carbon.vo.wechat.BindUserDTO; +import edu.ncst.carbon.vo.wechat.UserWeChatDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.DigestUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户 服务实现类 + */ +@Slf4j +@Service +public class UserServiceImpl extends ServiceImpl implements IUserService, UserDetailsService { + + + private final UserMapper userMapper; + + private final UserRoleMapper userRoleMapper; + + private final LogUserMapper logUserMapper; + + private final PasswordEncoder passwordEncoder; + @Autowired + private StringRedisTemplate stringRedisTemplate; + + //@Autowired + //private IAuthorizedService authorizedUnit; + + @Lazy + @Autowired + public UserServiceImpl(UserMapper userMapper, UserRoleMapper userRoleMapper, LogUserMapper logUserMapper, PasswordEncoder passwordEncoder) { + this.userMapper = userMapper; + this.userRoleMapper = userRoleMapper; + this.logUserMapper = logUserMapper; + this.passwordEncoder = passwordEncoder; + } + + // 获取用户列表 + @Override + public ListResultVO getUserList(UserQuery query) { + // 查询数据 + + /* + // 数据权限控制:只允许用户访问所在单位分支下的单位数据 + Set allowUnitIds = authorizedUnit.getAllowUnitIds(query.getUnitId()); + log.debug("allowUnitIds:" + allowUnitIds); + + if (allowUnitIds == null) { + throw new BusinessException(CodeMsg.CAN_NOT_DATA_ACCESS); + } + */ + + QueryWrapper queryWrapper = new QueryWrapper<>(); + //如果query.getRoleIds() 在"sur.role_id" 里面 + queryWrapper.in(query.getRoleIds()!=null&&query.getRoleIds().length>0,"sur.role_id",query.getRoleIds()); + //如果query.getPhone() 和"su.phone_number" 相等 + queryWrapper.eq(query.getPhone()!=null,"su.phone_number",query.getPhone()); + queryWrapper.like(query.getUserName()!=null,"su.username",query.getUserName()); + queryWrapper.like(query.getEmail()!=null,"su.email",query.getEmail()); + queryWrapper.like(query.getFullName()!=null,"su.fullName",query.getFullName()); + + Page pageRequest = query.toPageRequest(); + + Page page = userMapper.getUserPage(pageRequest,queryWrapper); + + ListResultVO listResultVO = new ListResultVO<>(); + if(page==null||page.getRecords()==null||page.getRecords().size()==0){ + return listResultVO; + } + queryWrapper = new QueryWrapper<>(); + queryWrapper.in("su.id",page.getRecords()); + + List records = userMapper.getUserList(queryWrapper); + // 封装返回结果 + listResultVO.setList(records); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + + return listResultVO; + } + + // 获取选取用户列表 + // TODO: 过滤掉超级管理员 + @Override + public List selectUserList(String keyword) { + //Set unitIds = authorizedUnit.getAllowUnitIds(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + //queryWrapper.in("unit_id", unitIds); + + if (keyword != null) { + queryWrapper.like("username", keyword) + .or().like("full_name", keyword); + } + + List users = userMapper.selectList(queryWrapper); + List userItemVOS = new ArrayList<>(); + + if (users != null) { + userItemVOS = users.stream().map((user) -> { + UserItemVO userItemVO = new UserItemVO(); + BeanUtils.copyProperties(user, userItemVO); + return userItemVO; + }).collect(Collectors.toList()); + } + + return userItemVOS; + } + + // 获取用户详情(编辑用户使用) + @Override + public UserInfoVO getUserDetail(Integer id) { + User userDetail = userMapper.getUserDetail(id); + UserInfoVO UserInfoVO = new UserInfoVO(); + BeanUtils.copyProperties(userDetail, UserInfoVO); + + return UserInfoVO; + } + + // 获取用户对象(提供给系统内部使用) + public User getUser(Integer userId) { + return userMapper.getUserDetail(userId); + } + + // 添加用户 + @Transactional + @Override + public UserInfoVO addUser(AddUserDTO addUserDTO) { + // 添加用户信息 + User user = new User(); + + // 复制属性 + BeanUtils.copyProperties(addUserDTO, user); + user.setPassword(passwordEncoder.encode(addUserDTO.getPassword())); // 对密码进行二次加密 + user.setEnable(true); + // insert 插入 + int insert = userMapper.insert(user); + + // 添加用户角色信息 + List roleIds = addUserDTO.getRoles(); + if (roleIds != null && !roleIds.isEmpty()) { + for (Integer roleId : roleIds) { + UserRole userRole = new UserRole(); + userRole.setUserId(user.getId()); + userRole.setRoleId(roleId); + userRoleMapper.insert(userRole); + } + } else { + throw new RuntimeException("角色列表不能为空"); + } + // 返回结果 + UserInfoVO result = getUserDetail(user.getId()); + + if (insert == 1) { + return result; + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改用户 + @Transactional + @Override + public UserInfoVO modifyUser(UpdateUserDTO updateUserDTO) { + // 获取已有用户信息 + User user = userMapper.selectById(updateUserDTO.getId()); + + if (user == null) { + throw new BusinessException(CodeMsg.USER_NOT_FOUND); + } + + // 更新用户信息 + BeanUtils.copyProperties(updateUserDTO, user); + int update = userMapper.updateById(user); + + // 删除之前的用户角色 + QueryWrapper deleteWhere = new QueryWrapper<>(); + deleteWhere.eq("user_id", updateUserDTO.getId()); + userRoleMapper.delete(deleteWhere); + + // 添加新的用户角色 + if (updateUserDTO.getRoles() != null) { + for (Integer roleId : updateUserDTO.getRoles()) { + userRoleMapper.insert(new UserRole(updateUserDTO.getId(), roleId)); + } + } + + // 返回结果 + if (update == 1) { + UserInfoVO UserInfoVO = new UserInfoVO(); + BeanUtils.copyProperties(user, UserInfoVO); + return UserInfoVO; + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + // 删除用户 + @Transactional + @Override + public boolean deleteUser(Integer id) { + int delete = userMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } + + // 设置用户启用状态 + @Override + public boolean setUserEnable(Integer userId, Boolean enable) { + int update = userMapper.setUserEnable(userId, enable); + + if (update == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.ENABLE_OR_DISABLE_ROLE_ERROR); + } + } + + // 通过用户名获取用户信息 + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userMapper.getUserByAccount(username); + + if (user == null) { + throw new BusinessException(CodeMsg.USER_NOT_FOUND); + } + + return user; + } + + // 通过 OpenID 获取用户信息 + @Override + public UserDetails loadUserByOpenId(String openId) { + User user = userMapper.getUserByOpenId(openId); + + return user; + } + + + // 注册新用户 + @Override + public User registerByWechat(String openId){ + log.info("注册新用户:" + openId); + User user = new User(); + user.setOpenId(openId); + user.setUsername("游客" + userMapper.selectCount(null).toString() ); + user.setEnable(false); + user.setPassword(DigestUtils.md5DigestAsHex("123456ncstslat".getBytes())); + UserWeChatDTO userWeChatDTO = new UserWeChatDTO(); + int insert = userMapper.insert(user); + + User userWechat = userMapper.getUserByOpenId(openId); + + + UserRole userRole = new UserRole(); + userRole.setUserId(userWechat.getId()); + userRole.setRoleId(29); // 73为游客权限;29为超级管理员 + userRoleMapper.insert(userRole); + + LogUser logUser = new LogUser(); + logUser.setUserId(userWechat.getId()); + logUserMapper.insert(logUser); + + if (insert == 1) { + return userWechat; + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + + } + + // 用户绑定微信 + @Transactional + @Override + public void bindWeChat(BindUserDTO bindUserDTO) { + log.info("绑定新用户" ); + UserInfoVO currentUser = SessionUtils.getCurrentUser(); + User user = userMapper.getUserDetail(currentUser.getId()); + if(user==null || user.getOpenId().isEmpty() ){ + throw new BusinessException(CodeMsg.USER_NEED_LOGIN.fillArgs("当前用户未登录,请重新登录。")); + } + try{ + String openId = stringRedisTemplate.opsForValue().get("user_openid:"+currentUser.getUsername()); + if (openId == null || "".equals(openId)) { + throw new BusinessException(CodeMsg.CAN_NOT_GET_OPEN_ID); + } + + user = userMapper.getUserByOpenId(openId); + BeanUtils.copyProperties(bindUserDTO , user); + user.setUsername(bindUserDTO.getNickName()); + user.setEnable(true); + int update = userMapper.updateById(user); + + if (update != 1) { + stringRedisTemplate.delete("user_openid:"+currentUser.getUsername()); + stringRedisTemplate.opsForValue().set("user_openid:"+ user.getUsername(), user.getOpenId()); + throw new BusinessException(CodeMsg.BIND_USER_FAIL); + }}catch(Exception e){ + stringRedisTemplate.delete("user_openid:"+currentUser.getUsername()); + throw e; + + } + + } + + +// @Override +// public UserWeChat register(String openId) { +// UserWeChat user = registerByWechat(openId); +// return userRepository.saveAndFlush(user); +// } + + // 修改用户密码 + @Transactional + @Override + public UserInfoVO resetUserPassword(ResetUserPasswordDTO resetUserPasswordDTO) { + // 获取已有用户信息 + User user = userMapper.selectById(resetUserPasswordDTO.getId()); + + if (user == null) { + throw new BusinessException(CodeMsg.USER_NOT_FOUND); + } + + // 更新密码 + user.setPassword(passwordEncoder.encode(resetUserPasswordDTO.getPassword())); + + int reset = userMapper.updateById(user); + + if (reset == 1) { + UserInfoVO UserInfoVO = new UserInfoVO(); + BeanUtils.copyProperties(user, UserInfoVO); + return UserInfoVO; + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/task/TaskAuditServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/task/TaskAuditServiceImpl.java new file mode 100644 index 0000000..4e2fad1 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/task/TaskAuditServiceImpl.java @@ -0,0 +1,271 @@ +package edu.ncst.carbon.service.impl.task; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.carbon.CarbonFormulaMapper; +import edu.ncst.carbon.mapper.image.ImageMapper; +import edu.ncst.carbon.mapper.log.LogUserFootprintMapper; +import edu.ncst.carbon.mapper.log.LogUserMapper; +import edu.ncst.carbon.mapper.task.TaskAuditMapper; +import edu.ncst.carbon.mapper.task.TaskMapper; +import edu.ncst.carbon.model.carbon.CarFormula; +import edu.ncst.carbon.model.image.Image; +import edu.ncst.carbon.model.log.LogUser; +import edu.ncst.carbon.model.log.LogUserFootprint; +import edu.ncst.carbon.model.task.Task; +import edu.ncst.carbon.model.task.TaskAudit; +import edu.ncst.carbon.service.IImageService; +import edu.ncst.carbon.service.ITaskAuditService; +import edu.ncst.carbon.service.impl.image.ImageServiceImpl; +import edu.ncst.carbon.utils.ImageUtils; +import edu.ncst.carbon.utils.SessionUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.user.UserInfoVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.FileNotFoundException; +import java.util.Date; +import java.util.List; + +/** + * 任务审核 服务实现类 + */ +@Service +@Slf4j +public class TaskAuditServiceImpl extends ServiceImpl implements ITaskAuditService { + + + @Autowired + private ImageServiceImpl imageService; + + private final ImageMapper imageMapper; + private final TaskMapper taskMapper; + private final TaskAuditMapper taskAuditMapper; + private final CarbonFormulaMapper carbonFormulaMapper; + private final LogUserFootprintMapper logUserFootprintMapper; + private final LogUserMapper logUserMapper; + + public TaskAuditServiceImpl( ImageMapper imageMapper, TaskMapper taskMapper, TaskAuditMapper taskAuditMapper, CarbonFormulaMapper carbonFormulaMapper, LogUserFootprintMapper logUserFootprintMapper, LogUserMapper logUserMapper) { + this.imageMapper = imageMapper; + this.taskMapper = taskMapper; + this.taskAuditMapper = taskAuditMapper; + this.carbonFormulaMapper = carbonFormulaMapper; + this.logUserFootprintMapper = logUserFootprintMapper; + this.logUserMapper = logUserMapper; + } + + // 获取任务审核列表(普通列表结构) + @Override + public ListResultVO getTaskAuditList(Query query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = taskAuditMapper.selectPage(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + } + + // 获取任务审核详情 + @Override + @Cacheable(cacheNames="TaskAudit", key="#id", condition="#id > 0") + public TaskAudit getTaskAuditDetail(Integer id) { + + TaskAudit TaskAudit = taskAuditMapper.selectById(id); + + if (TaskAudit == null) { + throw new BusinessException(CodeMsg.FETCH_ERROR); + } + + return TaskAudit; + } + + // 添加任务审核 + @Transactional + @Override + @CachePut(value = {"TaskAudit"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "TaskAudit:list", "TaskAudit:options" }, allEntries = true + ) + public TaskAudit addTaskAudit(TaskAudit TaskAudit){ + int insert = taskAuditMapper.insert(TaskAudit); + int a= insert; + if (insert == 1) { + return getTaskAuditDetail(TaskAudit.getId()); + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改任务审核 + @Transactional + @Override + @CachePut(value = {"TaskAudit"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "TaskAudit:list", "TaskAudit:options" }, allEntries = true + ) + public TaskAudit modifyTaskAudit(TaskAudit taskAudit) { + Integer taskAuditId = taskAudit.getId(); + if (taskAuditId == null) { + throw new BusinessException(CodeMsg.FORM_ERROR); + } + // 更新碳公式分类信息 + int update = taskAuditMapper.updateById(taskAudit); + + + if (update == 1) { + return getTaskAuditDetail(taskAuditId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + //删除任务审核 + @Transactional + @Override + @Caching( + evict = { + @CacheEvict(value = "TaskAudit", key = "#id"), + @CacheEvict(cacheNames = { "TaskAudit:list", "TaskAudit:options" }, allEntries = true) + } + ) + public boolean deleteTaskAudit(Integer id) { + TaskAudit TaskAudit = taskAuditMapper.selectById(id); + if( TaskAudit==null){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + int delete = taskAuditMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } + + + + public void uploadAudit(MultipartFile uploadFile, HttpServletRequest request, String text, Integer taskId, Integer integral) + throws FileNotFoundException { + + // 上传图片 + Task task = taskMapper.getTaskDetail(taskId); + UserInfoVO currentUser = SessionUtils.getCurrentUser(); + String newName = task.getName() + currentUser.getUsername(); + + String uploadImageName = imageService.uploadImage(uploadFile, request, newName); + + // 上传记录 + if(uploadImageName == null && uploadImageName.equals("上传失败")){ + throw new BusinessException(CodeMsg.UPLOAD_ERROR); + }else{ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("img_name", uploadImageName); + List auditImage = imageMapper.selectList(queryWrapper); + + TaskAudit taskAudit = new TaskAudit(); + taskAudit.setImageId(auditImage.get(0).getId()); + taskAudit.setCreateUserId(currentUser.getId()); + Date date = new Date(System.currentTimeMillis()); + taskAudit.setAuditTime(date); + taskAudit.setText(text); + taskAudit.setStatus("1"); + taskAudit.setIntegral(integral); + + CarFormula carFormula = carbonFormulaMapper.selectById(task.getCarbonFormulaId()); + taskAudit.setEmission(integral*carFormula.getEmission()); + taskAuditMapper.insert(taskAudit); + } + +// // 上传用户日志 +// LogUserFootprint logUserFootprint = new LogUserFootprint(); +// logUserFootprint.setUserId(currentUser.getId()); +// logUserFootprint.setFormulaId(task.getCarbonFormulaId()); +// logUserFootprint.setTaskId(taskId); +// +// +// logUserFootprintMapper.insert(logUserFootprint); +// +// // 上传用户当前信息 +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("user_id", currentUser.getId()); +// LogUser logUser = logUserMapper.selectList(queryWrapper).get(0); +// +// logUser.setAuditingTaskTotal( logUser.getAuditingTaskTotal() +1); +// +// UpdateWrapper updateWrapper = new UpdateWrapper<>(); +// queryWrapper.eq("user_id", currentUser.getId()); +// logUserMapper.update(logUser, updateWrapper); + } + + public TaskAudit audit(Integer taskAuditId, Boolean yesNo){ + TaskAudit taskAudit = taskAuditMapper.selectById(taskAuditId); + if(yesNo){ + taskAudit.setStatus("2"); + }else { + taskAudit.setStatus("3"); + } + + // 更新任务状态 + taskAudit.setAuditUserId(SessionUtils.getCurrentUser().getId()); + Date date = new Date(System.currentTimeMillis()); + taskAudit.setAuditTime(date); + + int update = taskAuditMapper.updateById(taskAudit); + + if (update == 1) { + return getTaskAuditDetail(taskAuditId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + + public TaskAudit confirmAudit(@RequestParam Integer taskAuditId){ + TaskAudit taskAudit = taskAuditMapper.selectById(taskAuditId); + taskAudit.setStatus("0"); + taskAuditMapper.updateById(taskAudit); + + // 上传用户当前信息 + UserInfoVO currentUser = SessionUtils.getCurrentUser(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", currentUser.getId()); + LogUser logUser = logUserMapper.selectList(queryWrapper).get(0); + + logUser.setIntegralTotal( logUser.getIntegralTotal() + taskAudit.getIntegral()); + logUser.setEmissionTotal( logUser.getEmissionTotal() + taskAudit.getEmission()); + logUser.setAuditingTaskTotal( logUser.getAuditingTaskTotal() -1); + + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + queryWrapper.eq("user_id", currentUser.getId()); + int update = logUserMapper.update(logUser, updateWrapper); + + + return taskAudit; + + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/task/TaskServiceImpl.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/task/TaskServiceImpl.java new file mode 100644 index 0000000..e125e20 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/service/impl/task/TaskServiceImpl.java @@ -0,0 +1,260 @@ +package edu.ncst.carbon.service.impl.task; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.mapper.task.TaskMapper; +import edu.ncst.carbon.model.system.User; +import edu.ncst.carbon.model.task.Task; +import edu.ncst.carbon.service.ITaskService; +import edu.ncst.carbon.utils.CalendarUtil; +import edu.ncst.carbon.utils.SessionUtils; +import edu.ncst.carbon.utils.WeChatUtils; +import edu.ncst.carbon.vo.ListResultVO; +import edu.ncst.carbon.vo.Query; +import edu.ncst.carbon.vo.user.UserInfoVO; +import edu.ncst.carbon.vo.wechat.SportData; +import edu.ncst.carbon.vo.wechat.SportDay; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.util.DateUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 低碳任务 服务实现类 + */ +@Service +@Slf4j +public class TaskServiceImpl extends ServiceImpl implements ITaskService { + + private final TaskMapper taskMapper; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + public TaskServiceImpl(TaskMapper taskMapper) { + this.taskMapper = taskMapper; + } + + // 获取碳公式列表(普通列表结构) + @Override + public ListResultVO getTaskList(Query query){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + Page pageRequest = query.toPageRequest(); + + Page page = taskMapper.getTaskList(pageRequest, queryWrapper); + + // 封装返回结果 + ListResultVO listResultVO = new ListResultVO<>(); + listResultVO.setList(page.getRecords()); + listResultVO.setTotal(page.getTotal()); + listResultVO.setCurrent(page.getCurrent()); + listResultVO.setPageSize(page.getSize()); + + return listResultVO; + } + + // 获取碳公式详情 + @Override + @Cacheable(cacheNames="Task", key="#id", condition="#id > 0") + public Task getTaskDetail(Integer id) { + + Task Task = taskMapper.getTaskDetail(id); + + if (Task == null) { + throw new BusinessException(CodeMsg.FETCH_ERROR); + } + + return Task; + } + + // 添加碳公式 + @Transactional + @Override + @CachePut(value = {"Task"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "Task:list", "Task:options" }, allEntries = true + ) + public Task addTask(Task Task){ + int insert = taskMapper.insert(Task); + if (insert == 1) { + + return getTaskDetail(Task.getId()); + } else { + throw new BusinessException(CodeMsg.ADD_ERROR); + } + } + + // 修改碳公式 + @Transactional + @Override + @CachePut(value = {"Task"}, key = "#p0.id") + @CacheEvict( + cacheNames = { "Task:list", "Task:options" }, allEntries = true + ) + public Task modifyTask(Task Task) { + Integer TaskId = Task.getId(); + if (TaskId == null) { + throw new BusinessException(CodeMsg.FORM_ERROR); + } + // 更新碳公式分类信息 + int update = taskMapper.updateById(Task); + + + if (update == 1) { + return getTaskDetail(TaskId); + } else { + throw new BusinessException(CodeMsg.MODIFY_ERROR); + } + } + + //删除碳公式 + @Transactional + @Override + @Caching( + evict = { + @CacheEvict(value = "Task", key = "#id"), + @CacheEvict(cacheNames = { "Task:list", "Task:options" }, allEntries = true) + } + ) + public boolean deleteTask(Integer id) { + Task Task = taskMapper.selectById(id); + if( Task==null){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + int delete = taskMapper.deleteById(id); + + if (delete == 1) { + return true; + } else { + throw new BusinessException(CodeMsg.DELETE_ERROR); + } + } + + public SportData encryptWeRunData(String encryptedData, String iv){ + if(!StringUtils.hasText(encryptedData)||!StringUtils.hasText(iv)){ + throw new BusinessException(CodeMsg.FORM_ERROR); + } + + UserInfoVO currentUser = SessionUtils.getCurrentUser(); +// User user = userMapper.getUserDetail(currentUser.getId()); + + String sessionkey = stringRedisTemplate.opsForValue().get("session_key:"+ currentUser.getOpenId()); + + // 通过解密,获取到微信步数列表 + JSONObject encryptSteplist = WeChatUtils.decrypt(encryptedData, sessionkey, iv); + + JSONArray steplist = encryptSteplist.getJSONArray("stepInfoList"); + + // 运动数据 + SportData sportData = new SportData(); + if(steplist != null){ + JSONObject stepObj = (JSONObject)steplist.get(steplist.size()-1); + if(stepObj.containsKey("step")){ + //获取今日步数 + Integer step = stepObj.getIntValue("step"); + sportData.setStep(step); + } + + Integer nowMonth = CalendarUtil.getMonth();//当前月 + + // 用户每日步数列表 + List stepList = new ArrayList(); + + for(Object item : steplist) { + JSONObject tmpStepObj = (JSONObject) item; + Long timestamp = tmpStepObj.getLong("timestamp"); + Date tmpDate = new Date(timestamp * 1000); + Integer tm = CalendarUtil.getMonth(tmpDate); + Integer td = CalendarUtil.getDate(tmpDate); + Integer tmpStep = tmpStepObj.getInteger("step"); + stepList.add(new SportDay(CalendarUtil.getYear(tmpDate), tm, td, tmpStep)); + sportData.setStepList(stepList); + } + } + return sportData; + } + + /** + * 封装查询对象 + * + * @param query 传入 TaskQuery 对象 + * @return QueryWrapper + */ + + /** + * 获取碳公式列表 + * + * @param query 传入 TaskQuery 对象 + * @return 碳公式列表 + */ + + /** + * 获取碳公式列表(不分页) + * + * @param query 传入 TaskQuery 对象 + * @return 碳公式列表 + */ + + /** + * 获取碳公式详情 + * + * @param id 碳公式 ID + * @return 碳公式信息 + */ + + /** + * 添加碳公式 + * + * @param Task 碳公式信息 + */ + + /** + * 删除碳公式 + * + * @param id 待删除碳公式ID + * @return 是否删除成功 + */ + + /** + * 获取已启用的碳公式 + * + * @param paramMap 查询条件 + * @return 碳公式信息 + */ + + /** + * 根据碳公式名称获取碳公式信息 + * 【注意】:需要保证同一使用单位下的碳公式不能重名 + * FIXME: 添加同一单位下的重名碳公式进行测试 + * @param name 碳公式名称 + * @return 碳公式信息 + */ + + /** + * 批量导入 + * + * @param list 碳公式信息列表 + * @param recordID 导入记录 ID + * @param fatherEqu + * @return 导入结果 + */ + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CalendarUtil.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CalendarUtil.java new file mode 100644 index 0000000..2d89fe7 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CalendarUtil.java @@ -0,0 +1,498 @@ +package edu.ncst.carbon.utils; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 日期工具类 + */ +public class CalendarUtil { + + public static final String YEAR = "year"; + public static final String MONTH = "month"; + public static final String MONTH_FIRST_DAY_TIME = "month_first_day_time"; + public static final String MONTH_LAST_DAY_TIME = "month_last_day_time"; + + //获取当前年的前5年数据 + public static List getPre5Years(){ + List years = new ArrayList(); + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + for(int i = 0; i < 5; i++){ + years.add((year - i) + ""); + } + return years; + } + + //获取12个月的数据 + public static List get12MonthStr(){ + List months = new ArrayList(); + for(int i = 1 ;i < 13 ;i++){ + months.add(i+""); + } + return months; + } + + //获取当前明天的数据 + public static String getNextDay(String format){ + Calendar calendar = Calendar.getInstance(); + Calendar tmpCalendar = Calendar.getInstance(); + tmpCalendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期 + int maxDate = tmpCalendar.get(Calendar.DATE); + + int month = calendar.get(Calendar.MONTH); + int year = calendar.get(Calendar.YEAR); + int date = calendar.get(Calendar.DATE); + + if(date + 1 > maxDate ){ + if(month + 1 > 11){ + calendar.add(Calendar.YEAR, 1); + calendar.set(Calendar.MONTH, 0); + calendar.set(Calendar.DATE, 1); + }else{ + calendar.set(year, month, date+1); + } + }else{ + calendar.set(year, month, date+1); + } + return DateUtil.getDateText(calendar.getTime(), format); + } + + //获取n天后的日期 + public static Date getNextNDay(Date startTime,Integer n){ + Calendar start = Calendar.getInstance(); + start.setTime(startTime); + start.add(Calendar.DATE, n); + return start.getTime(); + } + + //获取n天后的日期 00:00:00 + public static Date getNextNDayBegin(Date startTime,Integer n){ + Calendar start = Calendar.getInstance(); + start.setTime(startTime); + start.add(Calendar.DATE, n); + start.set(Calendar.HOUR_OF_DAY, 0); + start.set(Calendar.MINUTE, 0); + start.set(Calendar.SECOND, 0); + return start.getTime(); + } + + //获取n天后的日期 23:59:59 + public static Date getNextNDayEnd(Date startTime,Integer n){ + Calendar start = Calendar.getInstance(); + start.setTime(startTime); + start.add(Calendar.DATE, n); + start.set(Calendar.HOUR_OF_DAY, 23); + start.set(Calendar.MINUTE, 59); + start.set(Calendar.SECOND, 59); + return start.getTime(); + } + + //获取n天前的日期 + public static Date getPreNDay(Date startTime,Integer n){ + Calendar start = Calendar.getInstance(); + start.setTime(startTime); + start.add(Calendar.DATE, -n); + return start.getTime(); + } + + //获取n天前的日期 00:00:00 + public static Date getPreNDayBegin(Date startTime,Integer n){ + Calendar start = Calendar.getInstance(); + start.setTime(startTime); + start.add(Calendar.DATE, -n); + start.set(Calendar.HOUR_OF_DAY, 0); + start.set(Calendar.MINUTE, 0); + start.set(Calendar.SECOND, 0); + return start.getTime(); + } + + //获取n天前的日期 23:59:59 + public static Date getPreNDayEnd(Date startTime,Integer n){ + Calendar start = Calendar.getInstance(); + start.setTime(startTime); + start.add(Calendar.DATE, -n); + start.set(Calendar.HOUR_OF_DAY, 23); + start.set(Calendar.MINUTE, 59); + start.set(Calendar.SECOND, 59); + return start.getTime(); + } + + //获取前x天的数据, x < 10; + public static String getPreXDay(int x ,String format){ + Calendar calendar = Calendar.getInstance(); + int month = calendar.get(Calendar.MONTH); + int year = calendar.get(Calendar.YEAR); + int date = calendar.get(Calendar.DATE); + + if(date - x < 0 ){ + if(month - 1 < 0){ + calendar.add(Calendar.YEAR, -1); + calendar.set(Calendar.MONTH, 11); + calendar.set(Calendar.DATE, 31 - (x-date)); + }else{ + calendar.add(Calendar.MONTH, -1); + calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期 + int maxDate = calendar.get(Calendar.DATE); + calendar.set(year, month - 1, maxDate - (x-date)); + } + }else{ + calendar.set(year, month, date - x); + } + return DateUtil.getDateText(calendar.getTime(), format); + } + + //获取当前年 + public static Integer getYear(){ + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + return year; + } + + //获取当前月 + public static Integer getMonth(){ + Calendar calendar = Calendar.getInstance(); + int month = calendar.get(Calendar.MONTH); + month = month + 1; + if(month > 12){ + return 12; + } + return month; + } + + //获取当前日 + public static Integer getDate(){ + Calendar calendar = Calendar.getInstance(); + int date = calendar.get(Calendar.DATE); + return date; + } + + //获取当前年 + public static Integer getYear(Date date){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int year = calendar.get(Calendar.YEAR); + return year; + } + + //获取当前月 + public static Integer getMonth(Date date){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int month = calendar.get(Calendar.MONTH); + month = month + 1; + if(month > 12){ + return 12; + } + return month; + } + + //获取当前日 + public static Integer getDate(Date date){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int d = calendar.get(Calendar.DATE); + return d; + } + + //获取 年-月的 第一天 和 最后一天 时间 + public static Map getMonthFirstEndDayTime(String year,String month){ + Map rst = new HashMap(); + Calendar calendar = Calendar.getInstance(); + int m = Integer.parseInt(month); + m = m - 1; + if(m < 0){ + m = 0; + } + calendar.set(Integer.parseInt(year), m, 1); + String firstDayTime = DateUtil.COMMON.getDateText(calendar.getTime()) +" 00:00:00"; + + calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期 + String lastDayTime = DateUtil.COMMON.getDateText(calendar.getTime()) +" 23:59:59"; + + rst.put(CalendarUtil.MONTH_FIRST_DAY_TIME, firstDayTime); + rst.put(CalendarUtil.MONTH_LAST_DAY_TIME, lastDayTime); + + return rst; + } + + //获取前一个月 + public static Map getPreMonth(){ + Map rst = new HashMap(); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.MONTH, -1); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH); + month = month + 1; + + rst.put("year", year+""); + if(month > 12){ + rst.put("month", "12"); + }else{ + rst.put("month", month+""); + } + return rst; + } + + //获取前一个月 + public static Map getPreMonth(Integer year,Integer month){ + Map rst = new HashMap(); + if(month == 1){ + rst.put("year", (year-1)+""); + rst.put("month", "12"); + }else{ + rst.put("year", year+""); + rst.put("month", (month-1)+""); + } + return rst; + } + + //获取开始月份和结束月份中间的所有月份,包括开始月份和结束月份 + public static List getBetweenMonths(String startMonth ,String endMonth){ + String[] startArr = startMonth.split("-"); + String[] endArr = endMonth.split("-"); + + Integer startY = Integer.parseInt(startArr[0]); + Integer startM = Integer.parseInt(startArr[1]); + + Integer endY = Integer.parseInt(endArr[0]); + Integer endM = Integer.parseInt(endArr[1]); + + Calendar startCalendar = Calendar.getInstance(); + startCalendar.set(startY, startM - 1, 1, 0, 0); + + Calendar endCalendar = Calendar.getInstance(); + endCalendar.set(endY, endM - 1, 1, 0, 0); + + List months = new ArrayList(); + while(startCalendar.getTimeInMillis() <= endCalendar.getTimeInMillis()){ + months.add(DateUtil.getDateText(startCalendar.getTime(),"yyyy-MM")); + startCalendar.add(Calendar.MONTH, 1); + } + return months; + } + + //获取日期之间的天List formt = "yyyy-MM-dd" + public static List getBetweenDateStr(String startTime,String endTime){ + List dateList = new ArrayList(); + try { + Long startM = DateUtil.COMMON.getTextDate(startTime).getTime(); + Long endM = DateUtil.COMMON.getTextDate(endTime).getTime(); + long result = (endM-startM) / (24 * 60 * 60*1000); + String[] startTimeStr = startTime.split("-"); + Calendar startCalendar = Calendar.getInstance(); + startCalendar.set(Integer.parseInt(startTimeStr[0]), Integer.parseInt(startTimeStr[1]) - 1, Integer.parseInt(startTimeStr[2])); + startCalendar.add(Calendar.DATE,-1); + for(int i = 0; i <= result ; i++){ + startCalendar.add(Calendar.DATE,1); + dateList.add(DateUtil.COMMON.getDateText(startCalendar.getTime())); + } + } catch (ParseException e) { + e.printStackTrace(); + } + return dateList; + } + + public static List getBetweenDateStr(String startTime,String endTime,String format){ + List dateList = new ArrayList(); + try { + Long startM = DateUtil.COMMON.getTextDate(startTime).getTime(); + Long endM = DateUtil.COMMON.getTextDate(endTime).getTime(); + long result = (endM-startM) / (24 * 60 * 60*1000); + String[] startTimeStr = startTime.split("-"); + Calendar startCalendar = Calendar.getInstance(); + startCalendar.set(Integer.parseInt(startTimeStr[0]), Integer.parseInt(startTimeStr[1]) - 1, Integer.parseInt(startTimeStr[2])); + startCalendar.add(Calendar.DATE,-1); + for(int i = 0; i <= result ; i++){ + startCalendar.add(Calendar.DATE,1); + dateList.add(DateUtil.getDateText(startCalendar.getTime(),format)); + } + } catch (ParseException e) { + e.printStackTrace(); + } + return dateList; + } + + //获取日期的前n个月的月份(闭区间) + public static List getPreNMonths(String curMonth ,Integer n){ + String[] curArr = curMonth.split("-"); + Integer curY = Integer.parseInt(curArr[0]); + Integer curM = Integer.parseInt(curArr[1]); + + Calendar curCalendar = Calendar.getInstance(); + curCalendar.set(curY, curM - 1, 1, 0, 0); + + Calendar tmpCalendar = Calendar.getInstance(); + tmpCalendar.set(curY, curM - 1 - n, 1, 0, 0); + + List months = new ArrayList(); + while(tmpCalendar.getTimeInMillis() <= curCalendar.getTimeInMillis()){ + months.add(DateUtil.getDateText(tmpCalendar.getTime(),"yyyy-MM")); + tmpCalendar.add(Calendar.MONTH, 1); + } + return months; + } + + //获取当前天 + public static String getToday(String format){ + Calendar calendar = Calendar.getInstance(); + return DateUtil.getDateText(calendar.getTime(), format); + } + + //获取当前月的第一天 + public static String getFirstDay(String format){ + Calendar calendar = Calendar.getInstance(); + int month = calendar.get(Calendar.MONTH); + int year = calendar.get(Calendar.YEAR); + calendar.set(year, month, 1); + return DateUtil.getDateText(calendar.getTime(), format); + } + + //获取当前月的最后一天 + public static String getLastDay(String format){ + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期 + return DateUtil.getDateText(calendar.getTime(), format); + } + + //获取当前月的第一天 + public static Date getFirstDate(){ + Calendar calendar = Calendar.getInstance(); + int month = calendar.get(Calendar.MONTH); + int year = calendar.get(Calendar.YEAR); + calendar.set(year, month, 1); + return calendar.getTime(); + } + + //获取当前月的最后一天 + public static Date getLastDate(){ + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期 + return calendar.getTime(); + } + + + //日期的天是否一样; + public static boolean isDayEqual(Date date1,Date date2){ + if(date1==null || date2 == null){ + return false; + } + String date1Str = DateUtil.COMPAT.getDateText(date1); + String date2Str = DateUtil.COMPAT.getDateText(date2); + return date1Str.equals(date2Str); + } + + /** + * 时间间距是否为xx; + * 如果在 space 之内返回true;否则返回false + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param space 毫秒 + * @return + */ + public static boolean isTimeSpace(Date startTime,Date endTime,long space){ + if (startTime == null || endTime == null) { + return false; + } + return endTime.getTime() - startTime.getTime() <= space; + } + + /** + * 时间间距是否在 startSpace 和 endSpace 之间 + * @param startTime + * @param endTime + * @param startSpace + * @param endSpace + * @return + */ + public static boolean isTimeBetween(Date startTime,Date endTime,long startSpace,long endSpace){ + return endTime.getTime() - startTime.getTime() <= endSpace && + endTime.getTime() - startTime.getTime() >= startSpace; + } + + public static boolean isTimeBetween(Date time,Date startTime,Date endTime){ + return time.getTime() >= startTime.getTime() && time.getTime() <= endTime.getTime(); + } + + //获取日期之间年的距离 + public static Integer getYearSpace(Date startTime,Date endTime){ + Calendar start = Calendar.getInstance(); + start.setTime(startTime); + Calendar end = Calendar.getInstance(); + end.setTime(endTime); + return end.get(Calendar.YEAR) - start.get(Calendar.YEAR); + } + + //获取日期之间天的距离 + public static Integer getDaySpace(Date startTime,Date endTime){ + return (int)(endTime.getTime() - startTime.getTime())/(24*60*60*1000); + } + + //获取当前日期 毫秒 + public static long getTimeInMillis(){ + Calendar now = Calendar.getInstance(); + return now.getTimeInMillis(); + } + + //获取当前日期 秒 + public static long getTimeInSeconds(){ + return getTimeInMillis()/1000L; + } + + + public static void main(String[] args){ + /*String startTime = "2009-12-14"; + String endTime = "2010-1-14"; + List list = getBetweenDateStr(startTime,endTime); + for(String s : list){ + System.out.println(s); + }*/ + /*String nextday = getNextDay("yyyy-MM-dd"); + String xday = getPreXDay(6,"yyyy-MM-dd"); + System.out.println(nextday); + System.out.println(xday); + System.out.println(getFirstDay("yyyy-MM-dd")); + System.out.println(getLastDay("yyyy-MM-dd"));*/ + + /*try { + Date startTime = DateUtil.COMMON.getTextDate("2015-06-03 00:00:00"); + Date endTime = DateUtil.COMMON_FULL.getTextDate("2015-06-03 23:59:59"); + System.out.println(isTimeBetween(new Date(),startTime,endTime)); + + List month = getPreNMonths("2015-06",11); + for(String s : month){ + System.out.println(s); + } + + String str = DateUtil.COMMON_FULL.getDateText(getPreNDayEnd(new Date(),1)); + System.out.println(str); + + List days = getBetweenDateStr("2015-03-09","2015-06-15","MM/dd"); + for(String s : days){ + System.out.println(s); + } + + } catch (ParseException e) { + e.printStackTrace(); + }*/ + /*Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH); + + Map oneMap = CalendarUtil.getMonthFirstEndDayTime(Integer.toString(year),Integer.toString(month-11));//当前月第一天的00:00:00 + Map oneEndMap = CalendarUtil.getMonthFirstEndDayTime(Integer.toString(year),Integer.toString(month));//当前月最后一天的23:59:59 + System.out.println(oneMap.get(CalendarUtil.MONTH_FIRST_DAY_TIME)); + System.out.println(oneEndMap.get(CalendarUtil.MONTH_LAST_DAY_TIME));*/ + + System.out.println(getYear()); + System.out.println(getMonth()); + System.out.println(getDate()); + } + +} + diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CaptchaUtil.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CaptchaUtil.java new file mode 100644 index 0000000..9c47193 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CaptchaUtil.java @@ -0,0 +1,79 @@ +package edu.ncst.carbon.utils; + +import lombok.experimental.UtilityClass; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.Random; + +@UtilityClass +public class CaptchaUtil { + + private int width = 200; + private int height = 50; + + public BufferedImage createImage() { + return new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + } + + public String drawRandomText(BufferedImage verifyImg) { + Graphics2D graphics = (Graphics2D) verifyImg.getGraphics(); + + graphics.setColor(Color.WHITE); + graphics.fillRect(0, 0, width, height); + Font font = new Font("Bitmap", Font.PLAIN, 54); + graphics.setFont(font); + + String baseNumLetter = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; + StringBuilder stringBuffer = new StringBuilder(); + + int x = 10; + String ch = ""; + Random random = new Random(); + + for (int i = 0; i < 4; i++) { + graphics.setColor(getRandomColor()); + + // 设置字体旋转角度(控制小于30度) + int degree = random.nextInt() % 30; + int dot = random.nextInt(baseNumLetter.length()); + + ch = baseNumLetter.charAt(dot) + ""; + stringBuffer.append(ch); + + // 正向旋转 + graphics.rotate(degree * Math.PI / 180, x, 45); + graphics.drawString(ch, x, 45); + + // 反向旋转 + graphics.rotate(-degree * Math.PI / 180, x, 45); + x += 48; + } + + // 绘制干扰线 + for (int i = 0; i < 6; i++) { + graphics.setColor(getRandomColor()); + graphics.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); + } + + // 绘制噪点 + for (int i = 0; i < 30; i++) { + int x1 = random.nextInt(width); + int y1 = random.nextInt(height); + + graphics.setColor(getRandomColor()); + graphics.fillRect(x1, y1, 2, 1); + } + + return stringBuffer.toString(); + } + + /*** + * 取随机颜色 + */ + private Color getRandomColor() { + Random random = new Random(); + return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CookieUtils.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CookieUtils.java new file mode 100644 index 0000000..9b39b39 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/CookieUtils.java @@ -0,0 +1,29 @@ +package edu.ncst.carbon.utils; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + +public class CookieUtils { + + /** + * 获取指定的 Cookie + */ + public static Cookie getCookie(HttpServletRequest request, String name) { + if (name == null || "".equalsIgnoreCase(name)) { + return null; + } + + Cookie[] cookies = request.getCookies(); + + if (cookies != null) { + for (Cookie cookie : cookies) { + if (cookie.getName() != null && name.equals(cookie.getName())) { + return cookie; + } + } + } + + return null; + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/DateUtil.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/DateUtil.java new file mode 100644 index 0000000..a86a7ab --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/DateUtil.java @@ -0,0 +1,111 @@ +package edu.ncst.carbon.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * 日期工具类 + */ + +public class DateUtil { + + private final SimpleDateFormat format; + + public DateUtil(SimpleDateFormat format) { + this.format = format; + } + + public SimpleDateFormat getFormat() { + return format; + } + + // 紧凑型日期格式,也就是纯数字类型yyyyMMdd + public static final DateUtil COMPAT = new DateUtil(new SimpleDateFormat("yyyyMMdd")); + + // 紧凑型日期格式,也就是纯数字类型yyyyMMdd + public static final DateUtil COMPAT_FULL = new DateUtil(new SimpleDateFormat("yyyyMMddHHmmss")); + + // 常用日期格式,yyyy-MM-dd + public static final DateUtil COMMON = new DateUtil(new SimpleDateFormat("yyyy-MM-dd")); + public static final DateUtil COMMON_FULL = new DateUtil(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + + // 使用斜线分隔的,西方多采用,yyyy/MM/dd + public static final DateUtil SLASH = new DateUtil(new SimpleDateFormat("yyyy/MM/dd")); + + // 中文日期格式常用,yyyy年MM月dd日 + public static final DateUtil CHINESE = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日")); + public static final DateUtil CHINESE_FULL = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒")); + + /** + * 日期获取字符串 + */ + public String getDateText(Date date) { + return getFormat().format(date); + } + + /** + * 字符串获取日期 + * @throws ParseException + */ + public Date getTextDate(String text) throws ParseException { + return getFormat().parse(text); + } + + /** + * 日期获取字符串 + */ + public static String getDateText(Date date, String format) { + return new SimpleDateFormat(format).format(date); + } + + /** + * 字符串获取日期 + * @throws ParseException + */ + public static Date getTextDate(String dateText, String format) throws ParseException { + return new SimpleDateFormat(format).parse(dateText); + } + + /** + * 根据日期,返回其星期数,周一为1,周日为7 + * @param date + * @return + */ + public static int getWeekDay(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int w = calendar.get(Calendar.DAY_OF_WEEK); + int ret; + if (w == Calendar.SUNDAY) + ret = 7; + else + ret = w - 1; + return ret; + } + + public static int getAge(Date birthday) { + Calendar calendar = Calendar.getInstance(); + if (calendar.before(birthday)) { + throw new IllegalArgumentException("出生时间大于当前时间!"); + } + int yearNow = calendar.get(Calendar.YEAR); + int monthNow = calendar.get(Calendar.MONTH) + 1;// 注意此处,如果不加1的话计算结果是错误的 + int dayOfMonthNow = calendar.get(Calendar.DAY_OF_MONTH); + calendar.setTime(birthday); + int yearBirth = calendar.get(Calendar.YEAR); + int monthBirth = calendar.get(Calendar.MONTH); + int dayOfMonthBirth = calendar.get(Calendar.DAY_OF_MONTH); + int age = yearNow - yearBirth; + if (monthNow < monthBirth ||(monthNow == monthBirth && dayOfMonthNow < dayOfMonthBirth)) { + age--; + } + return age; + + } + + +} + + diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ImageUtils.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ImageUtils.java new file mode 100644 index 0000000..557382e --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ImageUtils.java @@ -0,0 +1,66 @@ +package edu.ncst.carbon.utils; + +import edu.ncst.carbon.mapper.image.ImageMapper; +import edu.ncst.carbon.model.image.Image; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.*; +import java.net.InetAddress; + +public class ImageUtils { + + // 读取配置文件中上传路径 + @Value("${file.file-dir}") + public static String uploadFilePath; + + @Autowired + ImageMapper imageMapper; + + public static Image uploadImage(MultipartFile uploadFile, HttpServletRequest request, String namePrefix) + throws FileNotFoundException { + +// log.info("文件信息" + uploadFile); + // 获取存放文件的目录 + File uploadPath = new File(uploadFilePath); + + + if (!uploadPath.exists()) { + uploadPath.mkdirs(); + } + + //命名图片文件 + String oldName = uploadFile.getOriginalFilename(); + String newName =namePrefix + oldName.substring(oldName.lastIndexOf(".")); + + //存储图片文件 + try { + File file = new File(uploadPath, newName); +// log.info(file.getAbsolutePath()); + + OutputStream outputStream = new FileOutputStream(file); + InputStream is = uploadFile.getInputStream(); + FileCopyUtils.copy(is, outputStream); + + // 文件的完整路径 + String filePath = uploadPath + File.separator + newName; + + InetAddress addr = InetAddress.getLocalHost(); + // 文件线上地址,回显给前端 + String url = request.getScheme() + "://" + addr.getHostAddress() + ":" + request.getServerPort() + "/images/" + newName; + + // 将图片信息存入数据库 + Image image = new Image(); + image.setImgUrl(url); + image.setImgName(newName); + return image; + } catch (IOException e) { +// log.error(e.getMessage()); + } + return null; + } +} + diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ResponseUtils.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ResponseUtils.java new file mode 100644 index 0000000..2a54a17 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ResponseUtils.java @@ -0,0 +1,91 @@ +package edu.ncst.carbon.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.vo.ResultVO; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.List; + +/** + * 消息类响应工具类 + */ +public class ResponseUtils { + + // 成功 + // 成功 + public static ResponseEntity success(String msg, T data) { + ResultVO resultVO = new ResultVO<>(); + resultVO.setCode(0); + resultVO.setMsg(msg); + resultVO.setData(data); + + return ResponseEntity.ok(resultVO); + } + + public static ResponseEntity success(Object data) { + return success("success", data); + } + + public static ResponseEntity success(String msg) { + return success(msg, null); + } + + public static ResponseEntity success() { + return success("success", null); + } + + // 失败 + public static ResponseEntity error(Integer code, String msg) { + ResultVO resultVO = new ResultVO<>(); + resultVO.setCode(code); + resultVO.setMsg(msg); + return ResponseEntity.ok().body(resultVO); + } + + public static ResponseEntity error(CodeMsg codeMsg) { + return error(codeMsg.getCode(), codeMsg.getMsg()); + } + + // 输出字段错误信息 + public static ResponseEntity fieldError(BindingResult bindingResult) { + ResultVO resultVO = new ResultVO<>(); + String msg = "未知字段错误"; + + if (bindingResult.hasFieldErrors()) { + List fieldErrors = bindingResult.getFieldErrors(); + int count = bindingResult.getFieldErrorCount(); + + if (count > 0) { + msg = fieldErrors.get(0).getDefaultMessage(); + } + } + + resultVO.setMsg(msg); + + return ResponseEntity.ok().body(resultVO); + } + + // 调用 + public static void output(HttpServletResponse response, Object data) { + try(OutputStream out = response.getOutputStream()) { + response.setContentType("application/json;charset=utf-8"); + + ObjectMapper objectMapper = new ObjectMapper(); + String s = objectMapper.writeValueAsString(data); + PrintWriter writer = new PrintWriter(out); + writer.print(s); + writer.flush(); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ResultUtils.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ResultUtils.java new file mode 100644 index 0000000..52277f6 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/ResultUtils.java @@ -0,0 +1,55 @@ +package edu.ncst.carbon.utils; + +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.vo.ResultVO; + +public class ResultUtils { + + // 成功 + public static ResultVO success(String msg, T data) { + ResultVO resultVO = new ResultVO<>(); + resultVO.setCode(0); + resultVO.setMsg(msg); + resultVO.setData(data); + + return resultVO; + } + public static ResultVO success(String msg) { + ResultVO resultVO = new ResultVO<>(); + resultVO.setCode(0); + resultVO.setMsg(msg); + resultVO.setData(null); + + return resultVO; + } + + // 成功 + public static ResultVO success(T data) { + ResultVO resultVO = new ResultVO<>(); + resultVO.setCode(0); + resultVO.setMsg("success"); + resultVO.setData(data); + + return resultVO; + } + // 错误 + public static ResultVO error(CodeMsg codeMsg) { + ResultVO resultVO = new ResultVO<>(); + resultVO.setCode(codeMsg.getCode()); + resultVO.setMsg(codeMsg.getMsg()); + resultVO.setData(null); + + return resultVO; + } + + // 错误 + public static ResultVO error(String codeMsg) { + ResultVO resultVO = new ResultVO<>(); + resultVO.setCode(500); + resultVO.setMsg(codeMsg); + resultVO.setData(null); + + return resultVO; + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/SessionUtils.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/SessionUtils.java new file mode 100644 index 0000000..791b2d6 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/SessionUtils.java @@ -0,0 +1,68 @@ +package edu.ncst.carbon.utils; + +import edu.ncst.carbon.exception.BusinessException; +import edu.ncst.carbon.exception.CodeMsg; +import edu.ncst.carbon.service.IUserService; +import edu.ncst.carbon.vo.user.UserInfoVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Locale; +import java.util.Objects; + +/** + * 会话工具类 + */ +@Component +public class SessionUtils { + + @Autowired + private IUserService userService; + + // 获取当前用户 + public static UserInfoVO getCurrentUser() { + SecurityContext context = SecurityContextHolder.getContext(); + //Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (context == null || context.getAuthentication() == null || context.getAuthentication().getDetails() == null) { + throw new BusinessException(CodeMsg.NOT_GET_CURRENT_USER_INFO); + } + return (UserInfoVO) context.getAuthentication().getDetails(); + } + + //获取用户登录信息之前,我们想要判断用户是否登录 + public static boolean userIsLogin() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String userName = authentication.getName(); + String role = authentication.getAuthorities().toString(); + if ("anonymousUser".toUpperCase(Locale.ROOT).equals(userName.toUpperCase(Locale.ROOT))) { + return false; + } + return !"[ROLE_ANONYMOUS]".equals(role); + } + + + // 获取当前用户标识 + public static Object getCurrentPrincipal() { + SecurityContext context = SecurityContextHolder.getContext(); + + return context.getAuthentication().getPrincipal(); + } + + // 获取当前 Request + public static HttpServletRequest getRequest() { + return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + } + + // 获取当前 Response + public static HttpServletResponse getResponse() { + return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getResponse(); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/SpringUtils.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/SpringUtils.java new file mode 100644 index 0000000..6f64a03 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/SpringUtils.java @@ -0,0 +1,25 @@ +package edu.ncst.carbon.utils; + +import org.springframework.aop.framework.AopContext; +import org.springframework.stereotype.Component; + +/** + * spring工具类 + * + * @author Lion Li + */ +@Component +public final class SpringUtils{ + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) { + return (T) AopContext.currentProxy(); + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/URLUtils.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/URLUtils.java new file mode 100644 index 0000000..eaa2bf8 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/URLUtils.java @@ -0,0 +1,27 @@ +package edu.ncst.carbon.utils; + +public class URLUtils { + + public static String removeQueryString(String url) { + int a = url.indexOf("?"); + int b = url.indexOf("#"); + int deleteStart = 0; + + if (a == -1 && b == -1) { + deleteStart = -1; + } else if (a != -1 && b != -1) { + deleteStart = Math.min(a, b); + } else if (a == -1) { + deleteStart = b; + } else { + deleteStart = a; + } + + if (deleteStart != -1) { + return url.substring(0, deleteStart); + } else { + return url; + } + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/WeChatUtils.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/WeChatUtils.java new file mode 100644 index 0000000..a156dba --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/utils/WeChatUtils.java @@ -0,0 +1,192 @@ +package edu.ncst.carbon.utils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.util.Base64; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import edu.ncst.carbon.vo.wechat.AccessTokenDTO; +import io.swagger.annotations.ApiOperation; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.springframework.data.redis.core.ReactiveRedisOperations; +import org.springframework.data.redis.core.ReactiveRedisTemplate; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.AlgorithmParameters; +import java.security.Security; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Component +public class WeChatUtils { + + private static final RestTemplate restTemplate; + + // 公众号: +// private static final String corpId = "ww17f8d10783494584"; +// private static final String corpsecret = "i5t-rh8bXeNCgihcYPrG9ZPpWkivzPJ69sv570osk6I"; + + // 小程序 + private static final String appId = "wx9c06c1a525bb918b"; + private static final String secret = "994f498af5d6f7d27126a27c89a5de78"; + + /** + * 微信AccessToken过期时间 + */ + Integer WECHAT_ACCESS_TOKEN_EXPIRE_SECOND = 7000; + /** + * 微信AccessToken + */ + String wechatAccessToken; + + /** + * 微信AccessToken生成时间 + */ + Date wechatAccessTokenRequestTime = new Date(); + + static { + restTemplate = new RestTemplate(); + } + + // 微信企业公众号 + // 根据 Code 获取 Session + /*public static SessionKeyDTO code2session(String code) { + // 获取 accesstoken + String gettoken = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpId + "&corpsecret=" + corpsecret + "&js_code=" + + code + "&grant_type=authorization_code"; + //获取Sessionid和userid + String jscode2session = "https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session?access_token=%s&js_code=%s&grant_type=authorization_code"; + + ResponseEntity response = restTemplate.getForEntity(gettoken, String.class); + ObjectMapper objectMapper = new ObjectMapper(); + SessionKeyDTO session = null; + + try { + AccessTokenDTO accessToken = objectMapper.readValue(response.getBody(), AccessTokenDTO.class); + response = restTemplate.getForEntity(String.format(jscode2session, accessToken.getAccessToken(), code), String.class); + session = objectMapper.readValue(response.getBody(), SessionKeyDTO.class); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + + return session; + }*/ + + + // 微信小程序 + // 根据 Code 获取 Session + @ApiOperation(value = "微信小程序授权登录") + public static AccessTokenDTO code2session(String code) { + // 获取 OpenID + String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId + "&secret=" + secret + "&js_code=" + + code + "&grant_type=authorization_code"; + + Map paramMap = new HashMap<>(); + paramMap.put("appid", "your appid"); + paramMap.put("secret", "your secret"); + paramMap.put("code", code); + ResponseEntity response = restTemplate.getForEntity(url, String.class, paramMap); + + ObjectMapper objectMapper = new ObjectMapper(); + AccessTokenDTO getAccessTokenDTO = null; + + try { + getAccessTokenDTO = objectMapper.readValue(response.getBody(), AccessTokenDTO.class); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + + return getAccessTokenDTO; + } + + + /** + * @return 获取AccessToken + */ + private String getAccessToken() { + //初始化情况 + Date currentData = new Date(); + //比较时间大小 + long betweenSeconds = (currentData.getTime() - wechatAccessTokenRequestTime.getTime())/1000; + if (wechatAccessToken == null || betweenSeconds > WECHAT_ACCESS_TOKEN_EXPIRE_SECOND) { + //更新AccessToken + updateAccessToken(); + //更新获取时间 + wechatAccessTokenRequestTime = new Date(); + } + return wechatAccessToken; + } + + /** + * 更新AccessToken + * 获取小程序全局唯一后台接口调用凭据,token有效期为7200s,即两个小时 + */ + @ApiOperation(value = "更新AccessToken") + public void updateAccessToken(){ + + // 获取 AccessToken + String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret; + + ResponseEntity response = restTemplate.getForEntity(url, String.class); + + ObjectMapper objectMapper = new ObjectMapper(); + AccessTokenDTO getAccessTokenDTO = null; + + try { + getAccessTokenDTO = objectMapper.readValue(response.getBody(), AccessTokenDTO.class); + wechatAccessToken = getAccessTokenDTO.getAccessToken(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + + + /** + * 开发者后台校验与解密开放数据 + */ + public static JSONObject decrypt(String encryptedData, String sessionkey, String iv){ + // 被加密的数据 + byte[] dataByte = Base64.decodeFast(encryptedData); + // 加密秘钥 + byte[] keyByte = Base64.decodeFast(sessionkey); + // 偏移量 + byte[] ivByte = Base64.decodeFast(iv); + + try { + // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 + int base = 16; + if (keyByte.length % base != 0) { + int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); + byte[] temp = new byte[groups * base]; + Arrays.fill(temp, (byte) 0); + System.arraycopy(keyByte, 0, temp, 0, keyByte.length); + keyByte = temp; + } + // 初始化 + Security.addProvider(new BouncyCastleProvider()); + // 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。 + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC"); + SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); + AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); + parameters.init(new IvParameterSpec(ivByte)); + + cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化 + byte[] resultByte = cipher.doFinal(dataByte); + if (null != resultByte && resultByte.length > 0) { + String result = new String(resultByte, "UTF-8"); + return JSONObject.parseObject(result); + } + }catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/ListResultVO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/ListResultVO.java new file mode 100644 index 0000000..8c4dd02 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/ListResultVO.java @@ -0,0 +1,30 @@ +package edu.ncst.carbon.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; + +@ApiModel(value = "ListResultVO", description = "分页列表数据") +@Data +@EqualsAndHashCode(callSuper = false) +public class ListResultVO implements Serializable { + + private static final long serialVersionUID = -8896090499552990782L; + + @ApiModelProperty(value = "列表数据") + private List list; + + @ApiModelProperty(value = "记录总数") + private Long total; + + @ApiModelProperty(value = "每页记录数") + private Long pageSize; + + @ApiModelProperty(value = "当前页码") + private Long current; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/Query.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/Query.java new file mode 100644 index 0000000..ec3b0d3 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/Query.java @@ -0,0 +1,61 @@ +package edu.ncst.carbon.vo; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.io.Serializable; + +@ApiModel(description = "列表查询参数") +@Data +public class Query implements Serializable { + + private static final long serialVersionUID = 4617734867110140874L; + + // 排序方式 + private String sorter; + + // 页码 + private Integer current = 1; + + // 每页记录数 + private Integer pageSize = 10; + + // 转换为 Pageable + public Page toPageRequest() { + return new Page<>(current, pageSize); + } + + // 转换为 Sorter 对象 + public Sorter toSorter() { + if (sorter == null) { + return null; + } + + if (sorter.endsWith("_ascend")) { + String key = sorter.replace("_ascend", ""); + String column = StringUtils.camelToUnderline(key); + Sorter _sorter = new Sorter(); + + _sorter.setColumn(column); + _sorter.setKey(key); + _sorter.setIsAsc(true); + + return _sorter; + } else if (sorter.endsWith("_descend")){ + String key = sorter.replace("_descend", ""); + String column = StringUtils.camelToUnderline(key); + Sorter _sorter = new Sorter(); + + _sorter.setColumn(column); + _sorter.setKey(key); + _sorter.setIsAsc(false); + + return _sorter; + } + + return null; + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/ResultVO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/ResultVO.java new file mode 100644 index 0000000..4c556e2 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/ResultVO.java @@ -0,0 +1,19 @@ +package edu.ncst.carbon.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +/** + * 统一的接口返回数据格式 + */ +@ApiModel(value = "ResultVO", description = "返回信息") +@Data +public class ResultVO { + private Integer code=0; + private String msg="success"; + // 数据 + @ApiModelProperty(value = "数据", dataType = "Object",name = "data") + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private T data; +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/Sorter.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/Sorter.java new file mode 100644 index 0000000..1aebe9d --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/Sorter.java @@ -0,0 +1,20 @@ +package edu.ncst.carbon.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(description = "排序器") +@Data +public class Sorter { + + @ApiModelProperty(value = "排序关键字") + private String key; + + @ApiModelProperty(value = "是否为升序") + private Boolean isAsc = true; + + @ApiModelProperty(value = "排序列名", notes = "根据该列进行排序") + private String column; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CalculationResults.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CalculationResults.java new file mode 100644 index 0000000..ea06a02 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CalculationResults.java @@ -0,0 +1,25 @@ +package edu.ncst.carbon.vo.carbon; + +import lombok.Data; + +/* +* 碳公式计算结果 +* */ +@Data +public class CalculationResults { + /* + * 碳排放量计算参数 + * */ + Float emission; + + /* + * 碳积分计算参数 + * */ + Float intergral; + + /* + * 单位 + * */ + String unit; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CarFormulaDetailVO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CarFormulaDetailVO.java new file mode 100644 index 0000000..9e96377 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CarFormulaDetailVO.java @@ -0,0 +1,4 @@ +package edu.ncst.carbon.vo.carbon; + +public class CarFormulaDetailVO { +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CarFormulaQuery.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CarFormulaQuery.java new file mode 100644 index 0000000..9192cf3 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/carbon/CarFormulaQuery.java @@ -0,0 +1,6 @@ +package edu.ncst.carbon.vo.carbon; + +import edu.ncst.carbon.vo.Query; + +public class CarFormulaQuery extends Query { +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/query/LoginLogQuery.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/query/LoginLogQuery.java new file mode 100644 index 0000000..6698b52 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/query/LoginLogQuery.java @@ -0,0 +1,29 @@ +package edu.ncst.carbon.vo.query; + +import edu.ncst.carbon.vo.Query; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@ApiModel(description = "登录日志查询对象") +@Data +public class LoginLogQuery extends Query { + + @ApiModelProperty(value = "关键字", notes = "用于对用户名、用户ID、用户姓名进行模糊查询") + private String keyword; + + @ApiModelProperty(value = "登录类型") + private String type; + + @ApiModelProperty(value = "开始日期") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @ApiModelProperty(value = "结束日期") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/query/UserQuery.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/query/UserQuery.java new file mode 100644 index 0000000..f639805 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/query/UserQuery.java @@ -0,0 +1,25 @@ +package edu.ncst.carbon.vo.query; + +import edu.ncst.carbon.vo.Query; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(description = "用户信息查询") +public class UserQuery extends Query { + @ApiModelProperty("手机号") + private String phone; + + @ApiModelProperty("用户名") + private String userName; + + @ApiModelProperty(value = "电子邮箱") + private String email; + + @ApiModelProperty(value = "用户真实名") + private String fullName; + + @ApiModelProperty("角色ID列表") + private Integer[] roleIds; +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/ModifyRoleInterfacePermissionDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/ModifyRoleInterfacePermissionDTO.java new file mode 100644 index 0000000..a835682 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/ModifyRoleInterfacePermissionDTO.java @@ -0,0 +1,14 @@ +package edu.ncst.carbon.vo.role; + +import lombok.Data; + +import java.util.List; + +@Data +public class ModifyRoleInterfacePermissionDTO { + + private Integer roleId; + + private List resourceIds; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/ModifyRoleMenuPermissionDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/ModifyRoleMenuPermissionDTO.java new file mode 100644 index 0000000..eda75d0 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/ModifyRoleMenuPermissionDTO.java @@ -0,0 +1,14 @@ +package edu.ncst.carbon.vo.role; + +import lombok.Data; + +import java.util.List; + +@Data +public class ModifyRoleMenuPermissionDTO { + + private Integer roleId; + + private List menuIds; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/RoleDetailVO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/RoleDetailVO.java new file mode 100644 index 0000000..9cbd4f9 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/RoleDetailVO.java @@ -0,0 +1,30 @@ +package edu.ncst.carbon.vo.role; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +@ApiModel(description = "角色详情") +@Data +public class RoleDetailVO { + + @ApiModelProperty(value = "角色ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "角色名称") + private String name; + + @ApiModelProperty(value = "显示文本") + private String label; + +// @ApiModelProperty(value = "权限ID列表") +// private List authorityIds; + + @ApiModelProperty(value = "是否启用") + private Boolean enable; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/RoleShortItemVO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/RoleShortItemVO.java new file mode 100644 index 0000000..a41974b --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/role/RoleShortItemVO.java @@ -0,0 +1,17 @@ +package edu.ncst.carbon.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(description = "角色简要信息列表项") +@Data +public class RoleShortItemVO { + + @ApiModelProperty(value = "角色ID") + private Integer id; + + @ApiModelProperty(value = "角色显示文本") + private String label; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/AddUserDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/AddUserDTO.java new file mode 100644 index 0000000..2312519 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/AddUserDTO.java @@ -0,0 +1,55 @@ +package edu.ncst.carbon.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; +import java.util.List; + +/* + * entity/model 表示对数据库中所有表的映射,是根据数据库表字段设计出来的实体 + * vo包表示前端页面传过来的如表单等数据的字段,可以使用 @RequestBody注解 快速获取参数内容,而不需要使用Request对象来一个个获取,方便开发。 + * dto包表示的是 vo和entity的一个中间转换对象,是vo或entity对象中属性的一个子对象。 + * */ +@ApiModel(description = "添加用户DTO") +@Data +public class AddUserDTO { + + private static final long serialVersionUID =1L; + + // @ApiModelProperty是swagger的注解,它的作用是添加和操作属性模块的数据 + @ApiModelProperty(value = "用户名") + @NotBlank(message = "用户名不能为空") + // Pattern注解 参数验证------正则验证 + @Pattern(regexp = "^([a-z]|[A-Z]|[0-9])+$", message = "用户名由大小写字母和数字组成") + private String username; + + @ApiModelProperty(value = "密码") + @NotBlank(message = "密码不能为空") + @Pattern(regexp = "^([a-f][0-9])$", message = "请输入正确格式的密码") + private String password; + + @ApiModelProperty(value = "电子邮箱") + @NotBlank(message = "电子邮箱不能为空") + @Pattern(regexp = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", message = "请输入格式正确的电子邮箱") + private String email; + + @ApiModelProperty(value = "手机号") + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = "^1\\d{10}$", message = "请输入格式正确的11位手机号") + private String phone; + + @ApiModelProperty(value = "真实姓名") + @NotBlank(message = "真实姓名不能为空") + private String fullName; + + + @ApiModelProperty(value = "角色ID列表") + @NotEmpty(message = "用户角色不能为空") + private List roles; + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/CurrentUserDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/CurrentUserDTO.java new file mode 100644 index 0000000..d0413c8 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/CurrentUserDTO.java @@ -0,0 +1,38 @@ +package edu.ncst.carbon.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(description = "当前用户信息") +@Data +public class CurrentUserDTO { + + @ApiModelProperty("头像链接") + private String avatar; + + @ApiModelProperty("姓名") + private String username; + + @ApiModelProperty("全名") + private String fullName; + + @ApiModelProperty("角色") + private String role; + + @ApiModelProperty("头衔") + private String title; + + @ApiModelProperty("用户组") + private String group; + + @ApiModelProperty("用户ID") + private Integer userId; + +// @ApiModelProperty("所在单位ID") +// private Integer unitId; +// +// @ApiModelProperty("所在单位名称") +// private Integer unitName; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/ResetUserPasswordDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/ResetUserPasswordDTO.java new file mode 100644 index 0000000..4d71291 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/ResetUserPasswordDTO.java @@ -0,0 +1,25 @@ +package edu.ncst.carbon.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; + +@ApiModel(description = "重置用户密码DTO") +@Data +public class ResetUserPasswordDTO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "用户名") + private String username; + + @ApiModelProperty(value = "新密码") + @NotBlank(message = "密码不能为空") + @Pattern(regexp = "^([a-f][0-9])$", message = "请输入正确格式的密码") + private String password; +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UpdateUserDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UpdateUserDTO.java new file mode 100644 index 0000000..6a25962 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UpdateUserDTO.java @@ -0,0 +1,36 @@ +package edu.ncst.carbon.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel(description = "更新用户DTO") +@Data +public class UpdateUserDTO { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "用户名") + private String username; + + @ApiModelProperty(value = "电子邮箱") + private String email; + + @ApiModelProperty(value = "手机号") + private String phone; + + @ApiModelProperty(value = "真实姓名") + private String fullName; + + @ApiModelProperty(value = "角色ID列表") + private List roles; + +// @ApiModelProperty(value = "所在单位ID") +// private Integer unitId; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserInfoVO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserInfoVO.java new file mode 100644 index 0000000..964e702 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserInfoVO.java @@ -0,0 +1,29 @@ +package edu.ncst.carbon.vo.user; + +import edu.ncst.carbon.model.system.Role; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(description = "用户信息") +public class UserInfoVO { + @ApiModelProperty(value = "用户id") + private Integer id; + @ApiModelProperty(value = "用户名") + private String username; + @ApiModelProperty(value = "用户真实名") + private String fullName; + @ApiModelProperty(value = "电子邮箱") + private String email; + @ApiModelProperty(value = "手机号") + private String phone; + @ApiModelProperty(value = "OpenID") + private String openId; + @ApiModelProperty(value = "角色列表") + private List roles; + @ApiModelProperty(value = "是否启用 1:启用 0:禁用") + private boolean enable; +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserItemVO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserItemVO.java new file mode 100644 index 0000000..e01793d --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserItemVO.java @@ -0,0 +1,15 @@ +package edu.ncst.carbon.vo.user; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel(description = "用户列表项VO") +@Data +public class UserItemVO { + + private Integer id; + + private String fullName; + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserLoginDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserLoginDTO.java new file mode 100644 index 0000000..9731096 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/user/UserLoginDTO.java @@ -0,0 +1,35 @@ +package edu.ncst.carbon.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(description = "用户登录表单") +@Data +public class UserLoginDTO { + + @ApiModelProperty(value = "登录方式", notes = "可选:WECHAT / MOBILE / PASSWORD") + private String type; + + @ApiModelProperty("用户名") + private String username; + + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("验证码") + private String loginCaptcha; + + @ApiModelProperty("微信小程序Code") + private String weChatCode; + + @ApiModelProperty("手机号") + private String phone; + + @ApiModelProperty("手机验证码") + private String mobileCaptcha; + + @ApiModelProperty("临时TOKEN") + private String tempToken; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/AccessTokenDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/AccessTokenDTO.java new file mode 100644 index 0000000..d3fd950 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/AccessTokenDTO.java @@ -0,0 +1,25 @@ +package edu.ncst.carbon.vo.wechat; + +import com.fasterxml.jackson.annotation.JsonAlias; +import lombok.Data; + +@Data +public class AccessTokenDTO { + @JsonAlias("access_token") + private String accessToken; + + @JsonAlias("expires_in") + private String expiresIn; + + @JsonAlias("session_key") + private String sessionKey; + + private String openid; + + private String unionid; + + private String errcode; + + private String errmsg; + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/BindUserDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/BindUserDTO.java new file mode 100644 index 0000000..1fe3388 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/BindUserDTO.java @@ -0,0 +1,20 @@ +package edu.ncst.carbon.vo.wechat; + +import lombok.Data; + +@Data +public class BindUserDTO { + String nickName; // 昵称 + String avatarUrl; // 头像 + String email; + String phone; + String openId; + String gender; + String language; + String city; + String province; + String country; + + + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SessionKeyDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SessionKeyDTO.java new file mode 100644 index 0000000..b34da47 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SessionKeyDTO.java @@ -0,0 +1,22 @@ +package edu.ncst.carbon.vo.wechat; + +import com.fasterxml.jackson.annotation.JsonAlias; +import lombok.Data; + +@Data +public class SessionKeyDTO { + + @JsonAlias("userid") + private String weChatId; + + @JsonAlias("session_key") + private String sessionKey; + + private String corpid; + + private String deviceid; + + private String errcode; + + private String errmsg; +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SportData.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SportData.java new file mode 100644 index 0000000..3ab24ec --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SportData.java @@ -0,0 +1,29 @@ +package edu.ncst.carbon.vo.wechat; + +import java.util.List; + +/** + * 运动数据 + */ +public class SportData { + + Integer step; + + List stepList ; + + public Integer getStep() { + return step; + } + + public void setStep(Integer step) { + this.step = step; + } + + public List getStepList() { + return stepList; + } + + public void setStepList(List stepList) { + this.stepList = stepList; + } +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SportDay.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SportDay.java new file mode 100644 index 0000000..c77bf92 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/SportDay.java @@ -0,0 +1,28 @@ +package edu.ncst.carbon.vo.wechat; + +import lombok.Data; + +/** + * 用户每天步数 + */ +@Data +public class SportDay { + + private Integer year;//年 + private Integer month;//月 + private Integer date;//日 + private Integer step;//步数 + + + public SportDay(Integer date, Integer step){ + this.date = date; + this.step = step; + } + public SportDay(Integer year, Integer month, Integer date, Integer step){ + this.year = year; + this.month = month; + this.date = date; + this.step = step; + } + +} diff --git a/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/UserWeChatDTO.java b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/UserWeChatDTO.java new file mode 100644 index 0000000..99e41e0 --- /dev/null +++ b/CarbonSysBE1/src/main/java/edu/ncst/carbon/vo/wechat/UserWeChatDTO.java @@ -0,0 +1,19 @@ +package edu.ncst.carbon.vo.wechat; + +import lombok.Data; + +@Data +public class UserWeChatDTO { + + // 用户id + private Integer userId; + // 微信OpenId + private String openId; + // 用户名 + private String username; + // 密码 + private String password; + // 是否启用 + private Boolean enable; +} + diff --git a/CarbonSysBE1/src/main/resources/application.yml b/CarbonSysBE1/src/main/resources/application.yml new file mode 100644 index 0000000..49cf1d0 --- /dev/null +++ b/CarbonSysBE1/src/main/resources/application.yml @@ -0,0 +1,81 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/carbon_sys?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + hikari: + max-lifetime: 300000 + devtools: + restart: + enabled: true #设置开启热部署 + additional-paths: src/main/java #重启目录 + exclude: WEB-INF/** + application: + name: springfox-swagger + mvc: + pathmatch: + matching-strategy: ant_path_matcher + async: + request-timeout: 120000 #设置restful的api超时时间为60秒 + + # Redis + redis: + database: 0 + port: 6379 + banner: + location: banner.txt全部提交 + main: + allow-bean-definition-overriding: true + servlet: + multipart: + max-file-size: 20MB + max-request-size: 20MB + +# Server +server: + port: 8888 + tomcat: + connection-timeout: 300000 + servlet: + encoding: + charset: utf-8 + +mybatis: + mapper-locations: classpath:mapping/*.xml + type-aliases-package: edu.ncst.carbon.model + +# Swagger +swagger: + enable: true + title: API文档 + description: 低碳生活小程序系统API文档 + base-package: edu.ncst.carbon.controller + exclude-path: /error/** + termsOfServiceUrl: https://meander.net.cn + contact: + name: sage + url: www.meander.net.cn + email: sage@meander.net.cn + +logging: + config: classpath:logback.xml + level: + edu.ncst.carbon: DEBUG + org.springframework: DEBUG + java.sql: DEBUG + +file: + file-dir: D:/uploads + +# MyBatis Plus +mybatis-plus: + global-config: + db-config: + logic-delete-field: deleteAt + logic-delete-value: now() + logic-not-delete-value: null + banner: false # 关闭控制台的 LOGO + mapper-locations: classpath*:/mapping/**/*.xml + configuration: + log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl \ No newline at end of file diff --git a/CarbonSysBE1/src/main/resources/banner.txt b/CarbonSysBE1/src/main/resources/banner.txt new file mode 100644 index 0000000..e69de29 diff --git a/CarbonSysBE1/src/main/resources/generator/TaskAuditMapper.xml b/CarbonSysBE1/src/main/resources/generator/TaskAuditMapper.xml new file mode 100644 index 0000000..e69de29 diff --git a/CarbonSysBE1/src/main/resources/logback.xml b/CarbonSysBE1/src/main/resources/logback.xml new file mode 100644 index 0000000..66b2594 --- /dev/null +++ b/CarbonSysBE1/src/main/resources/logback.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + ${CONTEXT_NAME} + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS,CTT} [%thread] %-5level %logger{50} - %msg%n + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + ${FILE_LOG_PATTERN} + + ${LOG_PATH}/sbgl.log + + ${LOG_PATH}/sbgl-%d{yyyy-MM-dd}.%i.log + ${MAX_FILE_SIZE} + ${MAX_HISTORY} + + + + + + + + diff --git a/CarbonSysBE1/src/main/resources/mapping/CarbonFormulaMapper.xml b/CarbonSysBE1/src/main/resources/mapping/CarbonFormulaMapper.xml new file mode 100644 index 0000000..f70eebb --- /dev/null +++ b/CarbonSysBE1/src/main/resources/mapping/CarbonFormulaMapper.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CarbonSysBE1/src/main/resources/mapping/ImageMapper.xml b/CarbonSysBE1/src/main/resources/mapping/ImageMapper.xml new file mode 100644 index 0000000..47bb738 --- /dev/null +++ b/CarbonSysBE1/src/main/resources/mapping/ImageMapper.xml @@ -0,0 +1,14 @@ + + + + + + + INSERT INTO image + (img_url, img_name) + VALUES ( + #{image.imgUrl}, + #{image.imgName} + ) + + diff --git a/CarbonSysBE1/src/main/resources/mapping/LoginLogMapper.xml b/CarbonSysBE1/src/main/resources/mapping/LoginLogMapper.xml new file mode 100644 index 0000000..bd9f528 --- /dev/null +++ b/CarbonSysBE1/src/main/resources/mapping/LoginLogMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/CarbonSysBE1/src/main/resources/mapping/MenuMapper.xml b/CarbonSysBE1/src/main/resources/mapping/MenuMapper.xml new file mode 100644 index 0000000..fec06c3 --- /dev/null +++ b/CarbonSysBE1/src/main/resources/mapping/MenuMapper.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + INSERT IGNORE INTO sys_menu(type, name, title, icon, url, show_in_menu, + parent_id, sort, remark) + VALUES + + ( + #{ item.type }, #{ item.name }, #{ item.title }, #{ item.icon }, #{ item.url }, #{ item.showInMenu }, + #{ item.parentId}, #{ item.sort }, #{ item.remark } + ) + + + + + REPLACE INTO sys_menu( + type, name, title, icon, url, show_in_menu, + parent_id, sort, remark + ) VALUES + + ( + #{ item.type }, #{ item.name }, #{ item.title }, #{ item.icon }, #{ item.url }, #{ item.showInMenu }, + #{ item.parentId}, #{ item.sort }, #{ item.remark } + ) + ; + + + + DELETE FROM sys_menu WHERE 1=1; + + + + + + + + + + + + + + + diff --git a/CarbonSysBE1/src/main/resources/mapping/ResourceMapper.xml b/CarbonSysBE1/src/main/resources/mapping/ResourceMapper.xml new file mode 100644 index 0000000..852ea7d --- /dev/null +++ b/CarbonSysBE1/src/main/resources/mapping/ResourceMapper.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + REPLACE INTO sys_resource(`id`, `name`, `label`, `method`, `url`, `parent_id`, `permit_all`, `user_scope`) + VALUES + + (#{ resource.id }, #{ resource.name }, #{ resource.label }, #{ resource.method }, + #{ resource.url }, #{ resource.parentId }, #{ resource.permitAll }, #{ resource.userScope }) + + + + + REPLACE INTO sys_resource(`id`, `name`, `label`, `method`, `url`, `parent_id`, `permit_all`, `user_scope`) + VALUES (#{ id }, #{ name }, #{ label }, #{ method }, #{ url }, #{ parentId }, #{ permitAll }, #{ userScope }) + + + + INSERT INTO sys_resource(`name`, `label`, `method`, `url`, `parent_id`, `permit_all`, `user_scope`) + SELECT #{ name }, #{ label }, #{ method }, #{ url }, #{ parentId }, #{ permitAll }, #{ userScope } + FROM sys_resource + WHERE NOT EXISTS( + SELECT * + FROM sys_resource + WHERE sys_resource.name = #{ name } + ) + + + + INSERT INTO sys_resource(`name`, `label`, `method`, `url`, `parent_id`, `permit_all`, `user_scope`) VALUES + + (#{ resource.name }, #{ resource.label }, #{ resource.method }, + #{ resource.url }, #{ resource.parentId }, #{ resource.permitAll }, #{ resource.userScope }) + + + diff --git a/CarbonSysBE1/src/main/resources/mapping/RoleMapper.xml b/CarbonSysBE1/src/main/resources/mapping/RoleMapper.xml new file mode 100644 index 0000000..9c11b08 --- /dev/null +++ b/CarbonSysBE1/src/main/resources/mapping/RoleMapper.xml @@ -0,0 +1,19 @@ + + + + + + REPLACE INTO sys_role_resource(`role_id`, `resource_id`) + VALUES + + (#{id},#{resourcesIds}) + + + + + + diff --git a/CarbonSysBE1/src/main/resources/mapping/RoleResouceMapper.xml b/CarbonSysBE1/src/main/resources/mapping/RoleResouceMapper.xml new file mode 100644 index 0000000..42d4b89 --- /dev/null +++ b/CarbonSysBE1/src/main/resources/mapping/RoleResouceMapper.xml @@ -0,0 +1,14 @@ + + + + + INSERT INTO sys_role_resource(role_id, resource_id) VALUES + + (#{ roleId }, #{ resourceId }) + + + + + delete from sys_role_resource t where role_id = #{ roleId } + + diff --git a/CarbonSysBE1/src/main/resources/mapping/TaskMapper.xml b/CarbonSysBE1/src/main/resources/mapping/TaskMapper.xml new file mode 100644 index 0000000..048e8a8 --- /dev/null +++ b/CarbonSysBE1/src/main/resources/mapping/TaskMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + id, `name`, `enable`, delete_time, carbon_formula_id, supplier_id, image + + + + + + + + + delete from task + where id = #{id,jdbcType=INTEGER} + + + insert into task (`name`, `enable`, delete_time, + carbon_formula_id, supplier_id, image + ) + values (#{name,jdbcType=VARCHAR}, #{enable,jdbcType=BIT}, #{deleteTime,jdbcType=TIMESTAMP}, + #{carbonFormulaId,jdbcType=INTEGER}, #{supplierId,jdbcType=INTEGER}, #{image,jdbcType=VARCHAR} + ) + + + insert into task + + + `name`, + + + `enable`, + + + delete_time, + + + carbon_formula_id, + + + supplier_id, + + + image, + + + + + #{name,jdbcType=VARCHAR}, + + + #{enable,jdbcType=BIT}, + + + #{deleteTime,jdbcType=TIMESTAMP}, + + + #{carbonFormulaId,jdbcType=INTEGER}, + + + #{supplierId,jdbcType=INTEGER}, + + + #{image,jdbcType=VARCHAR}, + + + + + update task + + + `name` = #{name,jdbcType=VARCHAR}, + + + `enable` = #{enable,jdbcType=BIT}, + + + delete_time = #{deleteTime,jdbcType=TIMESTAMP}, + + + carbon_formula_id = #{carbonFormulaId,jdbcType=INTEGER}, + + + supplier_id = #{supplierId,jdbcType=INTEGER}, + + + image = #{image,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=INTEGER} + + + update task + set `name` = #{name,jdbcType=VARCHAR}, + `enable` = #{enable,jdbcType=BIT}, + delete_time = #{deleteTime,jdbcType=TIMESTAMP}, + carbon_formula_id = #{carbonFormulaId,jdbcType=INTEGER}, + supplier_id = #{supplierId,jdbcType=INTEGER}, + image = #{image,jdbcType=VARCHAR} + where id = #{id,jdbcType=INTEGER} + + \ No newline at end of file diff --git a/CarbonSysBE1/src/main/resources/mapping/UserMapper.xml b/CarbonSysBE1/src/main/resources/mapping/UserMapper.xml new file mode 100644 index 0000000..0a350cd --- /dev/null +++ b/CarbonSysBE1/src/main/resources/mapping/UserMapper.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE sys_user SET open_id = #{ openId } WHERE id = #{ userId } + + + +