From 172ac163ebdfda57be3f14cf72fa8d5956ff16f6 Mon Sep 17 00:00:00 2001 From: geekidea Date: Sat, 18 Apr 2020 14:44:57 +0800 Subject: [PATCH 01/36] =?UTF-8?q?2.1-SNAPSHOT=20=E8=B0=83=E6=95=B4springbo?= =?UTF-8?q?otplus=E5=8C=85=E5=90=8D=E4=B8=BAboot,=E8=B0=83=E6=95=B4artifac?= =?UTF-8?q?tId=20parent=E4=B8=BAspring-boot-plus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-zh.md | 4 +- README.md | 4 +- admin/pom.xml | 6 +- .../admin/SpringBootPlusAdminApplication.java | 3 +- .../admin/config/AdminWebMvcConfig.java | 2 +- .../admin/config/SecuritySecureConfig.java | 2 +- bootstrap/pom.xml | 14 ++-- .../SpringBootPlusApplication.java | 8 +- .../{springbootplus => boot}/aop/LogAop.java | 10 +-- .../config/JacksonConfig.java | 16 ++-- .../config/MybatisPlusConfig.java | 2 +- .../config/RedisCacheConfig.java | 2 +- .../config/RedisTemplateConfig.java | 2 +- .../config/RestTemplateConfig.java | 2 +- .../config/ShiroConfig.java | 22 +++--- .../config/SpringBootPlusConfig.java | 2 +- .../config/SpringBootPlusCorsConfig.java | 4 +- .../config/SpringBootPlusWebMvcConfig.java | 22 +++--- .../config/Swagger2Config.java | 6 +- .../handler/GlobalExceptionHandler.java | 20 ++--- .../test/BaseTest.java | 4 +- .../test/FooBarMapperTest.java | 2 +- config/pom.xml | 6 +- .../config/constant/CacheKey.java | 2 +- .../config/constant/CommonConstant.java | 2 +- .../config/constant/CommonRedisKey.java | 2 +- .../config/constant/DatePattern.java | 2 +- .../config/properties/JwtProperties.java | 4 +- .../properties/ShiroPermissionProperties.java | 2 +- .../config/properties/ShiroProperties.java | 2 +- .../SpringBootPlusAopProperties.java | 2 +- .../SpringBootPlusCorsProperties.java | 2 +- .../SpringBootPlusFilterProperties.java | 2 +- .../SpringBootPlusInterceptorProperties.java | 2 +- .../properties/SpringBootPlusProperties.java | 2 +- .../SpringBootPlusStaticProperties.java | 2 +- .../config/properties/SwaggerProperties.java | 2 +- .../src/main/resources/config/application.yml | 4 +- config/src/main/resources/config/logback.xml | 2 +- distribution/pom.xml | 8 +- distribution/release.xml | 2 +- docs/db/mysql_spring_boot_plus.sql | 2 +- example/pom.xml | 8 +- .../foobar/controller/FooBarController.java | 16 ++-- .../com/example/foobar/entity/FooBar.java | 4 +- .../example/foobar/param/FooBarPageParam.java | 2 +- .../example/foobar/service/FooBarService.java | 4 +- .../service/impl/FooBarServiceImpl.java | 8 +- .../controller/ExampleOrderController.java | 18 ++--- .../example/order/entity/ExampleOrder.java | 4 +- .../order/param/ExampleOrderPageParam.java | 2 +- .../order/service/ExampleOrderService.java | 4 +- .../service/impl/ExampleOrderServiceImpl.java | 6 +- framework/pom.xml | 8 +- .../framework/common/api/ApiCode.java | 2 +- .../framework/common/api/ApiResult.java | 2 +- .../framework/common/bean/ClientInfo.java | 2 +- .../framework/common/bean/DeviceInfo.java | 2 +- .../common/controller/BaseController.java | 2 +- .../common/controller/CsrfController.java | 6 +- .../common/controller/EnumController.java | 16 ++-- .../common/controller/IndexController.java | 4 +- .../framework/common/entity/BaseEntity.java | 2 +- .../framework/common/enums/BaseEnum.java | 2 +- .../common/exception/BusinessException.java | 4 +- .../common/exception/DaoException.java | 4 +- .../exception/GlobalErrorController.java | 6 +- .../SpringBootPlusConfigException.java | 4 +- .../exception/SpringBootPlusException.java | 4 +- .../framework/common/param/IdParam.java | 2 +- .../framework/common/service/BaseService.java | 2 +- .../common/service/impl/BaseServiceImpl.java | 6 +- .../framework/common/vo/EnumVo.java | 2 +- .../config/converter/ConverterConfig.java | 2 +- .../converter/StringToDateConverter.java | 2 +- .../config/converter/StringToDateUtil.java | 2 +- .../converter/StringToDoubleConverter.java | 2 +- .../config/converter/StringToDoubleUtil.java | 2 +- .../converter/StringToIntegerConverter.java | 2 +- .../config/converter/StringToIntegerUtil.java | 2 +- .../deserializer/JacksonDateDeserializer.java | 4 +- .../JacksonDoubleDeserializer.java | 4 +- .../JacksonLocalDateTimeDeserializer.java | 4 +- .../serializer/JacksonDateSerializer.java | 4 +- .../JacksonIntegerDeserializer.java | 4 +- .../JacksonLocalDateTimeSerializer.java | 4 +- .../framework/core/bean/RequestDetail.java | 2 +- .../core/filter/RequestDetailFilter.java | 8 +- .../interceptor/PermissionInterceptor.java | 2 +- .../core/pagination/BasePageOrderParam.java | 2 +- .../core/pagination/BasePageParam.java | 4 +- .../core/pagination/OrderMapping.java | 4 +- .../framework/core/pagination/PageInfo.java | 2 +- .../framework/core/pagination/Paging.java | 4 +- .../core/util/RequestDetailThreadLocal.java | 4 +- .../core/validator/EnumTypeValidator.java | 10 +-- .../core/validator/IdCardValidator.java | 4 +- .../core/validator/PhoneValidator.java | 4 +- .../core/validator/constraints/EnumType.java | 6 +- .../core/validator/constraints/IdCard.java | 4 +- .../core/validator/constraints/Phone.java | 4 +- .../framework/core/validator/groups/Add.java | 2 +- .../core/validator/groups/Update.java | 2 +- .../framework/core/xss/XssFilter.java | 2 +- .../xss/XssHttpServletRequestWrapper.java | 2 +- .../core/xss/XssJacksonDeserializer.java | 2 +- .../core/xss/XssJacksonSerializer.java | 2 +- .../framework/ip/entity/IpAddress.java | 4 +- .../framework/ip/mapper/IpAddressMapper.java | 4 +- .../ip/service/IpAddressService.java | 6 +- .../ip/service/impl/IpAddressServiceImpl.java | 12 +-- .../framework/log/annotation/Module.java | 2 +- .../log/annotation/OperationLog.java | 4 +- .../log/annotation/OperationLogIgnore.java | 2 +- .../framework/log/aop/BaseLogAop.java | 46 ++++++------ .../framework/log/bean/OperationLogInfo.java | 2 +- .../framework/log/bean/RequestInfo.java | 4 +- .../log/controller/SysLoginLogController.java | 20 ++--- .../controller/SysOperationLogController.java | 14 ++-- .../framework/log/entity/SysLoginLog.java | 6 +- .../framework/log/entity/SysOperationLog.java | 6 +- .../framework/log/enums/OperationLogType.java | 4 +- .../log/mapper/SysLoginLogMapper.java | 4 +- .../log/mapper/SysOperationLogMapper.java | 4 +- .../log/param/SysLoginLogPageParam.java | 4 +- .../log/param/SysOperationLogPageParam.java | 4 +- .../log/service/SysLoginLogService.java | 10 +-- .../log/service/SysOperationLogService.java | 10 +-- .../service/impl/SysLoginLogServiceImpl.java | 16 ++-- .../impl/SysOperationLogServiceImpl.java | 16 ++-- .../shiro/cache/LoginRedisService.java | 8 +- .../cache/impl/LoginRedisServiceImpl.java | 28 +++---- .../shiro/convert/LoginSysUserVoConvert.java | 6 +- .../shiro/convert/ShiroMapstructConvert.java | 6 +- .../shiro/exception/ShiroConfigException.java | 6 +- .../shiro/jwt/JwtCredentialsMatcher.java | 4 +- .../framework/shiro/jwt/JwtFilter.java | 18 ++--- .../framework/shiro/jwt/JwtRealm.java | 6 +- .../framework/shiro/jwt/JwtToken.java | 6 +- .../framework/shiro/service/LoginToken.java | 2 +- .../shiro/service/LoginUsername.java | 2 +- .../shiro/service/ShiroLoginService.java | 4 +- .../service/impl/ShiroLoginServiceImpl.java | 18 ++--- .../framework/shiro/util/JwtTokenUtil.java | 6 +- .../framework/shiro/util/JwtUtil.java | 8 +- .../framework/shiro/util/SaltUtil.java | 4 +- .../framework/shiro/vo/JwtTokenRedisVo.java | 2 +- .../shiro/vo/LoginSysUserRedisVo.java | 4 +- .../framework/shiro/vo/LoginSysUserVo.java | 2 +- .../framework/util/AnsiUtil.java | 2 +- .../framework/util/BaseEnumUtil.java | 6 +- .../framework/util/BrowserUtil.java | 2 +- .../framework/util/ClientInfoUtil.java | 8 +- .../framework/util/ContentTypeUtil.java | 2 +- .../framework/util/DateUtil.java | 4 +- .../framework/util/DownloadUtil.java | 4 +- .../util/HttpServletRequestUtil.java | 2 +- .../util/HttpServletResponseUtil.java | 2 +- .../framework/util/IniUtil.java | 2 +- .../framework/util/IpUtil.java | 2 +- .../framework/util/Jackson.java | 2 +- .../framework/util/LambdaColumn.java | 2 +- .../framework/util/LoginUtil.java | 10 +-- .../framework/util/MapUtil.java | 2 +- .../framework/util/PasswordUtil.java | 2 +- .../framework/util/PhoneUtil.java | 2 +- .../framework/util/PrintApplicationInfo.java | 2 +- .../framework/util/PropertyColumnUtil.java | 2 +- .../framework/util/RedisCacheUtil.java | 2 +- .../framework/util/SpringContextUtil.java | 2 +- .../framework/util/TokenUtil.java | 2 +- .../framework/util/UUIDUtil.java | 2 +- .../framework/util/UploadUtil.java | 2 +- .../framework/util/VerificationCode.java | 2 +- .../framework/util/package-info.java | 2 +- .../resources/mapper/ip/IpAddressMapper.xml | 4 +- .../mapper/log/SysLoginLogMapper.xml | 2 +- .../mapper/log/SysOperationLogMapper.xml | 2 +- generator/pom.xml | 13 +--- .../generator/CodeGenerator.java | 14 ++-- .../generator/SpringBootPlusGenerator.java | 10 +-- .../generator/config/GeneratorConfig.java | 2 +- .../generator/config/GeneratorStrategy.java | 2 +- .../config/MybatisPlusGeneratorConfig.java | 2 +- .../generator/config/ProjectConfig.java | 4 +- .../generator/config/TableConfig.java | 2 +- .../query/SpringBootPlusMySqlQuery.java | 2 +- .../query/SpringBootPlusSqlServerQuery.java | 2 +- .../generator/constant/GeneratorConstant.java | 26 +++---- .../exception/GeneratorException.java | 6 +- .../properties/GeneratorProperties.java | 10 +-- .../resources/templates/controller.java.vm | 6 +- .../test/GeneratorPropertiesTest.java | 6 +- .../test/GeneratorTestApplication.java | 4 +- pom.xml | 74 +++---------------- scheduled/pom.xml | 8 +- .../scheduled/HelloScheduled.java | 2 +- system/pom.xml | 8 +- .../system/controller/DownloadController.java | 14 ++-- .../controller/HelloWorldController.java | 6 +- .../system/controller/LoginController.java | 22 +++--- .../system/controller/ResourceController.java | 12 +-- .../controller/SysDepartmentController.java | 24 +++--- .../controller/SysPermissionController.java | 28 +++---- .../system/controller/SysRoleController.java | 26 +++---- .../system/controller/SysUserController.java | 34 ++++----- .../system/controller/UploadController.java | 14 ++-- .../VerificationCodeController.java | 18 ++--- .../system/convert/SysDepartmentConvert.java | 6 +- .../system/convert/SysPermissionConvert.java | 6 +- .../system/convert/SysRoleConvert.java | 2 +- .../system/convert/SysUserConvert.java | 6 +- .../system/entity/SysDepartment.java | 4 +- .../system/entity/SysPermission.java | 4 +- .../system/entity/SysRole.java | 6 +- .../system/entity/SysRolePermission.java | 4 +- .../system/entity/SysUser.java | 8 +- .../system/enums/MenuLevelEnum.java | 4 +- .../system/enums/StateEnum.java | 4 +- .../system/exception/SysLoginException.java | 6 +- .../exception/VerificationCodeException.java | 6 +- .../interceptor/DownloadInterceptor.java | 2 +- .../interceptor/ResourceInterceptor.java | 2 +- .../system/interceptor/UploadInterceptor.java | 2 +- .../system/mapper/SysDepartmentMapper.java | 8 +- .../system/mapper/SysPermissionMapper.java | 8 +- .../system/mapper/SysRoleMapper.java | 8 +- .../mapper/SysRolePermissionMapper.java | 8 +- .../system/mapper/SysUserMapper.java | 8 +- .../system/param/LoginParam.java | 4 +- .../system/param/SysDepartmentPageParam.java | 4 +- .../system/param/SysPermissionPageParam.java | 4 +- .../param/sysrole/SysRolePageParam.java | 4 +- .../sysrole/SysRolePermissionPageParam.java | 4 +- .../sysrole/UpdateSysRolePermissionParam.java | 2 +- .../param/sysuser/ResetPasswordParam.java | 2 +- .../param/sysuser/SysUserPageParam.java | 4 +- .../param/sysuser/UpdatePasswordParam.java | 2 +- .../system/param/sysuser/UploadHeadParam.java | 2 +- .../system/service/LoginService.java | 8 +- .../system/service/SysDepartmentService.java | 14 ++-- .../system/service/SysPermissionService.java | 16 ++-- .../service/SysRolePermissionService.java | 6 +- .../system/service/SysRoleService.java | 14 ++-- .../system/service/SysUserService.java | 16 ++-- .../system/service/impl/LoginServiceImpl.java | 48 ++++++------ .../impl/SysDepartmentServiceImpl.java | 24 +++--- .../impl/SysPermissionServiceImpl.java | 30 ++++---- .../impl/SysRolePermissionServiceImpl.java | 14 ++-- .../service/impl/SysRoleServiceImpl.java | 36 ++++----- .../service/impl/SysUserServiceImpl.java | 38 +++++----- .../system/vo/LoginSysUserTokenVo.java | 6 +- .../system/vo/SysDepartmentQueryVo.java | 2 +- .../system/vo/SysDepartmentTreeVo.java | 2 +- .../system/vo/SysPermissionQueryVo.java | 2 +- .../system/vo/SysPermissionTreeVo.java | 2 +- .../system/vo/SysRolePermissionQueryVo.java | 2 +- .../system/vo/SysRoleQueryVo.java | 2 +- .../system/vo/SysUserQueryVo.java | 2 +- .../mapper/system/SysDepartmentMapper.xml | 6 +- .../mapper/system/SysPermissionMapper.xml | 8 +- .../resources/mapper/system/SysRoleMapper.xml | 4 +- .../mapper/system/SysRolePermissionMapper.xml | 6 +- .../resources/mapper/system/SysUserMapper.xml | 6 +- 264 files changed, 854 insertions(+), 916 deletions(-) rename admin/src/main/java/io/geekidea/{springbootplus => boot}/admin/SpringBootPlusAdminApplication.java (95%) rename admin/src/main/java/io/geekidea/{springbootplus => boot}/admin/config/AdminWebMvcConfig.java (96%) rename admin/src/main/java/io/geekidea/{springbootplus => boot}/admin/config/SecuritySecureConfig.java (98%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/SpringBootPlusApplication.java (86%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/aop/LogAop.java (88%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/JacksonConfig.java (87%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/MybatisPlusConfig.java (97%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/RedisCacheConfig.java (98%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/RedisTemplateConfig.java (98%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/RestTemplateConfig.java (97%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/ShiroConfig.java (93%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/SpringBootPlusConfig.java (94%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/SpringBootPlusCorsConfig.java (95%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/SpringBootPlusWebMvcConfig.java (89%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/Swagger2Config.java (98%) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/handler/GlobalExceptionHandler.java (92%) rename bootstrap/src/test/java/io/geekidea/{springbootplus => boot}/test/BaseTest.java (90%) rename bootstrap/src/test/java/io/geekidea/{springbootplus => boot}/test/FooBarMapperTest.java (97%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/constant/CacheKey.java (93%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/constant/CommonConstant.java (98%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/constant/CommonRedisKey.java (96%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/constant/DatePattern.java (96%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/JwtProperties.java (94%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/ShiroPermissionProperties.java (94%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/ShiroProperties.java (96%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/SpringBootPlusAopProperties.java (98%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/SpringBootPlusCorsProperties.java (97%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/SpringBootPlusFilterProperties.java (96%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/SpringBootPlusInterceptorProperties.java (97%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/SpringBootPlusProperties.java (98%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/SpringBootPlusStaticProperties.java (96%) rename config/src/main/java/io/geekidea/{springbootplus => boot}/config/properties/SwaggerProperties.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/api/ApiCode.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/api/ApiResult.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/bean/ClientInfo.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/bean/DeviceInfo.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/controller/BaseController.java (92%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/controller/CsrfController.java (85%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/controller/EnumController.java (86%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/controller/IndexController.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/entity/BaseEntity.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/enums/BaseEnum.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/exception/BusinessException.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/exception/DaoException.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/exception/GlobalErrorController.java (91%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/exception/SpringBootPlusConfigException.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/exception/SpringBootPlusException.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/param/IdParam.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/service/BaseService.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/service/impl/BaseServiceImpl.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/common/vo/EnumVo.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/converter/ConverterConfig.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/converter/StringToDateConverter.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/converter/StringToDateUtil.java (97%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/converter/StringToDoubleConverter.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/converter/StringToDoubleUtil.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/converter/StringToIntegerConverter.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/converter/StringToIntegerUtil.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/jackson/deserializer/JacksonDateDeserializer.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/jackson/deserializer/JacksonDoubleDeserializer.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/jackson/deserializer/JacksonLocalDateTimeDeserializer.java (91%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/jackson/serializer/JacksonDateSerializer.java (91%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/jackson/serializer/JacksonIntegerDeserializer.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/config/jackson/serializer/JacksonLocalDateTimeSerializer.java (92%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/bean/RequestDetail.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/filter/RequestDetailFilter.java (87%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/interceptor/PermissionInterceptor.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/pagination/BasePageOrderParam.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/pagination/BasePageParam.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/pagination/OrderMapping.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/pagination/PageInfo.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/pagination/Paging.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/util/RequestDetailThreadLocal.java (91%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/validator/EnumTypeValidator.java (80%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/validator/IdCardValidator.java (91%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/validator/PhoneValidator.java (90%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/validator/constraints/EnumType.java (86%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/validator/constraints/IdCard.java (90%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/validator/constraints/Phone.java (90%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/validator/groups/Add.java (92%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/validator/groups/Update.java (92%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/xss/XssFilter.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/xss/XssHttpServletRequestWrapper.java (97%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/xss/XssJacksonDeserializer.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/core/xss/XssJacksonSerializer.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/ip/entity/IpAddress.java (92%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/ip/mapper/IpAddressMapper.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/ip/service/IpAddressService.java (85%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/ip/service/impl/IpAddressServiceImpl.java (82%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/annotation/Module.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/annotation/OperationLog.java (91%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/annotation/OperationLogIgnore.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/aop/BaseLogAop.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/bean/OperationLogInfo.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/bean/RequestInfo.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/controller/SysLoginLogController.java (75%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/controller/SysOperationLogController.java (80%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/entity/SysLoginLog.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/entity/SysOperationLog.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/enums/OperationLogType.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/mapper/SysLoginLogMapper.java (87%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/mapper/SysOperationLogMapper.java (87%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/param/SysLoginLogPageParam.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/param/SysOperationLogPageParam.java (89%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/service/SysLoginLogService.java (81%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/service/SysOperationLogService.java (81%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/service/impl/SysLoginLogServiceImpl.java (80%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/log/service/impl/SysOperationLogServiceImpl.java (81%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/cache/LoginRedisService.java (88%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/cache/impl/LoginRedisServiceImpl.java (88%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/convert/LoginSysUserVoConvert.java (84%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/convert/ShiroMapstructConvert.java (85%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/exception/ShiroConfigException.java (84%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/jwt/JwtCredentialsMatcher.java (92%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/jwt/JwtFilter.java (90%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/jwt/JwtRealm.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/jwt/JwtToken.java (92%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/service/LoginToken.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/service/LoginUsername.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/service/ShiroLoginService.java (91%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/service/impl/ShiroLoginServiceImpl.java (85%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/util/JwtTokenUtil.java (91%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/util/JwtUtil.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/util/SaltUtil.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/vo/JwtTokenRedisVo.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/vo/LoginSysUserRedisVo.java (90%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/shiro/vo/LoginSysUserVo.java (97%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/AnsiUtil.java (97%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/BaseEnumUtil.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/BrowserUtil.java (97%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/ClientInfoUtil.java (93%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/ContentTypeUtil.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/DateUtil.java (92%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/DownloadUtil.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/HttpServletRequestUtil.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/HttpServletResponseUtil.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/IniUtil.java (97%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/IpUtil.java (97%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/Jackson.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/LambdaColumn.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/LoginUtil.java (87%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/MapUtil.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/PasswordUtil.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/PhoneUtil.java (97%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/PrintApplicationInfo.java (99%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/PropertyColumnUtil.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/RedisCacheUtil.java (96%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/SpringContextUtil.java (97%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/TokenUtil.java (95%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/UUIDUtil.java (94%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/UploadUtil.java (98%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/VerificationCode.java (99%) rename framework/src/main/java/io/geekidea/{springbootplus => boot}/framework/util/package-info.java (93%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/CodeGenerator.java (97%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/SpringBootPlusGenerator.java (92%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/config/GeneratorConfig.java (97%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/config/GeneratorStrategy.java (94%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/config/MybatisPlusGeneratorConfig.java (96%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/config/ProjectConfig.java (93%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/config/TableConfig.java (94%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/config/query/SpringBootPlusMySqlQuery.java (94%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/config/query/SpringBootPlusSqlServerQuery.java (96%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/constant/GeneratorConstant.java (70%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/exception/GeneratorException.java (84%) rename generator/src/main/java/io/geekidea/{springbootplus => boot}/generator/properties/GeneratorProperties.java (90%) rename generator/src/test/java/io/geekidea/{springbootplus => boot}/generator/test/GeneratorPropertiesTest.java (87%) rename generator/src/test/java/io/geekidea/{springbootplus => boot}/generator/test/GeneratorTestApplication.java (85%) rename scheduled/src/main/java/io/geekidea/{springbootplus => boot}/scheduled/HelloScheduled.java (95%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/DownloadController.java (85%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/HelloWorldController.java (88%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/LoginController.java (80%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/ResourceController.java (83%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/SysDepartmentController.java (87%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/SysPermissionController.java (90%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/SysRoleController.java (84%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/SysUserController.java (82%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/UploadController.java (88%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/controller/VerificationCodeController.java (87%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/convert/SysDepartmentConvert.java (88%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/convert/SysPermissionConvert.java (86%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/convert/SysRoleConvert.java (94%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/convert/SysUserConvert.java (82%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/entity/SysDepartment.java (94%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/entity/SysPermission.java (95%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/entity/SysRole.java (92%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/entity/SysRolePermission.java (94%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/entity/SysUser.java (92%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/enums/MenuLevelEnum.java (91%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/enums/StateEnum.java (89%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/exception/SysLoginException.java (84%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/exception/VerificationCodeException.java (84%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/interceptor/DownloadInterceptor.java (97%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/interceptor/ResourceInterceptor.java (97%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/interceptor/UploadInterceptor.java (97%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/mapper/SysDepartmentMapper.java (85%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/mapper/SysPermissionMapper.java (88%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/mapper/SysRoleMapper.java (86%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/mapper/SysRolePermissionMapper.java (88%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/mapper/SysUserMapper.java (86%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/LoginParam.java (91%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/SysDepartmentPageParam.java (89%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/SysPermissionPageParam.java (89%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/sysrole/SysRolePageParam.java (91%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/sysrole/SysRolePermissionPageParam.java (89%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/sysrole/UpdateSysRolePermissionParam.java (95%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/sysuser/ResetPasswordParam.java (96%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/sysuser/SysUserPageParam.java (92%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/sysuser/UpdatePasswordParam.java (96%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/param/sysuser/UploadHeadParam.java (96%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/LoginService.java (86%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/SysDepartmentService.java (83%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/SysPermissionService.java (88%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/SysRolePermissionService.java (93%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/SysRoleService.java (83%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/SysUserService.java (84%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/impl/LoginServiceImpl.java (83%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/impl/SysDepartmentServiceImpl.java (85%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/impl/SysPermissionServiceImpl.java (88%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/impl/SysRolePermissionServiceImpl.java (90%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/impl/SysRoleServiceImpl.java (87%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/impl/SysUserServiceImpl.java (87%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/vo/LoginSysUserTokenVo.java (86%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/vo/SysDepartmentQueryVo.java (97%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/vo/SysDepartmentTreeVo.java (97%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/vo/SysPermissionQueryVo.java (97%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/vo/SysPermissionTreeVo.java (97%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/vo/SysRolePermissionQueryVo.java (97%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/vo/SysRoleQueryVo.java (97%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/vo/SysUserQueryVo.java (98%) diff --git a/README-zh.md b/README-zh.md index e78fe60..5d1a63e 100644 --- a/README-zh.md +++ b/README-zh.md @@ -333,8 +333,8 @@ spring-boot-plus/bootstrap/src/main/java/io/geekidea/springbootplus/SpringBootPl @EnableTransactionManagement @EnableConfigurationProperties @ServletComponentScan -@MapperScan({"io.geekidea.springbootplus.**.mapper", "com.example.**.mapper"}) -@SpringBootApplication(scanBasePackages = {"io.geekidea.springbootplus", "com.example"}) +@MapperScan({"io.geekidea.boot.**.mapper", "com.example.**.mapper"}) +@SpringBootApplication(scanBasePackages = {"io.geekidea.boot", "com.example"}) public class SpringBootPlusApplication { public static void main(String[] args) { diff --git a/README.md b/README.md index 47fde71..7ec23a7 100644 --- a/README.md +++ b/README.md @@ -335,8 +335,8 @@ spring-boot-plus/bootstrap/src/main/java/io/geekidea/springbootplus/SpringBootPl @EnableTransactionManagement @EnableConfigurationProperties @ServletComponentScan -@MapperScan({"io.geekidea.springbootplus.**.mapper", "com.example.**.mapper"}) -@SpringBootApplication(scanBasePackages = {"io.geekidea.springbootplus", "com.example"}) +@MapperScan({"io.geekidea.boot.**.mapper", "com.example.**.mapper"}) +@SpringBootApplication(scanBasePackages = {"io.geekidea.boot", "com.example"}) public class SpringBootPlusApplication { public static void main(String[] args) { diff --git a/admin/pom.xml b/admin/pom.xml index fca4af8..d981fbf 100644 --- a/admin/pom.xml +++ b/admin/pom.xml @@ -20,9 +20,9 @@ 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT admin diff --git a/admin/src/main/java/io/geekidea/springbootplus/admin/SpringBootPlusAdminApplication.java b/admin/src/main/java/io/geekidea/boot/admin/SpringBootPlusAdminApplication.java similarity index 95% rename from admin/src/main/java/io/geekidea/springbootplus/admin/SpringBootPlusAdminApplication.java rename to admin/src/main/java/io/geekidea/boot/admin/SpringBootPlusAdminApplication.java index 0096867..0be70e4 100644 --- a/admin/src/main/java/io/geekidea/springbootplus/admin/SpringBootPlusAdminApplication.java +++ b/admin/src/main/java/io/geekidea/boot/admin/SpringBootPlusAdminApplication.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.admin; +package io.geekidea.boot.admin; import de.codecentric.boot.admin.server.config.EnableAdminServer; import lombok.extern.slf4j.Slf4j; @@ -43,6 +43,7 @@ public class SpringBootPlusAdminApplication { ConfigurableEnvironment environment = context.getEnvironment(); String serverPort = environment.getProperty("server.port"); log.info("SpringBootAdmin: http://localhost:" + serverPort); + log.info("登录账号密码: admin/admin"); } } diff --git a/admin/src/main/java/io/geekidea/springbootplus/admin/config/AdminWebMvcConfig.java b/admin/src/main/java/io/geekidea/boot/admin/config/AdminWebMvcConfig.java similarity index 96% rename from admin/src/main/java/io/geekidea/springbootplus/admin/config/AdminWebMvcConfig.java rename to admin/src/main/java/io/geekidea/boot/admin/config/AdminWebMvcConfig.java index 7011238..8cc3ca6 100644 --- a/admin/src/main/java/io/geekidea/springbootplus/admin/config/AdminWebMvcConfig.java +++ b/admin/src/main/java/io/geekidea/boot/admin/config/AdminWebMvcConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.admin.config; +package io.geekidea.boot.admin.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; diff --git a/admin/src/main/java/io/geekidea/springbootplus/admin/config/SecuritySecureConfig.java b/admin/src/main/java/io/geekidea/boot/admin/config/SecuritySecureConfig.java similarity index 98% rename from admin/src/main/java/io/geekidea/springbootplus/admin/config/SecuritySecureConfig.java rename to admin/src/main/java/io/geekidea/boot/admin/config/SecuritySecureConfig.java index 1d7df82..4529dc7 100644 --- a/admin/src/main/java/io/geekidea/springbootplus/admin/config/SecuritySecureConfig.java +++ b/admin/src/main/java/io/geekidea/boot/admin/config/SecuritySecureConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.admin.config; +package io.geekidea.boot.admin.config; import de.codecentric.boot.admin.server.config.AdminServerProperties; import org.springframework.beans.factory.annotation.Value; diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml index 60b39a7..4098a7e 100644 --- a/bootstrap/pom.xml +++ b/bootstrap/pom.xml @@ -20,9 +20,9 @@ 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT bootstrap @@ -36,19 +36,19 @@ ${spring-boot-admin.version} - io.geekidea.springbootplus + io.geekidea.boot framework - io.geekidea.springbootplus + io.geekidea.boot example - io.geekidea.springbootplus + io.geekidea.boot system - io.geekidea.springbootplus + io.geekidea.boot scheduled diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/SpringBootPlusApplication.java b/bootstrap/src/main/java/io/geekidea/boot/SpringBootPlusApplication.java similarity index 86% rename from bootstrap/src/main/java/io/geekidea/springbootplus/SpringBootPlusApplication.java rename to bootstrap/src/main/java/io/geekidea/boot/SpringBootPlusApplication.java index 82dda08..ccc44f3 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/SpringBootPlusApplication.java +++ b/bootstrap/src/main/java/io/geekidea/boot/SpringBootPlusApplication.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus; +package io.geekidea.boot; -import io.geekidea.springbootplus.framework.util.PrintApplicationInfo; +import io.geekidea.boot.framework.util.PrintApplicationInfo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -38,8 +38,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @EnableConfigurationProperties @ServletComponentScan -@MapperScan({"io.geekidea.springbootplus.**.mapper", "com.example.**.mapper"}) -@SpringBootApplication(scanBasePackages = {"io.geekidea.springbootplus", "com.example"}) +@MapperScan({"io.geekidea.boot.**.mapper", "com.example.**.mapper"}) +@SpringBootApplication(scanBasePackages = {"io.geekidea.boot", "com.example"}) public class SpringBootPlusApplication { public static void main(String[] args) { diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/aop/LogAop.java b/bootstrap/src/main/java/io/geekidea/boot/aop/LogAop.java similarity index 88% rename from bootstrap/src/main/java/io/geekidea/springbootplus/aop/LogAop.java rename to bootstrap/src/main/java/io/geekidea/boot/aop/LogAop.java index 31b6ab2..b8a2416 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/aop/LogAop.java +++ b/bootstrap/src/main/java/io/geekidea/boot/aop/LogAop.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.geekidea.springbootplus.aop; +package io.geekidea.boot.aop; -import io.geekidea.springbootplus.framework.log.aop.BaseLogAop; -import io.geekidea.springbootplus.framework.log.bean.OperationLogInfo; -import io.geekidea.springbootplus.framework.log.bean.RequestInfo; +import io.geekidea.boot.framework.log.aop.BaseLogAop; +import io.geekidea.boot.framework.log.bean.OperationLogInfo; +import io.geekidea.boot.framework.log.bean.RequestInfo; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; @@ -47,7 +47,7 @@ public class LogAop extends BaseLogAop { * 切点 */ private static final String POINTCUT = - "execution(public * io.geekidea.springbootplus..*.controller..*.*(..)) || " + + "execution(public * io.geekidea.boot..*.controller..*.*(..)) || " + "execution(public * com.example..*.controller..*.*(..))"; @Around(POINTCUT) diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/JacksonConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/JacksonConfig.java similarity index 87% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/JacksonConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/JacksonConfig.java index 9efd977..370ba48 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/JacksonConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/JacksonConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -28,13 +28,13 @@ import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; -import io.geekidea.springbootplus.config.constant.DatePattern; -import io.geekidea.springbootplus.framework.config.jackson.deserializer.JacksonDateDeserializer; -import io.geekidea.springbootplus.framework.config.jackson.deserializer.JacksonDoubleDeserializer; -import io.geekidea.springbootplus.framework.config.jackson.serializer.JacksonDateSerializer; -import io.geekidea.springbootplus.framework.config.jackson.serializer.JacksonIntegerDeserializer; -import io.geekidea.springbootplus.framework.core.xss.XssJacksonDeserializer; -import io.geekidea.springbootplus.framework.core.xss.XssJacksonSerializer; +import io.geekidea.boot.config.constant.DatePattern; +import io.geekidea.boot.framework.config.jackson.deserializer.JacksonDateDeserializer; +import io.geekidea.boot.framework.config.jackson.deserializer.JacksonDoubleDeserializer; +import io.geekidea.boot.framework.config.jackson.serializer.JacksonDateSerializer; +import io.geekidea.boot.framework.config.jackson.serializer.JacksonIntegerDeserializer; +import io.geekidea.boot.framework.core.xss.XssJacksonDeserializer; +import io.geekidea.boot.framework.core.xss.XssJacksonSerializer; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/MybatisPlusConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/MybatisPlusConfig.java similarity index 97% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/MybatisPlusConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/MybatisPlusConfig.java index fe7f3d5..e0eef01 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/MybatisPlusConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/MybatisPlusConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/RedisCacheConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/RedisCacheConfig.java similarity index 98% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/RedisCacheConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/RedisCacheConfig.java index 2a1e8ff..650f543 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/RedisCacheConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/RedisCacheConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/RedisTemplateConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/RedisTemplateConfig.java similarity index 98% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/RedisTemplateConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/RedisTemplateConfig.java index 7e66bab..833d8eb 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/RedisTemplateConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/RedisTemplateConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/RestTemplateConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/RestTemplateConfig.java similarity index 97% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/RestTemplateConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/RestTemplateConfig.java index baf2b99..186bafd 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/RestTemplateConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/RestTemplateConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/ShiroConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/ShiroConfig.java similarity index 93% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/ShiroConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/ShiroConfig.java index e3598f5..899fdf8 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/ShiroConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/ShiroConfig.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; import com.alibaba.fastjson.JSON; -import io.geekidea.springbootplus.config.properties.JwtProperties; -import io.geekidea.springbootplus.config.properties.ShiroPermissionProperties; -import io.geekidea.springbootplus.config.properties.ShiroProperties; -import io.geekidea.springbootplus.framework.shiro.cache.LoginRedisService; -import io.geekidea.springbootplus.framework.shiro.exception.ShiroConfigException; -import io.geekidea.springbootplus.framework.shiro.jwt.JwtCredentialsMatcher; -import io.geekidea.springbootplus.framework.shiro.jwt.JwtFilter; -import io.geekidea.springbootplus.framework.shiro.jwt.JwtRealm; -import io.geekidea.springbootplus.framework.shiro.service.ShiroLoginService; -import io.geekidea.springbootplus.framework.util.IniUtil; +import io.geekidea.boot.config.properties.JwtProperties; +import io.geekidea.boot.config.properties.ShiroPermissionProperties; +import io.geekidea.boot.config.properties.ShiroProperties; +import io.geekidea.boot.framework.shiro.cache.LoginRedisService; +import io.geekidea.boot.framework.shiro.exception.ShiroConfigException; +import io.geekidea.boot.framework.shiro.jwt.JwtCredentialsMatcher; +import io.geekidea.boot.framework.shiro.jwt.JwtFilter; +import io.geekidea.boot.framework.shiro.jwt.JwtRealm; +import io.geekidea.boot.framework.shiro.service.ShiroLoginService; +import io.geekidea.boot.framework.util.IniUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusConfig.java similarity index 94% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusConfig.java index 4cfd100..611653b 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusConfig.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; import lombok.extern.slf4j.Slf4j; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusCorsConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusCorsConfig.java similarity index 95% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusCorsConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusCorsConfig.java index 077f512..e9a35e7 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusCorsConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusCorsConfig.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; -import io.geekidea.springbootplus.config.properties.SpringBootPlusCorsProperties; +import io.geekidea.boot.config.properties.SpringBootPlusCorsProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.web.servlet.FilterRegistrationBean; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusWebMvcConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java similarity index 89% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusWebMvcConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java index 6749845..bc86f3c 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusWebMvcConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; import com.alibaba.fastjson.JSON; -import io.geekidea.springbootplus.config.properties.SpringBootPlusFilterProperties; -import io.geekidea.springbootplus.config.properties.SpringBootPlusInterceptorProperties; -import io.geekidea.springbootplus.config.properties.SpringBootPlusProperties; -import io.geekidea.springbootplus.framework.core.filter.RequestDetailFilter; -import io.geekidea.springbootplus.framework.core.interceptor.PermissionInterceptor; -import io.geekidea.springbootplus.framework.core.xss.XssFilter; -import io.geekidea.springbootplus.framework.util.IniUtil; -import io.geekidea.springbootplus.system.interceptor.DownloadInterceptor; -import io.geekidea.springbootplus.system.interceptor.ResourceInterceptor; -import io.geekidea.springbootplus.system.interceptor.UploadInterceptor; +import io.geekidea.boot.config.properties.SpringBootPlusFilterProperties; +import io.geekidea.boot.config.properties.SpringBootPlusInterceptorProperties; +import io.geekidea.boot.config.properties.SpringBootPlusProperties; +import io.geekidea.boot.framework.core.filter.RequestDetailFilter; +import io.geekidea.boot.framework.core.interceptor.PermissionInterceptor; +import io.geekidea.boot.framework.core.xss.XssFilter; +import io.geekidea.boot.framework.util.IniUtil; +import io.geekidea.boot.system.interceptor.DownloadInterceptor; +import io.geekidea.boot.system.interceptor.ResourceInterceptor; +import io.geekidea.boot.system.interceptor.UploadInterceptor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/Swagger2Config.java b/bootstrap/src/main/java/io/geekidea/boot/config/Swagger2Config.java similarity index 98% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/Swagger2Config.java rename to bootstrap/src/main/java/io/geekidea/boot/config/Swagger2Config.java index ac027f3..c1f7894 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/Swagger2Config.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/Swagger2Config.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; import com.fasterxml.jackson.databind.introspect.AnnotatedField; import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; @@ -22,8 +22,8 @@ import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Predicate; -import io.geekidea.springbootplus.config.properties.SwaggerProperties; -import io.geekidea.springbootplus.framework.common.exception.SpringBootPlusConfigException; +import io.geekidea.boot.config.properties.SwaggerProperties; +import io.geekidea.boot.framework.common.exception.SpringBootPlusConfigException; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.extern.slf4j.Slf4j; diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/handler/GlobalExceptionHandler.java b/bootstrap/src/main/java/io/geekidea/boot/handler/GlobalExceptionHandler.java similarity index 92% rename from bootstrap/src/main/java/io/geekidea/springbootplus/handler/GlobalExceptionHandler.java rename to bootstrap/src/main/java/io/geekidea/boot/handler/GlobalExceptionHandler.java index 9c8828d..c3757cf 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/handler/GlobalExceptionHandler.java +++ b/bootstrap/src/main/java/io/geekidea/boot/handler/GlobalExceptionHandler.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package io.geekidea.springbootplus.handler; +package io.geekidea.boot.handler; import com.alibaba.fastjson.JSON; import com.auth0.jwt.exceptions.JWTDecodeException; -import io.geekidea.springbootplus.framework.common.api.ApiCode; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.exception.BusinessException; -import io.geekidea.springbootplus.framework.common.exception.DaoException; -import io.geekidea.springbootplus.framework.common.exception.SpringBootPlusException; -import io.geekidea.springbootplus.framework.core.bean.RequestDetail; -import io.geekidea.springbootplus.framework.core.util.RequestDetailThreadLocal; -import io.geekidea.springbootplus.system.exception.SysLoginException; -import io.geekidea.springbootplus.system.exception.VerificationCodeException; +import io.geekidea.boot.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.exception.BusinessException; +import io.geekidea.boot.framework.common.exception.DaoException; +import io.geekidea.boot.framework.common.exception.SpringBootPlusException; +import io.geekidea.boot.framework.core.bean.RequestDetail; +import io.geekidea.boot.framework.core.util.RequestDetailThreadLocal; +import io.geekidea.boot.system.exception.SysLoginException; +import io.geekidea.boot.system.exception.VerificationCodeException; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authz.UnauthenticatedException; diff --git a/bootstrap/src/test/java/io/geekidea/springbootplus/test/BaseTest.java b/bootstrap/src/test/java/io/geekidea/boot/test/BaseTest.java similarity index 90% rename from bootstrap/src/test/java/io/geekidea/springbootplus/test/BaseTest.java rename to bootstrap/src/test/java/io/geekidea/boot/test/BaseTest.java index 22dcddf..3c97432 100644 --- a/bootstrap/src/test/java/io/geekidea/springbootplus/test/BaseTest.java +++ b/bootstrap/src/test/java/io/geekidea/boot/test/BaseTest.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.test; +package io.geekidea.boot.test; -import io.geekidea.springbootplus.SpringBootPlusApplication; +import io.geekidea.boot.SpringBootPlusApplication; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; diff --git a/bootstrap/src/test/java/io/geekidea/springbootplus/test/FooBarMapperTest.java b/bootstrap/src/test/java/io/geekidea/boot/test/FooBarMapperTest.java similarity index 97% rename from bootstrap/src/test/java/io/geekidea/springbootplus/test/FooBarMapperTest.java rename to bootstrap/src/test/java/io/geekidea/boot/test/FooBarMapperTest.java index f53872c..a827743 100644 --- a/bootstrap/src/test/java/io/geekidea/springbootplus/test/FooBarMapperTest.java +++ b/bootstrap/src/test/java/io/geekidea/boot/test/FooBarMapperTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.test; +package io.geekidea.boot.test; import com.example.foobar.entity.FooBar; import com.example.foobar.mapper.FooBarMapper; diff --git a/config/pom.xml b/config/pom.xml index 0280db6..8b5698e 100644 --- a/config/pom.xml +++ b/config/pom.xml @@ -21,9 +21,9 @@ 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT config diff --git a/config/src/main/java/io/geekidea/springbootplus/config/constant/CacheKey.java b/config/src/main/java/io/geekidea/boot/config/constant/CacheKey.java similarity index 93% rename from config/src/main/java/io/geekidea/springbootplus/config/constant/CacheKey.java rename to config/src/main/java/io/geekidea/boot/config/constant/CacheKey.java index 8d348c8..7585cfa 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/constant/CacheKey.java +++ b/config/src/main/java/io/geekidea/boot/config/constant/CacheKey.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.constant; +package io.geekidea.boot.config.constant; /** * 可排序查询参数对象 diff --git a/config/src/main/java/io/geekidea/springbootplus/config/constant/CommonConstant.java b/config/src/main/java/io/geekidea/boot/config/constant/CommonConstant.java similarity index 98% rename from config/src/main/java/io/geekidea/springbootplus/config/constant/CommonConstant.java rename to config/src/main/java/io/geekidea/boot/config/constant/CommonConstant.java index 634d3d2..78999d4 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/constant/CommonConstant.java +++ b/config/src/main/java/io/geekidea/boot/config/constant/CommonConstant.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.constant; +package io.geekidea.boot.config.constant; /** * 公共常量 diff --git a/config/src/main/java/io/geekidea/springbootplus/config/constant/CommonRedisKey.java b/config/src/main/java/io/geekidea/boot/config/constant/CommonRedisKey.java similarity index 96% rename from config/src/main/java/io/geekidea/springbootplus/config/constant/CommonRedisKey.java rename to config/src/main/java/io/geekidea/boot/config/constant/CommonRedisKey.java index f3d79bd..77cdae7 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/constant/CommonRedisKey.java +++ b/config/src/main/java/io/geekidea/boot/config/constant/CommonRedisKey.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.constant; +package io.geekidea.boot.config.constant; /** *

diff --git a/config/src/main/java/io/geekidea/springbootplus/config/constant/DatePattern.java b/config/src/main/java/io/geekidea/boot/config/constant/DatePattern.java similarity index 96% rename from config/src/main/java/io/geekidea/springbootplus/config/constant/DatePattern.java rename to config/src/main/java/io/geekidea/boot/config/constant/DatePattern.java index a7d5735..3478c65 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/constant/DatePattern.java +++ b/config/src/main/java/io/geekidea/boot/config/constant/DatePattern.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.constant; +package io.geekidea.boot.config.constant; /** *

diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/JwtProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/JwtProperties.java similarity index 94% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/JwtProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/JwtProperties.java index c66377e..8d04832 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/JwtProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/JwtProperties.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; -import io.geekidea.springbootplus.config.constant.CommonConstant; +import io.geekidea.boot.config.constant.CommonConstant; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/ShiroPermissionProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/ShiroPermissionProperties.java similarity index 94% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/ShiroPermissionProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/ShiroPermissionProperties.java index 39847e9..1754442 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/ShiroPermissionProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/ShiroPermissionProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; import lombok.Data; diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/ShiroProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/ShiroProperties.java similarity index 96% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/ShiroProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/ShiroProperties.java index 3acc6ba..bcf9e35 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/ShiroProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/ShiroProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusAopProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusAopProperties.java similarity index 98% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusAopProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusAopProperties.java index d294b60..d3a0872 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusAopProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusAopProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusCorsProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusCorsProperties.java similarity index 97% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusCorsProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusCorsProperties.java index b6eda2b..83585a6 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusCorsProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusCorsProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusFilterProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusFilterProperties.java similarity index 96% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusFilterProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusFilterProperties.java index 16fc40d..258c69d 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusFilterProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusFilterProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusInterceptorProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusInterceptorProperties.java similarity index 97% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusInterceptorProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusInterceptorProperties.java index 5224a78..1855b5e 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusInterceptorProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusInterceptorProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusProperties.java similarity index 98% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusProperties.java index b486ad9..b0c75dd 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; import lombok.Data; diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusStaticProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusStaticProperties.java similarity index 96% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusStaticProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusStaticProperties.java index 5e338c8..94cc001 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/SpringBootPlusStaticProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/SpringBootPlusStaticProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; import lombok.Data; import lombok.extern.slf4j.Slf4j; diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/SwaggerProperties.java b/config/src/main/java/io/geekidea/boot/config/properties/SwaggerProperties.java similarity index 98% rename from config/src/main/java/io/geekidea/springbootplus/config/properties/SwaggerProperties.java rename to config/src/main/java/io/geekidea/boot/config/properties/SwaggerProperties.java index c400475..a5a3a34 100644 --- a/config/src/main/java/io/geekidea/springbootplus/config/properties/SwaggerProperties.java +++ b/config/src/main/java/io/geekidea/boot/config/properties/SwaggerProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.config.properties; +package io.geekidea.boot.config.properties; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index 831a00d..a90e687 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -236,7 +236,7 @@ mybatis-plus: # 启动时是否检查MyBatis XML文件是否存在 check-config-location: true # 支持统配符 * 或者 ; 分割 - typeEnumsPackage: io.geekidea.springbootplus.*.enums + typeEnumsPackage: io.geekidea.boot.*.enums # MyBatis原生配置 configuration: # 字段名称下划线转驼峰命名 @@ -302,7 +302,7 @@ spring-boot-plus: enable: true base: # 扫描的包,多个包使用逗号隔开 - package: io.geekidea.springbootplus,com.example + package: io.geekidea.boot,com.example contact: email: geekidea@qq.com name: springboot.plus diff --git a/config/src/main/resources/config/logback.xml b/config/src/main/resources/config/logback.xml index dbe0c96..df5b4ce 100644 --- a/config/src/main/resources/config/logback.xml +++ b/config/src/main/resources/config/logback.xml @@ -89,7 +89,7 @@ - + diff --git a/distribution/pom.xml b/distribution/pom.xml index 85b89ce..3ecb1e0 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -21,9 +21,9 @@ 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT distribution @@ -35,7 +35,7 @@ release - io.geekidea.springbootplus + io.geekidea.boot bootstrap diff --git a/distribution/release.xml b/distribution/release.xml index b46646f..81ce21d 100644 --- a/distribution/release.xml +++ b/distribution/release.xml @@ -67,7 +67,7 @@ true - io.geekidea.springbootplus:bootstrap + io.geekidea.boot:bootstrap diff --git a/docs/db/mysql_spring_boot_plus.sql b/docs/db/mysql_spring_boot_plus.sql index 1c9f616..d05adc6 100644 --- a/docs/db/mysql_spring_boot_plus.sql +++ b/docs/db/mysql_spring_boot_plus.sql @@ -406,5 +406,5 @@ INSERT INTO sys_login_log (id, request_id, username, ip, area, operator, token, INSERT INTO sys_login_log (id, request_id, username, ip, area, operator, token, type, success, code, exception_message, user_agent, browser_name, browser_version, engine_name, engine_version, os_name, platform_name, mobile, device_name, device_model, remark, create_time, update_time) VALUES (3, '1242814069371625474', 'admin', '127.0.0.1', '本机地址', null, null, 1, 0, null, '用户名或密码错误', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 'Chrome', '80.0.3987.149', 'Webkit', '537.36', 'OSX', 'Mac', 0, null, null, null, '2020-03-25 22:02:25', null); INSERT INTO sys_login_log (id, request_id, username, ip, area, operator, token, type, success, code, exception_message, user_agent, browser_name, browser_version, engine_name, engine_version, os_name, platform_name, mobile, device_name, device_model, remark, create_time, update_time) VALUES (4, '1242814192096960513', null, '127.0.0.1', '本机地址', null, null, 2, 0, null, 'token不能为空', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 'Chrome', '80.0.3987.149', 'Webkit', '537.36', 'OSX', 'Mac', 0, null, null, null, '2020-03-25 22:02:54', null); -INSERT INTO sys_operation_log (id, request_id, user_id, user_name, name, ip, area, operator, path, module, class_name, method_name, request_method, content_type, request_body, param, token, type, success, code, message, exception_name, exception_message, browser_name, browser_version, engine_name, engine_version, os_name, platform_name, mobile, device_name, device_model, remark, create_time, update_time) VALUES (1, '1242805276474634241', null, null, 'helloWorld', '127.0.0.1', '本机地址', null, '/api/hello/world', null, 'io.geekidea.springbootplus.system.controller.HelloWorldController', 'helloWorld', 'GET', null, 0, null, null, 0, 1, 200, '操作成功', null, null, 'Chrome', '80.0.3987.149', 'Webkit', '537.36', 'OSX', 'Mac', 0, null, null, '', '2020-03-25 21:27:22', null); +INSERT INTO sys_operation_log (id, request_id, user_id, user_name, name, ip, area, operator, path, module, class_name, method_name, request_method, content_type, request_body, param, token, type, success, code, message, exception_name, exception_message, browser_name, browser_version, engine_name, engine_version, os_name, platform_name, mobile, device_name, device_model, remark, create_time, update_time) VALUES (1, '1242805276474634241', null, null, 'helloWorld', '127.0.0.1', '本机地址', null, '/api/hello/world', null, 'io.geekidea.boot.system.controller.HelloWorldController', 'helloWorld', 'GET', null, 0, null, null, 0, 1, 200, '操作成功', null, null, 'Chrome', '80.0.3987.149', 'Webkit', '537.36', 'OSX', 'Mac', 0, null, null, '', '2020-03-25 21:27:22', null); INSERT INTO sys_operation_log (id, request_id, user_id, user_name, name, ip, area, operator, path, module, class_name, method_name, request_method, content_type, request_body, param, token, type, success, code, message, exception_name, exception_message, browser_name, browser_version, engine_name, engine_version, os_name, platform_name, mobile, device_name, device_model, remark, create_time, update_time) VALUES (2, '1242820418688049153', null, null, 'FooBar分页列表', '127.0.0.1', '本机地址', null, '/api/fooBar/getPageList', 'foobar', 'com.example.foobar.controller.FooBarController', 'getFooBarPageList', 'POST', 'application/json', 1, '{"pageIndex":1,"pageSize":10}', null, 7, 1, 200, '操作成功', null, null, 'Chrome', '80.0.3987.149', 'Webkit', '537.36', 'OSX', 'Mac', 0, null, null, '', '2020-03-25 22:27:33', null); diff --git a/example/pom.xml b/example/pom.xml index afed3bd..9929884 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -21,9 +21,9 @@ 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT example @@ -32,7 +32,7 @@ - io.geekidea.springbootplus + io.geekidea.boot framework diff --git a/example/src/main/java/com/example/foobar/controller/FooBarController.java b/example/src/main/java/com/example/foobar/controller/FooBarController.java index a5e98a8..97d6059 100644 --- a/example/src/main/java/com/example/foobar/controller/FooBarController.java +++ b/example/src/main/java/com/example/foobar/controller/FooBarController.java @@ -19,14 +19,14 @@ package com.example.foobar.controller; import com.example.foobar.entity.FooBar; import com.example.foobar.param.FooBarPageParam; import com.example.foobar.service.FooBarService; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.controller.BaseController; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.core.validator.groups.Add; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/example/src/main/java/com/example/foobar/entity/FooBar.java b/example/src/main/java/com/example/foobar/entity/FooBar.java index 42df4c6..db4fcaa 100644 --- a/example/src/main/java/com/example/foobar/entity/FooBar.java +++ b/example/src/main/java/com/example/foobar/entity/FooBar.java @@ -19,8 +19,8 @@ package com.example.foobar.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.Version; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.core.validator.groups.Update; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/example/src/main/java/com/example/foobar/param/FooBarPageParam.java b/example/src/main/java/com/example/foobar/param/FooBarPageParam.java index 8baca64..1d30469 100644 --- a/example/src/main/java/com/example/foobar/param/FooBarPageParam.java +++ b/example/src/main/java/com/example/foobar/param/FooBarPageParam.java @@ -16,7 +16,7 @@ package com.example.foobar.param; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/example/src/main/java/com/example/foobar/service/FooBarService.java b/example/src/main/java/com/example/foobar/service/FooBarService.java index 1f9d085..2347ecb 100644 --- a/example/src/main/java/com/example/foobar/service/FooBarService.java +++ b/example/src/main/java/com/example/foobar/service/FooBarService.java @@ -18,8 +18,8 @@ package com.example.foobar.service; import com.example.foobar.entity.FooBar; import com.example.foobar.param.FooBarPageParam; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.core.pagination.Paging; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; /** * FooBar 服务类 diff --git a/example/src/main/java/com/example/foobar/service/impl/FooBarServiceImpl.java b/example/src/main/java/com/example/foobar/service/impl/FooBarServiceImpl.java index 5488a12..2057c3b 100644 --- a/example/src/main/java/com/example/foobar/service/impl/FooBarServiceImpl.java +++ b/example/src/main/java/com/example/foobar/service/impl/FooBarServiceImpl.java @@ -24,10 +24,10 @@ import com.example.foobar.entity.FooBar; import com.example.foobar.mapper.FooBarMapper; import com.example.foobar.param.FooBarPageParam; import com.example.foobar.service.FooBarService; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.framework.core.pagination.OrderMapping; -import io.geekidea.springbootplus.framework.core.pagination.PageInfo; -import io.geekidea.springbootplus.framework.core.pagination.Paging; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.OrderMapping; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import io.geekidea.boot.framework.core.pagination.Paging; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/example/src/main/java/com/example/order/controller/ExampleOrderController.java b/example/src/main/java/com/example/order/controller/ExampleOrderController.java index f5de7e0..4bfd3d3 100644 --- a/example/src/main/java/com/example/order/controller/ExampleOrderController.java +++ b/example/src/main/java/com/example/order/controller/ExampleOrderController.java @@ -20,17 +20,15 @@ import com.example.order.entity.ExampleOrder; import com.example.order.service.ExampleOrderService; import lombok.extern.slf4j.Slf4j; import com.example.order.param.ExampleOrderPageParam; -import io.geekidea.springbootplus.framework.common.controller.BaseController; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.common.param.IdParam; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.framework.core.validator.groups.Add; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; import org.springframework.validation.annotation.Validated; -import org.apache.shiro.authz.annotation.RequiresPermissions; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/example/src/main/java/com/example/order/entity/ExampleOrder.java b/example/src/main/java/com/example/order/entity/ExampleOrder.java index e7a0290..e6c13c2 100644 --- a/example/src/main/java/com/example/order/entity/ExampleOrder.java +++ b/example/src/main/java/com/example/order/entity/ExampleOrder.java @@ -16,7 +16,7 @@ package com.example.order.entity; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.IdType; import java.util.Date; import com.baomidou.mybatisplus.annotation.Version; @@ -28,7 +28,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.core.validator.groups.Update; /** * 订单示例 diff --git a/example/src/main/java/com/example/order/param/ExampleOrderPageParam.java b/example/src/main/java/com/example/order/param/ExampleOrderPageParam.java index 6b25f18..a30f259 100644 --- a/example/src/main/java/com/example/order/param/ExampleOrderPageParam.java +++ b/example/src/main/java/com/example/order/param/ExampleOrderPageParam.java @@ -16,7 +16,7 @@ package com.example.order.param; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/example/src/main/java/com/example/order/service/ExampleOrderService.java b/example/src/main/java/com/example/order/service/ExampleOrderService.java index 3246ca7..270b9e3 100644 --- a/example/src/main/java/com/example/order/service/ExampleOrderService.java +++ b/example/src/main/java/com/example/order/service/ExampleOrderService.java @@ -18,8 +18,8 @@ package com.example.order.service; import com.example.order.entity.ExampleOrder; import com.example.order.param.ExampleOrderPageParam; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.core.pagination.Paging; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; /** * 订单示例 服务类 diff --git a/example/src/main/java/com/example/order/service/impl/ExampleOrderServiceImpl.java b/example/src/main/java/com/example/order/service/impl/ExampleOrderServiceImpl.java index f3b0880..4ccd4d6 100644 --- a/example/src/main/java/com/example/order/service/impl/ExampleOrderServiceImpl.java +++ b/example/src/main/java/com/example/order/service/impl/ExampleOrderServiceImpl.java @@ -21,9 +21,9 @@ import com.example.order.mapper.ExampleOrderMapper; import com.example.order.service.ExampleOrderService; import com.example.order.param.ExampleOrderPageParam; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.core.pagination.PageInfo; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/framework/pom.xml b/framework/pom.xml index 7412c99..428fbaa 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -21,9 +21,9 @@ 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT framework @@ -93,7 +93,7 @@ - io.geekidea.springbootplus + io.geekidea.boot config diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/api/ApiCode.java b/framework/src/main/java/io/geekidea/boot/framework/common/api/ApiCode.java similarity index 98% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/api/ApiCode.java rename to framework/src/main/java/io/geekidea/boot/framework/common/api/ApiCode.java index 1e0607f..9863b4c 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/api/ApiCode.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/api/ApiCode.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.api; +package io.geekidea.boot.framework.common.api; /** *

diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/api/ApiResult.java b/framework/src/main/java/io/geekidea/boot/framework/common/api/ApiResult.java similarity index 98% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/api/ApiResult.java rename to framework/src/main/java/io/geekidea/boot/framework/common/api/ApiResult.java index e076b8e..491ca1c 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/api/ApiResult.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/api/ApiResult.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.api; +package io.geekidea.boot.framework.common.api; import com.alibaba.fastjson.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonFormat; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/bean/ClientInfo.java b/framework/src/main/java/io/geekidea/boot/framework/common/bean/ClientInfo.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/bean/ClientInfo.java rename to framework/src/main/java/io/geekidea/boot/framework/common/bean/ClientInfo.java index 6cafa0e..7e055bc 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/bean/ClientInfo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/bean/ClientInfo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.bean; +package io.geekidea.boot.framework.common.bean; import lombok.Data; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/bean/DeviceInfo.java b/framework/src/main/java/io/geekidea/boot/framework/common/bean/DeviceInfo.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/bean/DeviceInfo.java rename to framework/src/main/java/io/geekidea/boot/framework/common/bean/DeviceInfo.java index cb08788..c7cb76f 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/bean/DeviceInfo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/bean/DeviceInfo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.bean; +package io.geekidea.boot.framework.common.bean; import lombok.Data; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/BaseController.java b/framework/src/main/java/io/geekidea/boot/framework/common/controller/BaseController.java similarity index 92% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/BaseController.java rename to framework/src/main/java/io/geekidea/boot/framework/common/controller/BaseController.java index a37217e..e300df4 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/BaseController.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/controller/BaseController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.controller; +package io.geekidea.boot.framework.common.controller; import lombok.extern.slf4j.Slf4j; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/CsrfController.java b/framework/src/main/java/io/geekidea/boot/framework/common/controller/CsrfController.java similarity index 85% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/CsrfController.java rename to framework/src/main/java/io/geekidea/boot/framework/common/controller/CsrfController.java index 0cc4f66..33c9848 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/CsrfController.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/controller/CsrfController.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.controller; +package io.geekidea.boot.framework.common.controller; -import io.geekidea.springbootplus.framework.log.annotation.OperationLogIgnore; -import io.geekidea.springbootplus.framework.util.UUIDUtil; +import io.geekidea.boot.framework.log.annotation.OperationLogIgnore; +import io.geekidea.boot.framework.util.UUIDUtil; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/EnumController.java b/framework/src/main/java/io/geekidea/boot/framework/common/controller/EnumController.java similarity index 86% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/EnumController.java rename to framework/src/main/java/io/geekidea/boot/framework/common/controller/EnumController.java index 5e279ed..cefb10d 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/EnumController.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/controller/EnumController.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.controller; +package io.geekidea.boot.framework.common.controller; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.enums.BaseEnum; -import io.geekidea.springbootplus.framework.common.vo.EnumVo; -import io.geekidea.springbootplus.framework.log.annotation.OperationLogIgnore; -import io.geekidea.springbootplus.framework.util.BaseEnumUtil; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.enums.BaseEnum; +import io.geekidea.boot.framework.common.vo.EnumVo; +import io.geekidea.boot.framework.log.annotation.OperationLogIgnore; +import io.geekidea.boot.framework.util.BaseEnumUtil; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -48,8 +48,8 @@ import java.util.concurrent.ConcurrentHashMap; public class EnumController { private static final List FRAMEWORK_ENUM_PACKAGES = Arrays.asList( - "io.geekidea.springbootplus.framework.common.enums", - "io.geekidea.springbootplus.system.enums"); + "io.geekidea.boot.framework.common.enums", + "io.geekidea.boot.system.enums"); /** * 枚举包路径 diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/IndexController.java b/framework/src/main/java/io/geekidea/boot/framework/common/controller/IndexController.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/IndexController.java rename to framework/src/main/java/io/geekidea/boot/framework/common/controller/IndexController.java index 9031b6a..0f14086 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/controller/IndexController.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/controller/IndexController.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.controller; +package io.geekidea.boot.framework.common.controller; -import io.geekidea.springbootplus.framework.log.annotation.OperationLogIgnore; +import io.geekidea.boot.framework.log.annotation.OperationLogIgnore; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/entity/BaseEntity.java b/framework/src/main/java/io/geekidea/boot/framework/common/entity/BaseEntity.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/entity/BaseEntity.java rename to framework/src/main/java/io/geekidea/boot/framework/common/entity/BaseEntity.java index 58d02fc..e7b95fa 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/entity/BaseEntity.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/entity/BaseEntity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.entity; +package io.geekidea.boot.framework.common.entity; import io.swagger.annotations.ApiModel; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/enums/BaseEnum.java b/framework/src/main/java/io/geekidea/boot/framework/common/enums/BaseEnum.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/enums/BaseEnum.java rename to framework/src/main/java/io/geekidea/boot/framework/common/enums/BaseEnum.java index dfcc128..116c50a 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/enums/BaseEnum.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/enums/BaseEnum.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.enums; +package io.geekidea.boot.framework.common.enums; /** diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/BusinessException.java b/framework/src/main/java/io/geekidea/boot/framework/common/exception/BusinessException.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/BusinessException.java rename to framework/src/main/java/io/geekidea/boot/framework/common/exception/BusinessException.java index 0b769d1..792654c 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/BusinessException.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/exception/BusinessException.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.exception; +package io.geekidea.boot.framework.common.exception; -import io.geekidea.springbootplus.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.api.ApiCode; /** * 业务异常 diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/DaoException.java b/framework/src/main/java/io/geekidea/boot/framework/common/exception/DaoException.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/DaoException.java rename to framework/src/main/java/io/geekidea/boot/framework/common/exception/DaoException.java index 015c523..bb08109 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/DaoException.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/exception/DaoException.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.exception; +package io.geekidea.boot.framework.common.exception; -import io.geekidea.springbootplus.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.api.ApiCode; /** * DAO异常 diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/GlobalErrorController.java b/framework/src/main/java/io/geekidea/boot/framework/common/exception/GlobalErrorController.java similarity index 91% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/GlobalErrorController.java rename to framework/src/main/java/io/geekidea/boot/framework/common/exception/GlobalErrorController.java index dbdc25d..8c42330 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/GlobalErrorController.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/exception/GlobalErrorController.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.exception; +package io.geekidea.boot.framework.common.exception; -import io.geekidea.springbootplus.framework.common.api.ApiCode; -import io.geekidea.springbootplus.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.api.ApiResult; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/SpringBootPlusConfigException.java b/framework/src/main/java/io/geekidea/boot/framework/common/exception/SpringBootPlusConfigException.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/SpringBootPlusConfigException.java rename to framework/src/main/java/io/geekidea/boot/framework/common/exception/SpringBootPlusConfigException.java index a7e7af3..10d9c00 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/SpringBootPlusConfigException.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/exception/SpringBootPlusConfigException.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.exception; +package io.geekidea.boot.framework.common.exception; -import io.geekidea.springbootplus.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.api.ApiCode; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/SpringBootPlusException.java b/framework/src/main/java/io/geekidea/boot/framework/common/exception/SpringBootPlusException.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/SpringBootPlusException.java rename to framework/src/main/java/io/geekidea/boot/framework/common/exception/SpringBootPlusException.java index 46dc1a7..cada49f 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/exception/SpringBootPlusException.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/exception/SpringBootPlusException.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.exception; +package io.geekidea.boot.framework.common.exception; -import io.geekidea.springbootplus.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.api.ApiCode; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/param/IdParam.java b/framework/src/main/java/io/geekidea/boot/framework/common/param/IdParam.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/param/IdParam.java rename to framework/src/main/java/io/geekidea/boot/framework/common/param/IdParam.java index e5e706d..61e0fce 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/param/IdParam.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/param/IdParam.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.param; +package io.geekidea.boot.framework.common.param; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/service/BaseService.java b/framework/src/main/java/io/geekidea/boot/framework/common/service/BaseService.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/service/BaseService.java rename to framework/src/main/java/io/geekidea/boot/framework/common/service/BaseService.java index 10c4a3f..63587a1 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/service/BaseService.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/service/BaseService.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.service; +package io.geekidea.boot.framework.common.service; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/service/impl/BaseServiceImpl.java b/framework/src/main/java/io/geekidea/boot/framework/common/service/impl/BaseServiceImpl.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/service/impl/BaseServiceImpl.java rename to framework/src/main/java/io/geekidea/boot/framework/common/service/impl/BaseServiceImpl.java index ee5122c..508f251 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/service/impl/BaseServiceImpl.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/service/impl/BaseServiceImpl.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.service.impl; +package io.geekidea.boot.framework.common.service.impl; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.util.LambdaColumn; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.util.LambdaColumn; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/common/vo/EnumVo.java b/framework/src/main/java/io/geekidea/boot/framework/common/vo/EnumVo.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/common/vo/EnumVo.java rename to framework/src/main/java/io/geekidea/boot/framework/common/vo/EnumVo.java index e516187..aeedec5 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/common/vo/EnumVo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/common/vo/EnumVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.common.vo; +package io.geekidea.boot.framework.common.vo; import lombok.Data; import lombok.experimental.Accessors; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/ConverterConfig.java b/framework/src/main/java/io/geekidea/boot/framework/config/converter/ConverterConfig.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/ConverterConfig.java rename to framework/src/main/java/io/geekidea/boot/framework/config/converter/ConverterConfig.java index e1d9b7f..94d5613 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/ConverterConfig.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/converter/ConverterConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.converter; +package io.geekidea.boot.framework.config.converter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDateConverter.java b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDateConverter.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDateConverter.java rename to framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDateConverter.java index 8c54b50..4f3d520 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDateConverter.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDateConverter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.converter; +package io.geekidea.boot.framework.config.converter; import org.springframework.core.convert.converter.Converter; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDateUtil.java b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDateUtil.java similarity index 97% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDateUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDateUtil.java index bc686d2..25c34f2 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDateUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDateUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.converter; +package io.geekidea.boot.framework.config.converter; import org.apache.commons.lang3.StringUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDoubleConverter.java b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDoubleConverter.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDoubleConverter.java rename to framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDoubleConverter.java index 071b08d..5757f17 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDoubleConverter.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDoubleConverter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.converter; +package io.geekidea.boot.framework.config.converter; import org.springframework.core.convert.converter.Converter; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDoubleUtil.java b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDoubleUtil.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDoubleUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDoubleUtil.java index b8c90ea..d58a398 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToDoubleUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToDoubleUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.converter; +package io.geekidea.boot.framework.config.converter; import org.apache.commons.lang3.StringUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToIntegerConverter.java b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToIntegerConverter.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToIntegerConverter.java rename to framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToIntegerConverter.java index fad3132..a47a8c7 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToIntegerConverter.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToIntegerConverter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.converter; +package io.geekidea.boot.framework.config.converter; import org.springframework.core.convert.converter.Converter; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToIntegerUtil.java b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToIntegerUtil.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToIntegerUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToIntegerUtil.java index e57da5c..27ba3c0 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/converter/StringToIntegerUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/converter/StringToIntegerUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.converter; +package io.geekidea.boot.framework.config.converter; import org.apache.commons.lang3.StringUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/deserializer/JacksonDateDeserializer.java b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/deserializer/JacksonDateDeserializer.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/deserializer/JacksonDateDeserializer.java rename to framework/src/main/java/io/geekidea/boot/framework/config/jackson/deserializer/JacksonDateDeserializer.java index a72637e..9fb6692 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/deserializer/JacksonDateDeserializer.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/deserializer/JacksonDateDeserializer.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.jackson.deserializer; +package io.geekidea.boot.framework.config.jackson.deserializer; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; -import io.geekidea.springbootplus.framework.config.converter.StringToDateUtil; +import io.geekidea.boot.framework.config.converter.StringToDateUtil; import java.io.IOException; import java.util.Date; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/deserializer/JacksonDoubleDeserializer.java b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/deserializer/JacksonDoubleDeserializer.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/deserializer/JacksonDoubleDeserializer.java rename to framework/src/main/java/io/geekidea/boot/framework/config/jackson/deserializer/JacksonDoubleDeserializer.java index 4007129..9f95372 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/deserializer/JacksonDoubleDeserializer.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/deserializer/JacksonDoubleDeserializer.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.jackson.deserializer; +package io.geekidea.boot.framework.config.jackson.deserializer; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; -import io.geekidea.springbootplus.framework.config.converter.StringToDoubleUtil; +import io.geekidea.boot.framework.config.converter.StringToDoubleUtil; import java.io.IOException; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/deserializer/JacksonLocalDateTimeDeserializer.java b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/deserializer/JacksonLocalDateTimeDeserializer.java similarity index 91% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/deserializer/JacksonLocalDateTimeDeserializer.java rename to framework/src/main/java/io/geekidea/boot/framework/config/jackson/deserializer/JacksonLocalDateTimeDeserializer.java index 8fc5071..ba37e00 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/deserializer/JacksonLocalDateTimeDeserializer.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/deserializer/JacksonLocalDateTimeDeserializer.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.jackson.deserializer; +package io.geekidea.boot.framework.config.jackson.deserializer; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; -import io.geekidea.springbootplus.config.constant.DatePattern; +import io.geekidea.boot.config.constant.DatePattern; import org.apache.commons.lang3.StringUtils; import java.io.IOException; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/serializer/JacksonDateSerializer.java b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/serializer/JacksonDateSerializer.java similarity index 91% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/serializer/JacksonDateSerializer.java rename to framework/src/main/java/io/geekidea/boot/framework/config/jackson/serializer/JacksonDateSerializer.java index 394441a..600824b 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/serializer/JacksonDateSerializer.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/serializer/JacksonDateSerializer.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.jackson.serializer; +package io.geekidea.boot.framework.config.jackson.serializer; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; -import io.geekidea.springbootplus.framework.util.DateUtil; +import io.geekidea.boot.framework.util.DateUtil; import java.io.IOException; import java.util.Date; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/serializer/JacksonIntegerDeserializer.java b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/serializer/JacksonIntegerDeserializer.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/serializer/JacksonIntegerDeserializer.java rename to framework/src/main/java/io/geekidea/boot/framework/config/jackson/serializer/JacksonIntegerDeserializer.java index 785b02b..ccf7bf0 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/serializer/JacksonIntegerDeserializer.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/serializer/JacksonIntegerDeserializer.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.jackson.serializer; +package io.geekidea.boot.framework.config.jackson.serializer; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; -import io.geekidea.springbootplus.framework.config.converter.StringToIntegerUtil; +import io.geekidea.boot.framework.config.converter.StringToIntegerUtil; import java.io.IOException; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/serializer/JacksonLocalDateTimeSerializer.java b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/serializer/JacksonLocalDateTimeSerializer.java similarity index 92% rename from framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/serializer/JacksonLocalDateTimeSerializer.java rename to framework/src/main/java/io/geekidea/boot/framework/config/jackson/serializer/JacksonLocalDateTimeSerializer.java index fb72cdd..c74efb4 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/config/jackson/serializer/JacksonLocalDateTimeSerializer.java +++ b/framework/src/main/java/io/geekidea/boot/framework/config/jackson/serializer/JacksonLocalDateTimeSerializer.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.config.jackson.serializer; +package io.geekidea.boot.framework.config.jackson.serializer; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; -import io.geekidea.springbootplus.config.constant.DatePattern; +import io.geekidea.boot.config.constant.DatePattern; import java.io.IOException; import java.time.LocalDateTime; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/bean/RequestDetail.java b/framework/src/main/java/io/geekidea/boot/framework/core/bean/RequestDetail.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/bean/RequestDetail.java rename to framework/src/main/java/io/geekidea/boot/framework/core/bean/RequestDetail.java index b84b7da..2b1e2da 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/bean/RequestDetail.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/bean/RequestDetail.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.bean; +package io.geekidea.boot.framework.core.bean; import lombok.Data; import lombok.experimental.Accessors; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/filter/RequestDetailFilter.java b/framework/src/main/java/io/geekidea/boot/framework/core/filter/RequestDetailFilter.java similarity index 87% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/filter/RequestDetailFilter.java rename to framework/src/main/java/io/geekidea/boot/framework/core/filter/RequestDetailFilter.java index b76988b..e6eb0c9 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/filter/RequestDetailFilter.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/filter/RequestDetailFilter.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.filter; +package io.geekidea.boot.framework.core.filter; -import io.geekidea.springbootplus.framework.core.bean.RequestDetail; -import io.geekidea.springbootplus.framework.core.util.RequestDetailThreadLocal; -import io.geekidea.springbootplus.framework.util.IpUtil; +import io.geekidea.boot.framework.core.bean.RequestDetail; +import io.geekidea.boot.framework.core.util.RequestDetailThreadLocal; +import io.geekidea.boot.framework.util.IpUtil; import lombok.extern.slf4j.Slf4j; import javax.servlet.*; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/interceptor/PermissionInterceptor.java b/framework/src/main/java/io/geekidea/boot/framework/core/interceptor/PermissionInterceptor.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/interceptor/PermissionInterceptor.java rename to framework/src/main/java/io/geekidea/boot/framework/core/interceptor/PermissionInterceptor.java index a3cfab0..1ed27dc 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/interceptor/PermissionInterceptor.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/interceptor/PermissionInterceptor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.interceptor; +package io.geekidea.boot.framework.core.interceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/BasePageOrderParam.java b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/BasePageOrderParam.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/BasePageOrderParam.java rename to framework/src/main/java/io/geekidea/boot/framework/core/pagination/BasePageOrderParam.java index 1d32e24..b4bb0b0 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/BasePageOrderParam.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/BasePageOrderParam.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.pagination; +package io.geekidea.boot.framework.core.pagination; import com.baomidou.mybatisplus.core.metadata.OrderItem; import io.swagger.annotations.ApiModel; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/BasePageParam.java b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/BasePageParam.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/BasePageParam.java rename to framework/src/main/java/io/geekidea/boot/framework/core/pagination/BasePageParam.java index 99b8b9a..1a97ef6 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/BasePageParam.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/BasePageParam.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.pagination; +package io.geekidea.boot.framework.core.pagination; -import io.geekidea.springbootplus.config.constant.CommonConstant; +import io.geekidea.boot.config.constant.CommonConstant; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/OrderMapping.java b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/OrderMapping.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/OrderMapping.java rename to framework/src/main/java/io/geekidea/boot/framework/core/pagination/OrderMapping.java index cd817ee..5f98abf 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/OrderMapping.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/OrderMapping.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.pagination; +package io.geekidea.boot.framework.core.pagination; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.google.common.base.CaseFormat; -import io.geekidea.springbootplus.framework.util.PropertyColumnUtil; +import io.geekidea.boot.framework.util.PropertyColumnUtil; import lombok.Data; import lombok.experimental.Accessors; import org.apache.commons.collections4.CollectionUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/PageInfo.java b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/PageInfo.java similarity index 98% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/PageInfo.java rename to framework/src/main/java/io/geekidea/boot/framework/core/pagination/PageInfo.java index 5f98428..72c7d71 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/PageInfo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/PageInfo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.pagination; +package io.geekidea.boot.framework.core.pagination; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/Paging.java b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/Paging.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/Paging.java rename to framework/src/main/java/io/geekidea/boot/framework/core/pagination/Paging.java index 515b349..4e1e9b5 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/pagination/Paging.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/pagination/Paging.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.pagination; +package io.geekidea.boot.framework.core.pagination; import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.core.metadata.IPage; import com.fasterxml.jackson.annotation.JsonProperty; -import io.geekidea.springbootplus.config.constant.CommonConstant; +import io.geekidea.boot.config.constant.CommonConstant; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/util/RequestDetailThreadLocal.java b/framework/src/main/java/io/geekidea/boot/framework/core/util/RequestDetailThreadLocal.java similarity index 91% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/util/RequestDetailThreadLocal.java rename to framework/src/main/java/io/geekidea/boot/framework/core/util/RequestDetailThreadLocal.java index a4ba79c..2290333 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/util/RequestDetailThreadLocal.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/util/RequestDetailThreadLocal.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.util; +package io.geekidea.boot.framework.core.util; -import io.geekidea.springbootplus.framework.core.bean.RequestDetail; +import io.geekidea.boot.framework.core.bean.RequestDetail; /** * 记录请求详情信息到当前线程中,可在任何地方获取 diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/EnumTypeValidator.java b/framework/src/main/java/io/geekidea/boot/framework/core/validator/EnumTypeValidator.java similarity index 80% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/EnumTypeValidator.java rename to framework/src/main/java/io/geekidea/boot/framework/core/validator/EnumTypeValidator.java index 4853e1a..9c71cd6 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/EnumTypeValidator.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/validator/EnumTypeValidator.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.validator; +package io.geekidea.boot.framework.core.validator; -import io.geekidea.springbootplus.framework.common.enums.BaseEnum; -import io.geekidea.springbootplus.framework.common.exception.BusinessException; -import io.geekidea.springbootplus.framework.core.validator.constraints.EnumType; -import io.geekidea.springbootplus.framework.util.BaseEnumUtil; +import io.geekidea.boot.framework.common.enums.BaseEnum; +import io.geekidea.boot.framework.common.exception.BusinessException; +import io.geekidea.boot.framework.core.validator.constraints.EnumType; +import io.geekidea.boot.framework.util.BaseEnumUtil; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/IdCardValidator.java b/framework/src/main/java/io/geekidea/boot/framework/core/validator/IdCardValidator.java similarity index 91% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/IdCardValidator.java rename to framework/src/main/java/io/geekidea/boot/framework/core/validator/IdCardValidator.java index fd1476b..5c8f3a4 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/IdCardValidator.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/validator/IdCardValidator.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.validator; +package io.geekidea.boot.framework.core.validator; -import io.geekidea.springbootplus.framework.core.validator.constraints.IdCard; +import io.geekidea.boot.framework.core.validator.constraints.IdCard; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/PhoneValidator.java b/framework/src/main/java/io/geekidea/boot/framework/core/validator/PhoneValidator.java similarity index 90% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/PhoneValidator.java rename to framework/src/main/java/io/geekidea/boot/framework/core/validator/PhoneValidator.java index a81ef49..8973a8f 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/PhoneValidator.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/validator/PhoneValidator.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.validator; +package io.geekidea.boot.framework.core.validator; -import io.geekidea.springbootplus.framework.core.validator.constraints.Phone; +import io.geekidea.boot.framework.core.validator.constraints.Phone; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/constraints/EnumType.java b/framework/src/main/java/io/geekidea/boot/framework/core/validator/constraints/EnumType.java similarity index 86% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/constraints/EnumType.java rename to framework/src/main/java/io/geekidea/boot/framework/core/validator/constraints/EnumType.java index f42908f..848065e 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/constraints/EnumType.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/validator/constraints/EnumType.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.validator.constraints; +package io.geekidea.boot.framework.core.validator.constraints; -import io.geekidea.springbootplus.framework.common.enums.BaseEnum; -import io.geekidea.springbootplus.framework.core.validator.EnumTypeValidator; +import io.geekidea.boot.framework.common.enums.BaseEnum; +import io.geekidea.boot.framework.core.validator.EnumTypeValidator; import javax.validation.Constraint; import javax.validation.Payload; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/constraints/IdCard.java b/framework/src/main/java/io/geekidea/boot/framework/core/validator/constraints/IdCard.java similarity index 90% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/constraints/IdCard.java rename to framework/src/main/java/io/geekidea/boot/framework/core/validator/constraints/IdCard.java index 5e33d3c..9066d3b 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/constraints/IdCard.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/validator/constraints/IdCard.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.validator.constraints; +package io.geekidea.boot.framework.core.validator.constraints; -import io.geekidea.springbootplus.framework.core.validator.IdCardValidator; +import io.geekidea.boot.framework.core.validator.IdCardValidator; import javax.validation.Constraint; import javax.validation.Payload; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/constraints/Phone.java b/framework/src/main/java/io/geekidea/boot/framework/core/validator/constraints/Phone.java similarity index 90% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/constraints/Phone.java rename to framework/src/main/java/io/geekidea/boot/framework/core/validator/constraints/Phone.java index 7f2aacf..8c1e414 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/constraints/Phone.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/validator/constraints/Phone.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.validator.constraints; +package io.geekidea.boot.framework.core.validator.constraints; -import io.geekidea.springbootplus.framework.core.validator.PhoneValidator; +import io.geekidea.boot.framework.core.validator.PhoneValidator; import javax.validation.Constraint; import javax.validation.Payload; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/groups/Add.java b/framework/src/main/java/io/geekidea/boot/framework/core/validator/groups/Add.java similarity index 92% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/groups/Add.java rename to framework/src/main/java/io/geekidea/boot/framework/core/validator/groups/Add.java index ace305d..69eae70 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/groups/Add.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/validator/groups/Add.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.validator.groups; +package io.geekidea.boot.framework.core.validator.groups; import javax.validation.groups.Default; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/groups/Update.java b/framework/src/main/java/io/geekidea/boot/framework/core/validator/groups/Update.java similarity index 92% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/groups/Update.java rename to framework/src/main/java/io/geekidea/boot/framework/core/validator/groups/Update.java index 9e7d41f..6c31ca7 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/validator/groups/Update.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/validator/groups/Update.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.validator.groups; +package io.geekidea.boot.framework.core.validator.groups; import javax.validation.groups.Default; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssFilter.java b/framework/src/main/java/io/geekidea/boot/framework/core/xss/XssFilter.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssFilter.java rename to framework/src/main/java/io/geekidea/boot/framework/core/xss/XssFilter.java index 18ff7c8..e5c593e 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssFilter.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/xss/XssFilter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.xss; +package io.geekidea.boot.framework.core.xss; import lombok.extern.slf4j.Slf4j; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssHttpServletRequestWrapper.java b/framework/src/main/java/io/geekidea/boot/framework/core/xss/XssHttpServletRequestWrapper.java similarity index 97% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssHttpServletRequestWrapper.java rename to framework/src/main/java/io/geekidea/boot/framework/core/xss/XssHttpServletRequestWrapper.java index 83a9def..295856b 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssHttpServletRequestWrapper.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/xss/XssHttpServletRequestWrapper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.xss; +package io.geekidea.boot.framework.core.xss; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.text.StringEscapeUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssJacksonDeserializer.java b/framework/src/main/java/io/geekidea/boot/framework/core/xss/XssJacksonDeserializer.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssJacksonDeserializer.java rename to framework/src/main/java/io/geekidea/boot/framework/core/xss/XssJacksonDeserializer.java index ecc36e6..19822ea 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssJacksonDeserializer.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/xss/XssJacksonDeserializer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.xss; +package io.geekidea.boot.framework.core.xss; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssJacksonSerializer.java b/framework/src/main/java/io/geekidea/boot/framework/core/xss/XssJacksonSerializer.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssJacksonSerializer.java rename to framework/src/main/java/io/geekidea/boot/framework/core/xss/XssJacksonSerializer.java index 536329d..3702c28 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/core/xss/XssJacksonSerializer.java +++ b/framework/src/main/java/io/geekidea/boot/framework/core/xss/XssJacksonSerializer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.core.xss; +package io.geekidea.boot.framework.core.xss; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/ip/entity/IpAddress.java b/framework/src/main/java/io/geekidea/boot/framework/ip/entity/IpAddress.java similarity index 92% rename from framework/src/main/java/io/geekidea/springbootplus/framework/ip/entity/IpAddress.java rename to framework/src/main/java/io/geekidea/boot/framework/ip/entity/IpAddress.java index 873838f..51b5a23 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/ip/entity/IpAddress.java +++ b/framework/src/main/java/io/geekidea/boot/framework/ip/entity/IpAddress.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.ip.entity; +package io.geekidea.boot.framework.ip.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.common.entity.BaseEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/ip/mapper/IpAddressMapper.java b/framework/src/main/java/io/geekidea/boot/framework/ip/mapper/IpAddressMapper.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/ip/mapper/IpAddressMapper.java rename to framework/src/main/java/io/geekidea/boot/framework/ip/mapper/IpAddressMapper.java index d92f2b1..b6c5350 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/ip/mapper/IpAddressMapper.java +++ b/framework/src/main/java/io/geekidea/boot/framework/ip/mapper/IpAddressMapper.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.ip.mapper; +package io.geekidea.boot.framework.ip.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import io.geekidea.springbootplus.framework.ip.entity.IpAddress; +import io.geekidea.boot.framework.ip.entity.IpAddress; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/ip/service/IpAddressService.java b/framework/src/main/java/io/geekidea/boot/framework/ip/service/IpAddressService.java similarity index 85% rename from framework/src/main/java/io/geekidea/springbootplus/framework/ip/service/IpAddressService.java rename to framework/src/main/java/io/geekidea/boot/framework/ip/service/IpAddressService.java index 9701a80..e03ae16 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/ip/service/IpAddressService.java +++ b/framework/src/main/java/io/geekidea/boot/framework/ip/service/IpAddressService.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.ip.service; +package io.geekidea.boot.framework.ip.service; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.ip.entity.IpAddress; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.ip.entity.IpAddress; /** * IP地址 服务类 diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/ip/service/impl/IpAddressServiceImpl.java b/framework/src/main/java/io/geekidea/boot/framework/ip/service/impl/IpAddressServiceImpl.java similarity index 82% rename from framework/src/main/java/io/geekidea/springbootplus/framework/ip/service/impl/IpAddressServiceImpl.java rename to framework/src/main/java/io/geekidea/boot/framework/ip/service/impl/IpAddressServiceImpl.java index 2c17bd0..dcc99f3 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/ip/service/impl/IpAddressServiceImpl.java +++ b/framework/src/main/java/io/geekidea/boot/framework/ip/service/impl/IpAddressServiceImpl.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.ip.service.impl; +package io.geekidea.boot.framework.ip.service.impl; -import io.geekidea.springbootplus.config.constant.CommonConstant; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.framework.ip.entity.IpAddress; -import io.geekidea.springbootplus.framework.ip.mapper.IpAddressMapper; -import io.geekidea.springbootplus.framework.ip.service.IpAddressService; +import io.geekidea.boot.config.constant.CommonConstant; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.ip.entity.IpAddress; +import io.geekidea.boot.framework.ip.mapper.IpAddressMapper; +import io.geekidea.boot.framework.ip.service.IpAddressService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/annotation/Module.java b/framework/src/main/java/io/geekidea/boot/framework/log/annotation/Module.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/annotation/Module.java rename to framework/src/main/java/io/geekidea/boot/framework/log/annotation/Module.java index 3226119..c553a70 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/annotation/Module.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/annotation/Module.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.annotation; +package io.geekidea.boot.framework.log.annotation; import org.springframework.core.annotation.AliasFor; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/annotation/OperationLog.java b/framework/src/main/java/io/geekidea/boot/framework/log/annotation/OperationLog.java similarity index 91% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/annotation/OperationLog.java rename to framework/src/main/java/io/geekidea/boot/framework/log/annotation/OperationLog.java index f90112c..e0279f3 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/annotation/OperationLog.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/annotation/OperationLog.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.annotation; +package io.geekidea.boot.framework.log.annotation; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.log.enums.OperationLogType; import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/annotation/OperationLogIgnore.java b/framework/src/main/java/io/geekidea/boot/framework/log/annotation/OperationLogIgnore.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/annotation/OperationLogIgnore.java rename to framework/src/main/java/io/geekidea/boot/framework/log/annotation/OperationLogIgnore.java index 1283704..9244fa0 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/annotation/OperationLogIgnore.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/annotation/OperationLogIgnore.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.annotation; +package io.geekidea.boot.framework.log.annotation; import java.lang.annotation.*; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/aop/BaseLogAop.java b/framework/src/main/java/io/geekidea/boot/framework/log/aop/BaseLogAop.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/aop/BaseLogAop.java rename to framework/src/main/java/io/geekidea/boot/framework/log/aop/BaseLogAop.java index 1b0f38b..3b220b8 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/aop/BaseLogAop.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/aop/BaseLogAop.java @@ -14,33 +14,33 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.aop; +package io.geekidea.boot.framework.log.aop; import com.alibaba.fastjson.JSONObject; import com.auth0.jwt.exceptions.JWTDecodeException; import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import io.geekidea.springbootplus.config.constant.CommonConstant; -import io.geekidea.springbootplus.config.properties.SpringBootPlusAopProperties; -import io.geekidea.springbootplus.framework.common.api.ApiCode; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.bean.ClientInfo; -import io.geekidea.springbootplus.framework.common.exception.SpringBootPlusException; -import io.geekidea.springbootplus.framework.ip.entity.IpAddress; -import io.geekidea.springbootplus.framework.ip.service.IpAddressService; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.annotation.OperationLogIgnore; -import io.geekidea.springbootplus.framework.log.bean.OperationLogInfo; -import io.geekidea.springbootplus.framework.log.bean.RequestInfo; -import io.geekidea.springbootplus.framework.log.entity.SysLoginLog; -import io.geekidea.springbootplus.framework.log.entity.SysOperationLog; -import io.geekidea.springbootplus.framework.log.service.SysLoginLogService; -import io.geekidea.springbootplus.framework.log.service.SysOperationLogService; -import io.geekidea.springbootplus.framework.shiro.service.LoginToken; -import io.geekidea.springbootplus.framework.shiro.service.LoginUsername; -import io.geekidea.springbootplus.framework.shiro.util.JwtTokenUtil; -import io.geekidea.springbootplus.framework.shiro.util.JwtUtil; -import io.geekidea.springbootplus.framework.util.*; +import io.geekidea.boot.config.constant.CommonConstant; +import io.geekidea.boot.config.properties.SpringBootPlusAopProperties; +import io.geekidea.boot.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.bean.ClientInfo; +import io.geekidea.boot.framework.common.exception.SpringBootPlusException; +import io.geekidea.boot.framework.ip.entity.IpAddress; +import io.geekidea.boot.framework.ip.service.IpAddressService; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.annotation.OperationLogIgnore; +import io.geekidea.boot.framework.log.bean.OperationLogInfo; +import io.geekidea.boot.framework.log.bean.RequestInfo; +import io.geekidea.boot.framework.log.entity.SysLoginLog; +import io.geekidea.boot.framework.log.entity.SysOperationLog; +import io.geekidea.boot.framework.log.service.SysLoginLogService; +import io.geekidea.boot.framework.log.service.SysOperationLogService; +import io.geekidea.boot.framework.shiro.service.LoginToken; +import io.geekidea.boot.framework.shiro.service.LoginUsername; +import io.geekidea.boot.framework.shiro.util.JwtTokenUtil; +import io.geekidea.boot.framework.shiro.util.JwtUtil; +import io.geekidea.boot.framework.util.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.collections4.CollectionUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/bean/OperationLogInfo.java b/framework/src/main/java/io/geekidea/boot/framework/log/bean/OperationLogInfo.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/bean/OperationLogInfo.java rename to framework/src/main/java/io/geekidea/boot/framework/log/bean/OperationLogInfo.java index 4841a37..9afe077 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/bean/OperationLogInfo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/bean/OperationLogInfo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.bean; +package io.geekidea.boot.framework.log.bean; import lombok.Data; import lombok.experimental.Accessors; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/bean/RequestInfo.java b/framework/src/main/java/io/geekidea/boot/framework/log/bean/RequestInfo.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/bean/RequestInfo.java rename to framework/src/main/java/io/geekidea/boot/framework/log/bean/RequestInfo.java index aa035f0..c219197 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/bean/RequestInfo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/bean/RequestInfo.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.bean; +package io.geekidea.boot.framework.log.bean; import com.alibaba.fastjson.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonIgnore; -import io.geekidea.springbootplus.framework.ip.entity.IpAddress; +import io.geekidea.boot.framework.ip.entity.IpAddress; import lombok.Data; import lombok.experimental.Accessors; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/controller/SysLoginLogController.java b/framework/src/main/java/io/geekidea/boot/framework/log/controller/SysLoginLogController.java similarity index 75% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/controller/SysLoginLogController.java rename to framework/src/main/java/io/geekidea/boot/framework/log/controller/SysLoginLogController.java index f4e4e66..6cfe763 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/controller/SysLoginLogController.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/controller/SysLoginLogController.java @@ -14,17 +14,17 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.controller; +package io.geekidea.boot.framework.log.controller; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.controller.BaseController; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.entity.SysLoginLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.framework.log.param.SysLoginLogPageParam; -import io.geekidea.springbootplus.framework.log.service.SysLoginLogService; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.entity.SysLoginLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.log.param.SysLoginLogPageParam; +import io.geekidea.boot.framework.log.service.SysLoginLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/controller/SysOperationLogController.java b/framework/src/main/java/io/geekidea/boot/framework/log/controller/SysOperationLogController.java similarity index 80% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/controller/SysOperationLogController.java rename to framework/src/main/java/io/geekidea/boot/framework/log/controller/SysOperationLogController.java index 9c6db9e..76c947b 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/controller/SysOperationLogController.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/controller/SysOperationLogController.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.controller; +package io.geekidea.boot.framework.log.controller; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.controller.BaseController; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.log.entity.SysOperationLog; -import io.geekidea.springbootplus.framework.log.param.SysOperationLogPageParam; -import io.geekidea.springbootplus.framework.log.service.SysOperationLogService; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.entity.SysOperationLog; +import io.geekidea.boot.framework.log.param.SysOperationLogPageParam; +import io.geekidea.boot.framework.log.service.SysOperationLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/entity/SysLoginLog.java b/framework/src/main/java/io/geekidea/boot/framework/log/entity/SysLoginLog.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/entity/SysLoginLog.java rename to framework/src/main/java/io/geekidea/boot/framework/log/entity/SysLoginLog.java index 25ac554..b204150 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/entity/SysLoginLog.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/entity/SysLoginLog.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.entity; +package io.geekidea.boot.framework.log.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.core.validator.groups.Update; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/entity/SysOperationLog.java b/framework/src/main/java/io/geekidea/boot/framework/log/entity/SysOperationLog.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/entity/SysOperationLog.java rename to framework/src/main/java/io/geekidea/boot/framework/log/entity/SysOperationLog.java index 87a7b60..066c881 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/entity/SysOperationLog.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/entity/SysOperationLog.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.entity; +package io.geekidea.boot.framework.log.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.core.validator.groups.Update; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/enums/OperationLogType.java b/framework/src/main/java/io/geekidea/boot/framework/log/enums/OperationLogType.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/enums/OperationLogType.java rename to framework/src/main/java/io/geekidea/boot/framework/log/enums/OperationLogType.java index cdd1419..6adb6c8 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/enums/OperationLogType.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/enums/OperationLogType.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.enums; +package io.geekidea.boot.framework.log.enums; -import io.geekidea.springbootplus.framework.common.enums.BaseEnum; +import io.geekidea.boot.framework.common.enums.BaseEnum; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/mapper/SysLoginLogMapper.java b/framework/src/main/java/io/geekidea/boot/framework/log/mapper/SysLoginLogMapper.java similarity index 87% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/mapper/SysLoginLogMapper.java rename to framework/src/main/java/io/geekidea/boot/framework/log/mapper/SysLoginLogMapper.java index 1ca535f..671d28d 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/mapper/SysLoginLogMapper.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/mapper/SysLoginLogMapper.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.mapper; +package io.geekidea.boot.framework.log.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import io.geekidea.springbootplus.framework.log.entity.SysLoginLog; +import io.geekidea.boot.framework.log.entity.SysLoginLog; import org.springframework.stereotype.Repository; /** diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/mapper/SysOperationLogMapper.java b/framework/src/main/java/io/geekidea/boot/framework/log/mapper/SysOperationLogMapper.java similarity index 87% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/mapper/SysOperationLogMapper.java rename to framework/src/main/java/io/geekidea/boot/framework/log/mapper/SysOperationLogMapper.java index 431aef3..39f36a2 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/mapper/SysOperationLogMapper.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/mapper/SysOperationLogMapper.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.mapper; +package io.geekidea.boot.framework.log.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import io.geekidea.springbootplus.framework.log.entity.SysOperationLog; +import io.geekidea.boot.framework.log.entity.SysOperationLog; import org.springframework.stereotype.Repository; /** diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/param/SysLoginLogPageParam.java b/framework/src/main/java/io/geekidea/boot/framework/log/param/SysLoginLogPageParam.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/param/SysLoginLogPageParam.java rename to framework/src/main/java/io/geekidea/boot/framework/log/param/SysLoginLogPageParam.java index c44e862..a414d44 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/param/SysLoginLogPageParam.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/param/SysLoginLogPageParam.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.param; +package io.geekidea.boot.framework.log.param; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/param/SysOperationLogPageParam.java b/framework/src/main/java/io/geekidea/boot/framework/log/param/SysOperationLogPageParam.java similarity index 89% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/param/SysOperationLogPageParam.java rename to framework/src/main/java/io/geekidea/boot/framework/log/param/SysOperationLogPageParam.java index cfb9420..bfb2f50 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/param/SysOperationLogPageParam.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/param/SysOperationLogPageParam.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.param; +package io.geekidea.boot.framework.log.param; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/service/SysLoginLogService.java b/framework/src/main/java/io/geekidea/boot/framework/log/service/SysLoginLogService.java similarity index 81% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/service/SysLoginLogService.java rename to framework/src/main/java/io/geekidea/boot/framework/log/service/SysLoginLogService.java index 1746e32..238dfc7 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/service/SysLoginLogService.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/service/SysLoginLogService.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.service; +package io.geekidea.boot.framework.log.service; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.log.entity.SysLoginLog; -import io.geekidea.springbootplus.framework.log.param.SysLoginLogPageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.entity.SysLoginLog; +import io.geekidea.boot.framework.log.param.SysLoginLogPageParam; /** * 系统登录日志 服务类 diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/service/SysOperationLogService.java b/framework/src/main/java/io/geekidea/boot/framework/log/service/SysOperationLogService.java similarity index 81% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/service/SysOperationLogService.java rename to framework/src/main/java/io/geekidea/boot/framework/log/service/SysOperationLogService.java index 1e11d71..5537a2a 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/service/SysOperationLogService.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/service/SysOperationLogService.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.service; +package io.geekidea.boot.framework.log.service; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.log.entity.SysOperationLog; -import io.geekidea.springbootplus.framework.log.param.SysOperationLogPageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.entity.SysOperationLog; +import io.geekidea.boot.framework.log.param.SysOperationLogPageParam; /** * 系统操作日志 服务类 diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/service/impl/SysLoginLogServiceImpl.java b/framework/src/main/java/io/geekidea/boot/framework/log/service/impl/SysLoginLogServiceImpl.java similarity index 80% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/service/impl/SysLoginLogServiceImpl.java rename to framework/src/main/java/io/geekidea/boot/framework/log/service/impl/SysLoginLogServiceImpl.java index 8d52c06..e02fad0 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/service/impl/SysLoginLogServiceImpl.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/service/impl/SysLoginLogServiceImpl.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.service.impl; +package io.geekidea.boot.framework.log.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.framework.core.pagination.PageInfo; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.log.entity.SysLoginLog; -import io.geekidea.springbootplus.framework.log.mapper.SysLoginLogMapper; -import io.geekidea.springbootplus.framework.log.param.SysLoginLogPageParam; -import io.geekidea.springbootplus.framework.log.service.SysLoginLogService; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.entity.SysLoginLog; +import io.geekidea.boot.framework.log.mapper.SysLoginLogMapper; +import io.geekidea.boot.framework.log.param.SysLoginLogPageParam; +import io.geekidea.boot.framework.log.service.SysLoginLogService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/log/service/impl/SysOperationLogServiceImpl.java b/framework/src/main/java/io/geekidea/boot/framework/log/service/impl/SysOperationLogServiceImpl.java similarity index 81% rename from framework/src/main/java/io/geekidea/springbootplus/framework/log/service/impl/SysOperationLogServiceImpl.java rename to framework/src/main/java/io/geekidea/boot/framework/log/service/impl/SysOperationLogServiceImpl.java index 291f774..a3a6b34 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/log/service/impl/SysOperationLogServiceImpl.java +++ b/framework/src/main/java/io/geekidea/boot/framework/log/service/impl/SysOperationLogServiceImpl.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.log.service.impl; +package io.geekidea.boot.framework.log.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.framework.core.pagination.PageInfo; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.log.entity.SysOperationLog; -import io.geekidea.springbootplus.framework.log.mapper.SysOperationLogMapper; -import io.geekidea.springbootplus.framework.log.param.SysOperationLogPageParam; -import io.geekidea.springbootplus.framework.log.service.SysOperationLogService; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.entity.SysOperationLog; +import io.geekidea.boot.framework.log.mapper.SysOperationLogMapper; +import io.geekidea.boot.framework.log.param.SysOperationLogPageParam; +import io.geekidea.boot.framework.log.service.SysOperationLogService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/cache/LoginRedisService.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/cache/LoginRedisService.java similarity index 88% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/cache/LoginRedisService.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/cache/LoginRedisService.java index 2a7d7dc..a23f16c 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/cache/LoginRedisService.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/cache/LoginRedisService.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.cache; +package io.geekidea.boot.framework.shiro.cache; -import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserRedisVo; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserVo; +import io.geekidea.boot.framework.shiro.jwt.JwtToken; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserRedisVo; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserVo; /** * 登录信息Redis缓存操作服务 diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/cache/impl/LoginRedisServiceImpl.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/cache/impl/LoginRedisServiceImpl.java similarity index 88% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/cache/impl/LoginRedisServiceImpl.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/cache/impl/LoginRedisServiceImpl.java index 011c7cb..541f2ba 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/cache/impl/LoginRedisServiceImpl.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/cache/impl/LoginRedisServiceImpl.java @@ -14,20 +14,20 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.cache.impl; - -import io.geekidea.springbootplus.config.constant.CommonRedisKey; -import io.geekidea.springbootplus.config.properties.JwtProperties; -import io.geekidea.springbootplus.framework.common.bean.ClientInfo; -import io.geekidea.springbootplus.framework.shiro.cache.LoginRedisService; -import io.geekidea.springbootplus.framework.shiro.convert.LoginSysUserVoConvert; -import io.geekidea.springbootplus.framework.shiro.convert.ShiroMapstructConvert; -import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken; -import io.geekidea.springbootplus.framework.shiro.vo.JwtTokenRedisVo; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserRedisVo; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserVo; -import io.geekidea.springbootplus.framework.util.ClientInfoUtil; -import io.geekidea.springbootplus.framework.util.HttpServletRequestUtil; +package io.geekidea.boot.framework.shiro.cache.impl; + +import io.geekidea.boot.config.constant.CommonRedisKey; +import io.geekidea.boot.config.properties.JwtProperties; +import io.geekidea.boot.framework.common.bean.ClientInfo; +import io.geekidea.boot.framework.shiro.cache.LoginRedisService; +import io.geekidea.boot.framework.shiro.convert.LoginSysUserVoConvert; +import io.geekidea.boot.framework.shiro.convert.ShiroMapstructConvert; +import io.geekidea.boot.framework.shiro.jwt.JwtToken; +import io.geekidea.boot.framework.shiro.vo.JwtTokenRedisVo; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserRedisVo; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserVo; +import io.geekidea.boot.framework.util.ClientInfoUtil; +import io.geekidea.boot.framework.util.HttpServletRequestUtil; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/convert/LoginSysUserVoConvert.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/convert/LoginSysUserVoConvert.java similarity index 84% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/convert/LoginSysUserVoConvert.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/convert/LoginSysUserVoConvert.java index c1dc5e3..4ecdf0f 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/convert/LoginSysUserVoConvert.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/convert/LoginSysUserVoConvert.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.convert; +package io.geekidea.boot.framework.shiro.convert; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserRedisVo; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserVo; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserRedisVo; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/convert/ShiroMapstructConvert.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/convert/ShiroMapstructConvert.java similarity index 85% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/convert/ShiroMapstructConvert.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/convert/ShiroMapstructConvert.java index 2b6fc04..53470ac 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/convert/ShiroMapstructConvert.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/convert/ShiroMapstructConvert.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.convert; +package io.geekidea.boot.framework.shiro.convert; -import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken; -import io.geekidea.springbootplus.framework.shiro.vo.JwtTokenRedisVo; +import io.geekidea.boot.framework.shiro.jwt.JwtToken; +import io.geekidea.boot.framework.shiro.vo.JwtTokenRedisVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/exception/ShiroConfigException.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/exception/ShiroConfigException.java similarity index 84% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/exception/ShiroConfigException.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/exception/ShiroConfigException.java index 71c3f7a..9c12bd6 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/exception/ShiroConfigException.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/exception/ShiroConfigException.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.exception; +package io.geekidea.boot.framework.shiro.exception; -import io.geekidea.springbootplus.framework.common.api.ApiCode; -import io.geekidea.springbootplus.framework.common.exception.SpringBootPlusException; +import io.geekidea.boot.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.exception.SpringBootPlusException; /** * Shiro配置异常 diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtCredentialsMatcher.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtCredentialsMatcher.java similarity index 92% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtCredentialsMatcher.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtCredentialsMatcher.java index 2d211f6..bbc6658 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtCredentialsMatcher.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtCredentialsMatcher.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.jwt; +package io.geekidea.boot.framework.shiro.jwt; -import io.geekidea.springbootplus.framework.shiro.util.JwtUtil; +import io.geekidea.boot.framework.shiro.util.JwtUtil; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtFilter.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtFilter.java similarity index 90% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtFilter.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtFilter.java index bca4d2b..28d7307 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtFilter.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtFilter.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.jwt; +package io.geekidea.boot.framework.shiro.jwt; -import io.geekidea.springbootplus.config.properties.JwtProperties; -import io.geekidea.springbootplus.framework.common.api.ApiCode; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.shiro.cache.LoginRedisService; -import io.geekidea.springbootplus.framework.shiro.service.ShiroLoginService; -import io.geekidea.springbootplus.framework.shiro.util.JwtTokenUtil; -import io.geekidea.springbootplus.framework.shiro.util.JwtUtil; -import io.geekidea.springbootplus.framework.util.HttpServletResponseUtil; +import io.geekidea.boot.config.properties.JwtProperties; +import io.geekidea.boot.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.shiro.cache.LoginRedisService; +import io.geekidea.boot.framework.shiro.service.ShiroLoginService; +import io.geekidea.boot.framework.shiro.util.JwtTokenUtil; +import io.geekidea.boot.framework.shiro.util.JwtUtil; +import io.geekidea.boot.framework.util.HttpServletResponseUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.AuthenticationException; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtRealm.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtRealm.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtRealm.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtRealm.java index e924491..7037ca7 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtRealm.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtRealm.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.jwt; +package io.geekidea.boot.framework.shiro.jwt; -import io.geekidea.springbootplus.framework.shiro.cache.LoginRedisService; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserRedisVo; +import io.geekidea.boot.framework.shiro.cache.LoginRedisService; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserRedisVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.SetUtils; import org.apache.commons.lang3.StringUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtToken.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtToken.java similarity index 92% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtToken.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtToken.java index 1eb668f..857e4c6 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/jwt/JwtToken.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtToken.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.jwt; +package io.geekidea.boot.framework.shiro.jwt; import com.auth0.jwt.interfaces.DecodedJWT; -import io.geekidea.springbootplus.framework.shiro.util.JwtUtil; -import io.geekidea.springbootplus.framework.util.IpUtil; +import io.geekidea.boot.framework.shiro.util.JwtUtil; +import io.geekidea.boot.framework.util.IpUtil; import lombok.Data; import lombok.experimental.Accessors; import org.apache.shiro.authc.HostAuthenticationToken; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/LoginToken.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/service/LoginToken.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/LoginToken.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/service/LoginToken.java index b61bd25..2635db1 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/LoginToken.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/service/LoginToken.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.service; +package io.geekidea.boot.framework.shiro.service; import java.io.Serializable; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/LoginUsername.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/service/LoginUsername.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/LoginUsername.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/service/LoginUsername.java index 52abca9..f49a35a 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/LoginUsername.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/service/LoginUsername.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.service; +package io.geekidea.boot.framework.shiro.service; import java.io.Serializable; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/ShiroLoginService.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/service/ShiroLoginService.java similarity index 91% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/ShiroLoginService.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/service/ShiroLoginService.java index 577895d..1ff95a5 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/ShiroLoginService.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/service/ShiroLoginService.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.service; +package io.geekidea.boot.framework.shiro.service; -import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken; +import io.geekidea.boot.framework.shiro.jwt.JwtToken; import javax.servlet.http.HttpServletResponse; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/impl/ShiroLoginServiceImpl.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/service/impl/ShiroLoginServiceImpl.java similarity index 85% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/impl/ShiroLoginServiceImpl.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/service/impl/ShiroLoginServiceImpl.java index cfe5cc2..6de7615 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/service/impl/ShiroLoginServiceImpl.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/service/impl/ShiroLoginServiceImpl.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.service.impl; +package io.geekidea.boot.framework.shiro.service.impl; -import io.geekidea.springbootplus.config.constant.CommonConstant; -import io.geekidea.springbootplus.config.properties.JwtProperties; -import io.geekidea.springbootplus.config.properties.SpringBootPlusProperties; -import io.geekidea.springbootplus.framework.shiro.cache.LoginRedisService; -import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken; -import io.geekidea.springbootplus.framework.shiro.service.ShiroLoginService; -import io.geekidea.springbootplus.framework.shiro.util.JwtTokenUtil; -import io.geekidea.springbootplus.framework.shiro.util.JwtUtil; +import io.geekidea.boot.config.constant.CommonConstant; +import io.geekidea.boot.config.properties.JwtProperties; +import io.geekidea.boot.config.properties.SpringBootPlusProperties; +import io.geekidea.boot.framework.shiro.cache.LoginRedisService; +import io.geekidea.boot.framework.shiro.jwt.JwtToken; +import io.geekidea.boot.framework.shiro.service.ShiroLoginService; +import io.geekidea.boot.framework.shiro.util.JwtTokenUtil; +import io.geekidea.boot.framework.shiro.util.JwtUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/util/JwtTokenUtil.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/util/JwtTokenUtil.java similarity index 91% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/util/JwtTokenUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/util/JwtTokenUtil.java index 74ecc35..3d2134c 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/util/JwtTokenUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/util/JwtTokenUtil.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.util; +package io.geekidea.boot.framework.shiro.util; -import io.geekidea.springbootplus.config.properties.JwtProperties; -import io.geekidea.springbootplus.framework.util.HttpServletRequestUtil; +import io.geekidea.boot.config.properties.JwtProperties; +import io.geekidea.boot.framework.util.HttpServletRequestUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/util/JwtUtil.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/util/JwtUtil.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/util/JwtUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/util/JwtUtil.java index fe1c53f..9729078 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/util/JwtUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/util/JwtUtil.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.util; +package io.geekidea.boot.framework.shiro.util; import com.alibaba.fastjson.JSON; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; -import io.geekidea.springbootplus.config.constant.CommonConstant; -import io.geekidea.springbootplus.config.properties.JwtProperties; -import io.geekidea.springbootplus.framework.util.UUIDUtil; +import io.geekidea.boot.config.constant.CommonConstant; +import io.geekidea.boot.config.properties.JwtProperties; +import io.geekidea.boot.framework.util.UUIDUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/util/SaltUtil.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/util/SaltUtil.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/util/SaltUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/util/SaltUtil.java index 0424cfb..d5ffaf3 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/util/SaltUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/util/SaltUtil.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.util; +package io.geekidea.boot.framework.shiro.util; -import io.geekidea.springbootplus.config.properties.JwtProperties; +import io.geekidea.boot.config.properties.JwtProperties; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.crypto.SecureRandomNumberGenerator; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/vo/JwtTokenRedisVo.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/vo/JwtTokenRedisVo.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/vo/JwtTokenRedisVo.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/vo/JwtTokenRedisVo.java index 085fa41..7d803b8 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/vo/JwtTokenRedisVo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/vo/JwtTokenRedisVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.vo; +package io.geekidea.boot.framework.shiro.vo; import lombok.Data; import lombok.experimental.Accessors; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/vo/LoginSysUserRedisVo.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/vo/LoginSysUserRedisVo.java similarity index 90% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/vo/LoginSysUserRedisVo.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/vo/LoginSysUserRedisVo.java index ade7efe..73de273 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/vo/LoginSysUserRedisVo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/vo/LoginSysUserRedisVo.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.vo; +package io.geekidea.boot.framework.shiro.vo; -import io.geekidea.springbootplus.framework.common.bean.ClientInfo; +import io.geekidea.boot.framework.common.bean.ClientInfo; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/vo/LoginSysUserVo.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/vo/LoginSysUserVo.java similarity index 97% rename from framework/src/main/java/io/geekidea/springbootplus/framework/shiro/vo/LoginSysUserVo.java rename to framework/src/main/java/io/geekidea/boot/framework/shiro/vo/LoginSysUserVo.java index fa27c14..d59be9a 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/shiro/vo/LoginSysUserVo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/vo/LoginSysUserVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.shiro.vo; +package io.geekidea.boot.framework.shiro.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/AnsiUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/AnsiUtil.java similarity index 97% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/AnsiUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/AnsiUtil.java index 9e4c5b1..738698d 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/AnsiUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/AnsiUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import lombok.extern.slf4j.Slf4j; import org.fusesource.jansi.Ansi; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/BaseEnumUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/BaseEnumUtil.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/BaseEnumUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/BaseEnumUtil.java index 5fd63fd..75f9ba9 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/BaseEnumUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/BaseEnumUtil.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; -import io.geekidea.springbootplus.framework.common.enums.BaseEnum; -import io.geekidea.springbootplus.framework.common.vo.EnumVo; +import io.geekidea.boot.framework.common.enums.BaseEnum; +import io.geekidea.boot.framework.common.vo.EnumVo; import org.apache.commons.collections4.MapUtils; import java.util.Collection; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/BrowserUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/BrowserUtil.java similarity index 97% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/BrowserUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/BrowserUtil.java index b69f3e0..738cee4 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/BrowserUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/BrowserUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import javax.servlet.http.HttpServletRequest; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/ClientInfoUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/ClientInfoUtil.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/ClientInfoUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/ClientInfoUtil.java index d3229f5..ce6adca 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/ClientInfoUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/ClientInfoUtil.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; -import io.geekidea.springbootplus.config.constant.CommonConstant; -import io.geekidea.springbootplus.framework.common.bean.ClientInfo; -import io.geekidea.springbootplus.framework.common.bean.DeviceInfo; +import io.geekidea.boot.config.constant.CommonConstant; +import io.geekidea.boot.framework.common.bean.ClientInfo; +import io.geekidea.boot.framework.common.bean.DeviceInfo; import javax.servlet.http.HttpServletRequest; import java.util.regex.Matcher; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/ContentTypeUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/ContentTypeUtil.java similarity index 98% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/ContentTypeUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/ContentTypeUtil.java index 6d95c51..539edee 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/ContentTypeUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/ContentTypeUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/DateUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/DateUtil.java similarity index 92% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/DateUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/DateUtil.java index 20c70a7..2df7b97 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/DateUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/DateUtil.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; -import io.geekidea.springbootplus.config.constant.DatePattern; +import io.geekidea.boot.config.constant.DatePattern; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/DownloadUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/DownloadUtil.java similarity index 98% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/DownloadUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/DownloadUtil.java index 58415ce..087383f 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/DownloadUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/DownloadUtil.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; -import io.geekidea.springbootplus.config.constant.CommonConstant; +import io.geekidea.boot.config.constant.CommonConstant; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/HttpServletRequestUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/HttpServletRequestUtil.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/HttpServletRequestUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/HttpServletRequestUtil.java index c136140..9c080ac 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/HttpServletRequestUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/HttpServletRequestUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/HttpServletResponseUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/HttpServletResponseUtil.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/HttpServletResponseUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/HttpServletResponseUtil.java index 5981599..1b836ac 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/HttpServletResponseUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/HttpServletResponseUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import com.alibaba.fastjson.JSON; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/IniUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/IniUtil.java similarity index 97% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/IniUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/IniUtil.java index 842b916..19b372e 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/IniUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/IniUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import org.ini4j.Config; import org.ini4j.Ini; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/IpUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/IpUtil.java similarity index 97% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/IpUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/IpUtil.java index e58830a..86336db 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/IpUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/IpUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/Jackson.java b/framework/src/main/java/io/geekidea/boot/framework/util/Jackson.java similarity index 98% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/Jackson.java rename to framework/src/main/java/io/geekidea/boot/framework/util/Jackson.java index 820a483..13212f7 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/Jackson.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/Jackson.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/LambdaColumn.java b/framework/src/main/java/io/geekidea/boot/framework/util/LambdaColumn.java similarity index 98% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/LambdaColumn.java rename to framework/src/main/java/io/geekidea/boot/framework/util/LambdaColumn.java index 1df3df9..b5a8f04 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/LambdaColumn.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/LambdaColumn.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/LoginUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/LoginUtil.java similarity index 87% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/LoginUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/LoginUtil.java index e781fb9..2dba64e 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/LoginUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/LoginUtil.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; -import io.geekidea.springbootplus.config.constant.CommonRedisKey; -import io.geekidea.springbootplus.framework.shiro.util.JwtTokenUtil; -import io.geekidea.springbootplus.framework.shiro.util.JwtUtil; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserRedisVo; +import io.geekidea.boot.config.constant.CommonRedisKey; +import io.geekidea.boot.framework.shiro.util.JwtTokenUtil; +import io.geekidea.boot.framework.shiro.util.JwtUtil; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserRedisVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.RedisTemplate; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/MapUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/MapUtil.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/MapUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/MapUtil.java index 10a2b3a..76b7ed3 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/MapUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/MapUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import java.util.HashMap; import java.util.Map; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/PasswordUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/PasswordUtil.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/PasswordUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/PasswordUtil.java index 91e1f3d..21df7d2 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/PasswordUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/PasswordUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/PhoneUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/PhoneUtil.java similarity index 97% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/PhoneUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/PhoneUtil.java index 47e5250..b52ca67 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/PhoneUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/PhoneUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import lombok.extern.slf4j.Slf4j; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/PrintApplicationInfo.java b/framework/src/main/java/io/geekidea/boot/framework/util/PrintApplicationInfo.java similarity index 99% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/PrintApplicationInfo.java rename to framework/src/main/java/io/geekidea/boot/framework/util/PrintApplicationInfo.java index 0958b1c..991cbea 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/PrintApplicationInfo.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/PrintApplicationInfo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import lombok.extern.slf4j.Slf4j; import org.fusesource.jansi.Ansi; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/PropertyColumnUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/PropertyColumnUtil.java similarity index 98% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/PropertyColumnUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/PropertyColumnUtil.java index 6296585..8c9f98d 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/PropertyColumnUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/PropertyColumnUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/RedisCacheUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/RedisCacheUtil.java similarity index 96% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/RedisCacheUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/RedisCacheUtil.java index a0bcf7b..fa5b91e 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/RedisCacheUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/RedisCacheUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/SpringContextUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/SpringContextUtil.java similarity index 97% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/SpringContextUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/SpringContextUtil.java index 97cf8ca..19f24f0 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/SpringContextUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/SpringContextUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/TokenUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/TokenUtil.java similarity index 95% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/TokenUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/TokenUtil.java index 4c9e25e..47785e4 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/TokenUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/TokenUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; /** * @author geekidea diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/UUIDUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/UUIDUtil.java similarity index 94% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/UUIDUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/UUIDUtil.java index 15046bb..4d27507 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/UUIDUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/UUIDUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import java.util.UUID; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/UploadUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/UploadUtil.java similarity index 98% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/UploadUtil.java rename to framework/src/main/java/io/geekidea/boot/framework/util/UploadUtil.java index 61332be..f92f72d 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/UploadUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/UploadUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/VerificationCode.java b/framework/src/main/java/io/geekidea/boot/framework/util/VerificationCode.java similarity index 99% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/VerificationCode.java rename to framework/src/main/java/io/geekidea/boot/framework/util/VerificationCode.java index cd53e8f..19832c3 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/VerificationCode.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/VerificationCode.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.framework.util; +package io.geekidea.boot.framework.util; import java.awt.*; import java.awt.image.BufferedImage; diff --git a/framework/src/main/java/io/geekidea/springbootplus/framework/util/package-info.java b/framework/src/main/java/io/geekidea/boot/framework/util/package-info.java similarity index 93% rename from framework/src/main/java/io/geekidea/springbootplus/framework/util/package-info.java rename to framework/src/main/java/io/geekidea/boot/framework/util/package-info.java index 624963c..4ffce4a 100644 --- a/framework/src/main/java/io/geekidea/springbootplus/framework/util/package-info.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/package-info.java @@ -19,4 +19,4 @@ * @author geekidea * @date 2018-11-08 */ -package io.geekidea.springbootplus.framework.util; \ No newline at end of file +package io.geekidea.boot.framework.util; \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ip/IpAddressMapper.xml b/framework/src/main/resources/mapper/ip/IpAddressMapper.xml index b3aab33..e445ead 100644 --- a/framework/src/main/resources/mapper/ip/IpAddressMapper.xml +++ b/framework/src/main/resources/mapper/ip/IpAddressMapper.xml @@ -16,9 +16,9 @@ --> - + - select area, operator from ip_address where INET_ATON(#{ip}) > ip_start_num diff --git a/framework/src/main/resources/mapper/log/SysLoginLogMapper.xml b/framework/src/main/resources/mapper/log/SysLoginLogMapper.xml index d461b37..2b9d0b1 100644 --- a/framework/src/main/resources/mapper/log/SysLoginLogMapper.xml +++ b/framework/src/main/resources/mapper/log/SysLoginLogMapper.xml @@ -16,6 +16,6 @@ --> - + diff --git a/framework/src/main/resources/mapper/log/SysOperationLogMapper.xml b/framework/src/main/resources/mapper/log/SysOperationLogMapper.xml index 3a1a338..b31ddc7 100644 --- a/framework/src/main/resources/mapper/log/SysOperationLogMapper.xml +++ b/framework/src/main/resources/mapper/log/SysOperationLogMapper.xml @@ -16,6 +16,6 @@ --> - + diff --git a/generator/pom.xml b/generator/pom.xml index 47f9ebb..6a79128 100644 --- a/generator/pom.xml +++ b/generator/pom.xml @@ -21,9 +21,9 @@ 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT generator @@ -32,7 +32,7 @@ - io.geekidea.springbootplus + io.geekidea.boot framework @@ -40,11 +40,6 @@ velocity-engine-core ${velocity.version} - - org.springframework.boot - spring-boot-starter-test - test - com.baomidou diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/CodeGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/CodeGenerator.java similarity index 97% rename from generator/src/main/java/io/geekidea/springbootplus/generator/CodeGenerator.java rename to generator/src/main/java/io/geekidea/boot/generator/CodeGenerator.java index 1c0b29a..70531c5 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/CodeGenerator.java +++ b/generator/src/main/java/io/geekidea/boot/generator/CodeGenerator.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator; +package io.geekidea.boot.generator; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.toolkit.StringPool; @@ -23,12 +23,12 @@ import com.baomidou.mybatisplus.generator.InjectionConfig; import com.baomidou.mybatisplus.generator.config.*; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; -import io.geekidea.springbootplus.generator.config.*; -import io.geekidea.springbootplus.generator.config.query.SpringBootPlusMySqlQuery; -import io.geekidea.springbootplus.generator.config.query.SpringBootPlusSqlServerQuery; -import io.geekidea.springbootplus.generator.constant.GeneratorConstant; -import io.geekidea.springbootplus.generator.exception.GeneratorException; -import io.geekidea.springbootplus.generator.properties.GeneratorProperties; +import io.geekidea.boot.generator.config.*; +import io.geekidea.boot.generator.config.query.SpringBootPlusMySqlQuery; +import io.geekidea.boot.generator.config.query.SpringBootPlusSqlServerQuery; +import io.geekidea.boot.generator.constant.GeneratorConstant; +import io.geekidea.boot.generator.exception.GeneratorException; +import io.geekidea.boot.generator.properties.GeneratorProperties; import lombok.Data; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java similarity index 92% rename from generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java rename to generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java index 85e6fad..3a95830 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java +++ b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java @@ -14,19 +14,17 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator; +package io.geekidea.boot.generator; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; -import io.geekidea.springbootplus.generator.config.GeneratorStrategy; -import io.geekidea.springbootplus.generator.constant.GeneratorConstant; -import io.geekidea.springbootplus.generator.properties.GeneratorProperties; +import io.geekidea.boot.generator.config.GeneratorStrategy; +import io.geekidea.boot.generator.constant.GeneratorConstant; +import io.geekidea.boot.generator.properties.GeneratorProperties; import org.springframework.stereotype.Component; -import java.util.Arrays; - /** * spring-boot-plus代码生成器入口类 * diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/config/GeneratorConfig.java b/generator/src/main/java/io/geekidea/boot/generator/config/GeneratorConfig.java similarity index 97% rename from generator/src/main/java/io/geekidea/springbootplus/generator/config/GeneratorConfig.java rename to generator/src/main/java/io/geekidea/boot/generator/config/GeneratorConfig.java index e5c5cce..21ce46c 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/config/GeneratorConfig.java +++ b/generator/src/main/java/io/geekidea/boot/generator/config/GeneratorConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.config; +package io.geekidea.boot.generator.config; import lombok.Data; import lombok.experimental.Accessors; diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/config/GeneratorStrategy.java b/generator/src/main/java/io/geekidea/boot/generator/config/GeneratorStrategy.java similarity index 94% rename from generator/src/main/java/io/geekidea/springbootplus/generator/config/GeneratorStrategy.java rename to generator/src/main/java/io/geekidea/boot/generator/config/GeneratorStrategy.java index c03621a..45ca4b7 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/config/GeneratorStrategy.java +++ b/generator/src/main/java/io/geekidea/boot/generator/config/GeneratorStrategy.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.config; +package io.geekidea.boot.generator.config; /** * 生成策略 diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/config/MybatisPlusGeneratorConfig.java b/generator/src/main/java/io/geekidea/boot/generator/config/MybatisPlusGeneratorConfig.java similarity index 96% rename from generator/src/main/java/io/geekidea/springbootplus/generator/config/MybatisPlusGeneratorConfig.java rename to generator/src/main/java/io/geekidea/boot/generator/config/MybatisPlusGeneratorConfig.java index 1f93d85..1d27a2c 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/config/MybatisPlusGeneratorConfig.java +++ b/generator/src/main/java/io/geekidea/boot/generator/config/MybatisPlusGeneratorConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.config; +package io.geekidea.boot.generator.config; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/config/ProjectConfig.java b/generator/src/main/java/io/geekidea/boot/generator/config/ProjectConfig.java similarity index 93% rename from generator/src/main/java/io/geekidea/springbootplus/generator/config/ProjectConfig.java rename to generator/src/main/java/io/geekidea/boot/generator/config/ProjectConfig.java index 463cc01..e5a0c1f 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/config/ProjectConfig.java +++ b/generator/src/main/java/io/geekidea/boot/generator/config/ProjectConfig.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.config; +package io.geekidea.boot.generator.config; -import io.geekidea.springbootplus.generator.constant.GeneratorConstant; +import io.geekidea.boot.generator.constant.GeneratorConstant; import lombok.Data; import lombok.experimental.Accessors; diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/config/TableConfig.java b/generator/src/main/java/io/geekidea/boot/generator/config/TableConfig.java similarity index 94% rename from generator/src/main/java/io/geekidea/springbootplus/generator/config/TableConfig.java rename to generator/src/main/java/io/geekidea/boot/generator/config/TableConfig.java index 89fe430..8082e2e 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/config/TableConfig.java +++ b/generator/src/main/java/io/geekidea/boot/generator/config/TableConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.config; +package io.geekidea.boot.generator.config; import lombok.Data; import lombok.experimental.Accessors; diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/config/query/SpringBootPlusMySqlQuery.java b/generator/src/main/java/io/geekidea/boot/generator/config/query/SpringBootPlusMySqlQuery.java similarity index 94% rename from generator/src/main/java/io/geekidea/springbootplus/generator/config/query/SpringBootPlusMySqlQuery.java rename to generator/src/main/java/io/geekidea/boot/generator/config/query/SpringBootPlusMySqlQuery.java index e677bc8..490b9cc 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/config/query/SpringBootPlusMySqlQuery.java +++ b/generator/src/main/java/io/geekidea/boot/generator/config/query/SpringBootPlusMySqlQuery.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.config.query; +package io.geekidea.boot.generator.config.query; import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery; diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/config/query/SpringBootPlusSqlServerQuery.java b/generator/src/main/java/io/geekidea/boot/generator/config/query/SpringBootPlusSqlServerQuery.java similarity index 96% rename from generator/src/main/java/io/geekidea/springbootplus/generator/config/query/SpringBootPlusSqlServerQuery.java rename to generator/src/main/java/io/geekidea/boot/generator/config/query/SpringBootPlusSqlServerQuery.java index 862dabf..f285887 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/config/query/SpringBootPlusSqlServerQuery.java +++ b/generator/src/main/java/io/geekidea/boot/generator/config/query/SpringBootPlusSqlServerQuery.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.config.query; +package io.geekidea.boot.generator.config.query; import com.baomidou.mybatisplus.generator.config.querys.SqlServerQuery; diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/constant/GeneratorConstant.java b/generator/src/main/java/io/geekidea/boot/generator/constant/GeneratorConstant.java similarity index 70% rename from generator/src/main/java/io/geekidea/springbootplus/generator/constant/GeneratorConstant.java rename to generator/src/main/java/io/geekidea/boot/generator/constant/GeneratorConstant.java index e2f85e9..86ebbbc 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/constant/GeneratorConstant.java +++ b/generator/src/main/java/io/geekidea/boot/generator/constant/GeneratorConstant.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.constant; +package io.geekidea.boot.generator.constant; import java.io.File; @@ -93,49 +93,49 @@ public interface GeneratorConstant { /** * 自定义继承的Entity类全称,带包名 */ - String SUPER_ENTITY_CLASS = "io.geekidea.springbootplus.framework.common.entity.BaseEntity"; + String SUPER_ENTITY_CLASS = "io.geekidea.boot.framework.common.entity.BaseEntity"; /** * 自定义继承的Controller类全称,带包名 */ - String SUPER_CONTROLLER_CLASS = "io.geekidea.springbootplus.framework.common.controller.BaseController"; + String SUPER_CONTROLLER_CLASS = "io.geekidea.boot.framework.common.controller.BaseController"; /** * 自定义继承的Service类全称,带包名 */ - String SUPER_SERVICE_CLASS = "io.geekidea.springbootplus.framework.common.service.BaseService"; + String SUPER_SERVICE_CLASS = "io.geekidea.boot.framework.common.service.BaseService"; /** * 自定义继承的ServiceImpl类全称,带包名 */ - String SUPER_SERVICE_IMPL_CLASS = "io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl"; + String SUPER_SERVICE_IMPL_CLASS = "io.geekidea.boot.framework.common.service.impl.BaseServiceImpl"; /** * 分页参数父类全称,带包名 */ - String SUPER_PAGE_PARAM_CLASS = "io.geekidea.springbootplus.framework.core.pagination.BasePageParam"; + String SUPER_PAGE_PARAM_CLASS = "io.geekidea.boot.framework.core.pagination.BasePageParam"; /** * 分页排序参数父类全称,带包名 */ - String SUPER_PAGE_ORDER_PARAM_CLASS = "io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam"; + String SUPER_PAGE_ORDER_PARAM_CLASS = "io.geekidea.boot.framework.core.pagination.BasePageOrderParam"; /** * 公共id参数类全称,带包名 */ - String ID_PARAM_CLASS = "io.geekidea.springbootplus.framework.common.param.IdParam"; + String ID_PARAM_CLASS = "io.geekidea.boot.framework.common.param.IdParam"; /** * 分页对象类全称,带包名 */ - String PAGING_CLASS = "io.geekidea.springbootplus.framework.core.pagination.Paging"; + String PAGING_CLASS = "io.geekidea.boot.framework.core.pagination.Paging"; /** * 分页信息类全称,带包名 */ - String PAGE_INFO_CLASS = "io.geekidea.springbootplus.framework.core.pagination.PageInfo"; + String PAGE_INFO_CLASS = "io.geekidea.boot.framework.core.pagination.PageInfo"; /** * 公共结果类全称,带包名 */ - String API_RESULT_CLASS = "io.geekidea.springbootplus.framework.common.api.ApiResult"; + String API_RESULT_CLASS = "io.geekidea.boot.framework.common.api.ApiResult"; /** * 分组验证Add.class类路径 */ - String VALIDATOR_ADD_PACKAGE = "io.geekidea.springbootplus.framework.core.validator.groups.Add"; + String VALIDATOR_ADD_PACKAGE = "io.geekidea.boot.framework.core.validator.groups.Add"; /** * 分组验证Update.class类路径 */ - String VALIDATOR_UPDATE_PACKAGE = "io.geekidea.springbootplus.framework.core.validator.groups.Update"; + String VALIDATOR_UPDATE_PACKAGE = "io.geekidea.boot.framework.core.validator.groups.Update"; } diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/exception/GeneratorException.java b/generator/src/main/java/io/geekidea/boot/generator/exception/GeneratorException.java similarity index 84% rename from generator/src/main/java/io/geekidea/springbootplus/generator/exception/GeneratorException.java rename to generator/src/main/java/io/geekidea/boot/generator/exception/GeneratorException.java index 2421b14..e95052d 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/exception/GeneratorException.java +++ b/generator/src/main/java/io/geekidea/boot/generator/exception/GeneratorException.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.exception; +package io.geekidea.boot.generator.exception; -import io.geekidea.springbootplus.framework.common.api.ApiCode; -import io.geekidea.springbootplus.framework.common.exception.SpringBootPlusException; +import io.geekidea.boot.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.exception.SpringBootPlusException; /** * 代码生成异常 diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/properties/GeneratorProperties.java b/generator/src/main/java/io/geekidea/boot/generator/properties/GeneratorProperties.java similarity index 90% rename from generator/src/main/java/io/geekidea/springbootplus/generator/properties/GeneratorProperties.java rename to generator/src/main/java/io/geekidea/boot/generator/properties/GeneratorProperties.java index 07d4506..a1e13e0 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/properties/GeneratorProperties.java +++ b/generator/src/main/java/io/geekidea/boot/generator/properties/GeneratorProperties.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.properties; +package io.geekidea.boot.generator.properties; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; -import io.geekidea.springbootplus.generator.config.GeneratorConfig; -import io.geekidea.springbootplus.generator.config.MybatisPlusGeneratorConfig; -import io.geekidea.springbootplus.generator.config.ProjectConfig; -import io.geekidea.springbootplus.generator.config.TableConfig; +import io.geekidea.boot.generator.config.GeneratorConfig; +import io.geekidea.boot.generator.config.MybatisPlusGeneratorConfig; +import io.geekidea.boot.generator.config.ProjectConfig; +import io.geekidea.boot.generator.config.TableConfig; import lombok.Data; import lombok.experimental.Accessors; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/generator/src/main/resources/templates/controller.java.vm b/generator/src/main/resources/templates/controller.java.vm index 1553312..85caaf6 100644 --- a/generator/src/main/resources/templates/controller.java.vm +++ b/generator/src/main/resources/templates/controller.java.vm @@ -17,9 +17,9 @@ import ${cfg.apiResultClass}; import ${cfg.pagingClass}; import ${cfg.idParamClass}; #if(${cfg.operationLog}) -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; #end #if(${cfg.paramValidation}) import ${cfg.validatorAddPackage}; diff --git a/generator/src/test/java/io/geekidea/springbootplus/generator/test/GeneratorPropertiesTest.java b/generator/src/test/java/io/geekidea/boot/generator/test/GeneratorPropertiesTest.java similarity index 87% rename from generator/src/test/java/io/geekidea/springbootplus/generator/test/GeneratorPropertiesTest.java rename to generator/src/test/java/io/geekidea/boot/generator/test/GeneratorPropertiesTest.java index 3b6a146..402495b 100644 --- a/generator/src/test/java/io/geekidea/springbootplus/generator/test/GeneratorPropertiesTest.java +++ b/generator/src/test/java/io/geekidea/boot/generator/test/GeneratorPropertiesTest.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.test; +package io.geekidea.boot.generator.test; -import io.geekidea.springbootplus.generator.CodeGenerator; -import io.geekidea.springbootplus.generator.properties.GeneratorProperties; +import io.geekidea.boot.generator.CodeGenerator; +import io.geekidea.boot.generator.properties.GeneratorProperties; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/generator/src/test/java/io/geekidea/springbootplus/generator/test/GeneratorTestApplication.java b/generator/src/test/java/io/geekidea/boot/generator/test/GeneratorTestApplication.java similarity index 85% rename from generator/src/test/java/io/geekidea/springbootplus/generator/test/GeneratorTestApplication.java rename to generator/src/test/java/io/geekidea/boot/generator/test/GeneratorTestApplication.java index f17489d..cd5c12d 100644 --- a/generator/src/test/java/io/geekidea/springbootplus/generator/test/GeneratorTestApplication.java +++ b/generator/src/test/java/io/geekidea/boot/generator/test/GeneratorTestApplication.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.generator.test; +package io.geekidea.boot.generator.test; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -22,6 +22,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @author geekidea * @date 2020/3/12 **/ -@SpringBootApplication(scanBasePackages = "io.geekidea.springbootplus.generator") +@SpringBootApplication(scanBasePackages = "io.geekidea.boot.generator") public class GeneratorTestApplication { } diff --git a/pom.xml b/pom.xml index a4f929f..bf37854 100644 --- a/pom.xml +++ b/pom.xml @@ -19,9 +19,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT pom spring-boot-plus @@ -108,59 +108,6 @@ pom import - - - org.springframework.boot - spring-boot-starter-web - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-aop - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-tomcat - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-jdbc - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-data-redis - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-json - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-validation - ${spring-boot.version} - - - org.springframework.boot - spring-boot-configuration-processor - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-security - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot.version} - test - - @@ -196,7 +143,6 @@ ${knife4j.version} - com.alibaba fastjson @@ -297,37 +243,37 @@ - io.geekidea.springbootplus + io.geekidea.boot admin ${project.version} - io.geekidea.springbootplus + io.geekidea.boot bootstrap ${project.version} - io.geekidea.springbootplus + io.geekidea.boot config ${project.version} - io.geekidea.springbootplus + io.geekidea.boot example ${project.version} - io.geekidea.springbootplus + io.geekidea.boot framework ${project.version} - io.geekidea.springbootplus + io.geekidea.boot system ${project.version} - io.geekidea.springbootplus + io.geekidea.boot scheduled ${project.version} diff --git a/scheduled/pom.xml b/scheduled/pom.xml index 270b6ed..53bfd9f 100644 --- a/scheduled/pom.xml +++ b/scheduled/pom.xml @@ -21,9 +21,9 @@ 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT scheduled @@ -32,7 +32,7 @@ - io.geekidea.springbootplus + io.geekidea.boot example diff --git a/scheduled/src/main/java/io/geekidea/springbootplus/scheduled/HelloScheduled.java b/scheduled/src/main/java/io/geekidea/boot/scheduled/HelloScheduled.java similarity index 95% rename from scheduled/src/main/java/io/geekidea/springbootplus/scheduled/HelloScheduled.java rename to scheduled/src/main/java/io/geekidea/boot/scheduled/HelloScheduled.java index 4a0b098..853f5c0 100644 --- a/scheduled/src/main/java/io/geekidea/springbootplus/scheduled/HelloScheduled.java +++ b/scheduled/src/main/java/io/geekidea/boot/scheduled/HelloScheduled.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.scheduled; +package io.geekidea.boot.scheduled; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; diff --git a/system/pom.xml b/system/pom.xml index 230daf2..85e9549 100644 --- a/system/pom.xml +++ b/system/pom.xml @@ -21,9 +21,9 @@ 4.0.0 - io.geekidea.springbootplus - parent - 2.0 + io.geekidea.boot + spring-boot-plus + 2.1-SNAPSHOT system @@ -32,7 +32,7 @@ - io.geekidea.springbootplus + io.geekidea.boot framework diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/DownloadController.java b/system/src/main/java/io/geekidea/boot/system/controller/DownloadController.java similarity index 85% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/DownloadController.java rename to system/src/main/java/io/geekidea/boot/system/controller/DownloadController.java index 5a7b8ed..9cbb67f 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/DownloadController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/DownloadController.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; +package io.geekidea.boot.system.controller; -import io.geekidea.springbootplus.config.properties.SpringBootPlusProperties; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.framework.util.DownloadUtil; +import io.geekidea.boot.config.properties.SpringBootPlusProperties; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.util.DownloadUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/HelloWorldController.java b/system/src/main/java/io/geekidea/boot/system/controller/HelloWorldController.java similarity index 88% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/HelloWorldController.java rename to system/src/main/java/io/geekidea/boot/system/controller/HelloWorldController.java index fd8af5b..ca8b44b 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/HelloWorldController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/HelloWorldController.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; +package io.geekidea.boot.system.controller; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.log.annotation.OperationLog; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/LoginController.java b/system/src/main/java/io/geekidea/boot/system/controller/LoginController.java similarity index 80% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/LoginController.java rename to system/src/main/java/io/geekidea/boot/system/controller/LoginController.java index 3e131a6..3afeb2a 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/LoginController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/LoginController.java @@ -14,17 +14,17 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; +package io.geekidea.boot.system.controller; import com.alibaba.fastjson.JSON; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLogIgnore; -import io.geekidea.springbootplus.framework.shiro.util.JwtTokenUtil; -import io.geekidea.springbootplus.system.service.LoginService; -import io.geekidea.springbootplus.system.service.SysUserService; -import io.geekidea.springbootplus.system.vo.LoginSysUserTokenVo; -import io.geekidea.springbootplus.system.vo.SysUserQueryVo; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLogIgnore; +import io.geekidea.boot.framework.shiro.util.JwtTokenUtil; +import io.geekidea.boot.system.service.LoginService; +import io.geekidea.boot.system.service.SysUserService; +import io.geekidea.boot.system.vo.LoginSysUserTokenVo; +import io.geekidea.boot.system.vo.SysUserQueryVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -63,8 +63,8 @@ public class LoginController { @PostMapping("/login") @OperationLogIgnore - @ApiOperation(value = "登录", notes = "系统用户登录", response = io.geekidea.springbootplus.system.vo.LoginSysUserTokenVo.class) - public ApiResult login(@Validated @RequestBody io.geekidea.springbootplus.system.param.LoginParam loginParam, HttpServletResponse response) throws Exception { + @ApiOperation(value = "登录", notes = "系统用户登录", response = io.geekidea.boot.system.vo.LoginSysUserTokenVo.class) + public ApiResult login(@Validated @RequestBody io.geekidea.boot.system.param.LoginParam loginParam, HttpServletResponse response) throws Exception { LoginSysUserTokenVo loginSysUserTokenVo = loginService.login(loginParam); // 设置token响应头 response.setHeader(JwtTokenUtil.getTokenName(), loginSysUserTokenVo.getToken()); diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/ResourceController.java b/system/src/main/java/io/geekidea/boot/system/controller/ResourceController.java similarity index 83% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/ResourceController.java rename to system/src/main/java/io/geekidea/boot/system/controller/ResourceController.java index f9be29a..8b5d283 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/ResourceController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/ResourceController.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; +package io.geekidea.boot.system.controller; -import io.geekidea.springbootplus.config.properties.SpringBootPlusProperties; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; +import io.geekidea.boot.config.properties.SpringBootPlusProperties; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/SysDepartmentController.java b/system/src/main/java/io/geekidea/boot/system/controller/SysDepartmentController.java similarity index 87% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/SysDepartmentController.java rename to system/src/main/java/io/geekidea/boot/system/controller/SysDepartmentController.java index 0566fea..bf3f56f 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/SysDepartmentController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/SysDepartmentController.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; +package io.geekidea.boot.system.controller; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.controller.BaseController; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.system.entity.SysDepartment; -import io.geekidea.springbootplus.system.param.SysDepartmentPageParam; -import io.geekidea.springbootplus.system.service.SysDepartmentService; -import io.geekidea.springbootplus.system.vo.SysDepartmentQueryVo; -import io.geekidea.springbootplus.system.vo.SysDepartmentTreeVo; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.system.entity.SysDepartment; +import io.geekidea.boot.system.param.SysDepartmentPageParam; +import io.geekidea.boot.system.service.SysDepartmentService; +import io.geekidea.boot.system.vo.SysDepartmentQueryVo; +import io.geekidea.boot.system.vo.SysDepartmentTreeVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/SysPermissionController.java b/system/src/main/java/io/geekidea/boot/system/controller/SysPermissionController.java similarity index 90% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/SysPermissionController.java rename to system/src/main/java/io/geekidea/boot/system/controller/SysPermissionController.java index 46a5e5c..23cdb12 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/SysPermissionController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/SysPermissionController.java @@ -14,20 +14,20 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; - -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.controller.BaseController; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.system.entity.SysPermission; -import io.geekidea.springbootplus.system.param.SysPermissionPageParam; -import io.geekidea.springbootplus.system.service.SysPermissionService; -import io.geekidea.springbootplus.system.service.SysRolePermissionService; -import io.geekidea.springbootplus.system.vo.SysPermissionQueryVo; -import io.geekidea.springbootplus.system.vo.SysPermissionTreeVo; +package io.geekidea.boot.system.controller; + +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.system.entity.SysPermission; +import io.geekidea.boot.system.param.SysPermissionPageParam; +import io.geekidea.boot.system.service.SysPermissionService; +import io.geekidea.boot.system.service.SysRolePermissionService; +import io.geekidea.boot.system.vo.SysPermissionQueryVo; +import io.geekidea.boot.system.vo.SysPermissionTreeVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/SysRoleController.java b/system/src/main/java/io/geekidea/boot/system/controller/SysRoleController.java similarity index 84% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/SysRoleController.java rename to system/src/main/java/io/geekidea/boot/system/controller/SysRoleController.java index c5fbd9c..1064ddb 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/SysRoleController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/SysRoleController.java @@ -14,20 +14,20 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; +package io.geekidea.boot.system.controller; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.controller.BaseController; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.core.validator.groups.Add; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.system.entity.SysRole; -import io.geekidea.springbootplus.system.param.sysrole.SysRolePageParam; -import io.geekidea.springbootplus.system.param.sysrole.UpdateSysRolePermissionParam; -import io.geekidea.springbootplus.system.service.SysRoleService; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.system.entity.SysRole; +import io.geekidea.boot.system.param.sysrole.SysRolePageParam; +import io.geekidea.boot.system.param.sysrole.UpdateSysRolePermissionParam; +import io.geekidea.boot.system.service.SysRoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/SysUserController.java b/system/src/main/java/io/geekidea/boot/system/controller/SysUserController.java similarity index 82% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/SysUserController.java rename to system/src/main/java/io/geekidea/boot/system/controller/SysUserController.java index d010fe8..4a8fbf3 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/SysUserController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/SysUserController.java @@ -14,24 +14,24 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; +package io.geekidea.boot.system.controller; -import io.geekidea.springbootplus.config.properties.SpringBootPlusProperties; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.common.controller.BaseController; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.core.validator.groups.Add; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.system.entity.SysUser; -import io.geekidea.springbootplus.system.param.sysuser.ResetPasswordParam; -import io.geekidea.springbootplus.system.param.sysuser.SysUserPageParam; -import io.geekidea.springbootplus.system.param.sysuser.UpdatePasswordParam; -import io.geekidea.springbootplus.system.param.sysuser.UploadHeadParam; -import io.geekidea.springbootplus.system.service.SysUserService; -import io.geekidea.springbootplus.system.vo.SysUserQueryVo; +import io.geekidea.boot.config.properties.SpringBootPlusProperties; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.system.entity.SysUser; +import io.geekidea.boot.system.param.sysuser.ResetPasswordParam; +import io.geekidea.boot.system.param.sysuser.SysUserPageParam; +import io.geekidea.boot.system.param.sysuser.UpdatePasswordParam; +import io.geekidea.boot.system.param.sysuser.UploadHeadParam; +import io.geekidea.boot.system.service.SysUserService; +import io.geekidea.boot.system.vo.SysUserQueryVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/UploadController.java b/system/src/main/java/io/geekidea/boot/system/controller/UploadController.java similarity index 88% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/UploadController.java rename to system/src/main/java/io/geekidea/boot/system/controller/UploadController.java index 7f22b41..b0af8ee 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/UploadController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/UploadController.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; +package io.geekidea.boot.system.controller; -import io.geekidea.springbootplus.config.properties.SpringBootPlusProperties; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.framework.util.UploadUtil; +import io.geekidea.boot.config.properties.SpringBootPlusProperties; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.util.UploadUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/VerificationCodeController.java b/system/src/main/java/io/geekidea/boot/system/controller/VerificationCodeController.java similarity index 87% rename from system/src/main/java/io/geekidea/springbootplus/system/controller/VerificationCodeController.java rename to system/src/main/java/io/geekidea/boot/system/controller/VerificationCodeController.java index d836667..bfa65bd 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/VerificationCodeController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/VerificationCodeController.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.controller; +package io.geekidea.boot.system.controller; -import io.geekidea.springbootplus.config.constant.CommonConstant; -import io.geekidea.springbootplus.config.constant.CommonRedisKey; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.framework.util.UUIDUtil; -import io.geekidea.springbootplus.framework.util.VerificationCode; +import io.geekidea.boot.config.constant.CommonConstant; +import io.geekidea.boot.config.constant.CommonRedisKey; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.util.UUIDUtil; +import io.geekidea.boot.framework.util.VerificationCode; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/convert/SysDepartmentConvert.java b/system/src/main/java/io/geekidea/boot/system/convert/SysDepartmentConvert.java similarity index 88% rename from system/src/main/java/io/geekidea/springbootplus/system/convert/SysDepartmentConvert.java rename to system/src/main/java/io/geekidea/boot/system/convert/SysDepartmentConvert.java index dbb038d..24edd07 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/convert/SysDepartmentConvert.java +++ b/system/src/main/java/io/geekidea/boot/system/convert/SysDepartmentConvert.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.convert; +package io.geekidea.boot.system.convert; -import io.geekidea.springbootplus.system.entity.SysDepartment; -import io.geekidea.springbootplus.system.vo.SysDepartmentTreeVo; +import io.geekidea.boot.system.entity.SysDepartment; +import io.geekidea.boot.system.vo.SysDepartmentTreeVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/convert/SysPermissionConvert.java b/system/src/main/java/io/geekidea/boot/system/convert/SysPermissionConvert.java similarity index 86% rename from system/src/main/java/io/geekidea/springbootplus/system/convert/SysPermissionConvert.java rename to system/src/main/java/io/geekidea/boot/system/convert/SysPermissionConvert.java index 803bf78..d895bcd 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/convert/SysPermissionConvert.java +++ b/system/src/main/java/io/geekidea/boot/system/convert/SysPermissionConvert.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.convert; +package io.geekidea.boot.system.convert; -import io.geekidea.springbootplus.system.entity.SysPermission; -import io.geekidea.springbootplus.system.vo.SysPermissionTreeVo; +import io.geekidea.boot.system.entity.SysPermission; +import io.geekidea.boot.system.vo.SysPermissionTreeVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/convert/SysRoleConvert.java b/system/src/main/java/io/geekidea/boot/system/convert/SysRoleConvert.java similarity index 94% rename from system/src/main/java/io/geekidea/springbootplus/system/convert/SysRoleConvert.java rename to system/src/main/java/io/geekidea/boot/system/convert/SysRoleConvert.java index 569eeea..7677b14 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/convert/SysRoleConvert.java +++ b/system/src/main/java/io/geekidea/boot/system/convert/SysRoleConvert.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.convert; +package io.geekidea.boot.system.convert; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/convert/SysUserConvert.java b/system/src/main/java/io/geekidea/boot/system/convert/SysUserConvert.java similarity index 82% rename from system/src/main/java/io/geekidea/springbootplus/system/convert/SysUserConvert.java rename to system/src/main/java/io/geekidea/boot/system/convert/SysUserConvert.java index bd85862..85a56be 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/convert/SysUserConvert.java +++ b/system/src/main/java/io/geekidea/boot/system/convert/SysUserConvert.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.convert; +package io.geekidea.boot.system.convert; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserVo; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -37,6 +37,6 @@ public interface SysUserConvert { * @param sysUser * @return */ - LoginSysUserVo sysUserToLoginSysUserVo(io.geekidea.springbootplus.system.entity.SysUser sysUser); + LoginSysUserVo sysUserToLoginSysUserVo(io.geekidea.boot.system.entity.SysUser sysUser); } diff --git a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysDepartment.java b/system/src/main/java/io/geekidea/boot/system/entity/SysDepartment.java similarity index 94% rename from system/src/main/java/io/geekidea/springbootplus/system/entity/SysDepartment.java rename to system/src/main/java/io/geekidea/boot/system/entity/SysDepartment.java index d3aeae6..daa3783 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysDepartment.java +++ b/system/src/main/java/io/geekidea/boot/system/entity/SysDepartment.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.entity; +package io.geekidea.boot.system.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.Version; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.common.entity.BaseEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysPermission.java b/system/src/main/java/io/geekidea/boot/system/entity/SysPermission.java similarity index 95% rename from system/src/main/java/io/geekidea/springbootplus/system/entity/SysPermission.java rename to system/src/main/java/io/geekidea/boot/system/entity/SysPermission.java index 40ebeac..288f0ca 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysPermission.java +++ b/system/src/main/java/io/geekidea/boot/system/entity/SysPermission.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.entity; +package io.geekidea.boot.system.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.Version; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.common.entity.BaseEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysRole.java b/system/src/main/java/io/geekidea/boot/system/entity/SysRole.java similarity index 92% rename from system/src/main/java/io/geekidea/springbootplus/system/entity/SysRole.java rename to system/src/main/java/io/geekidea/boot/system/entity/SysRole.java index 3770b59..8707639 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysRole.java +++ b/system/src/main/java/io/geekidea/boot/system/entity/SysRole.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.entity; +package io.geekidea.boot.system.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.Version; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.core.validator.groups.Update; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysRolePermission.java b/system/src/main/java/io/geekidea/boot/system/entity/SysRolePermission.java similarity index 94% rename from system/src/main/java/io/geekidea/springbootplus/system/entity/SysRolePermission.java rename to system/src/main/java/io/geekidea/boot/system/entity/SysRolePermission.java index 7e4942c..b9f3f25 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysRolePermission.java +++ b/system/src/main/java/io/geekidea/boot/system/entity/SysRolePermission.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.entity; +package io.geekidea.boot.system.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.Version; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.common.entity.BaseEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysUser.java b/system/src/main/java/io/geekidea/boot/system/entity/SysUser.java similarity index 92% rename from system/src/main/java/io/geekidea/springbootplus/system/entity/SysUser.java rename to system/src/main/java/io/geekidea/boot/system/entity/SysUser.java index 8f150a7..45bef2d 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/entity/SysUser.java +++ b/system/src/main/java/io/geekidea/boot/system/entity/SysUser.java @@ -14,15 +14,15 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.entity; +package io.geekidea.boot.system.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.Version; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; -import io.geekidea.springbootplus.framework.core.validator.groups.Add; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/enums/MenuLevelEnum.java b/system/src/main/java/io/geekidea/boot/system/enums/MenuLevelEnum.java similarity index 91% rename from system/src/main/java/io/geekidea/springbootplus/system/enums/MenuLevelEnum.java rename to system/src/main/java/io/geekidea/boot/system/enums/MenuLevelEnum.java index 30de05f..e08dbcf 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/enums/MenuLevelEnum.java +++ b/system/src/main/java/io/geekidea/boot/system/enums/MenuLevelEnum.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.enums; +package io.geekidea.boot.system.enums; -import io.geekidea.springbootplus.framework.common.enums.BaseEnum; +import io.geekidea.boot.framework.common.enums.BaseEnum; /** * 层级枚举 diff --git a/system/src/main/java/io/geekidea/springbootplus/system/enums/StateEnum.java b/system/src/main/java/io/geekidea/boot/system/enums/StateEnum.java similarity index 89% rename from system/src/main/java/io/geekidea/springbootplus/system/enums/StateEnum.java rename to system/src/main/java/io/geekidea/boot/system/enums/StateEnum.java index 54dfd17..285828d 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/enums/StateEnum.java +++ b/system/src/main/java/io/geekidea/boot/system/enums/StateEnum.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.enums; +package io.geekidea.boot.system.enums; -import io.geekidea.springbootplus.framework.common.enums.BaseEnum; +import io.geekidea.boot.framework.common.enums.BaseEnum; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/exception/SysLoginException.java b/system/src/main/java/io/geekidea/boot/system/exception/SysLoginException.java similarity index 84% rename from system/src/main/java/io/geekidea/springbootplus/system/exception/SysLoginException.java rename to system/src/main/java/io/geekidea/boot/system/exception/SysLoginException.java index ee83e8d..e96e9e9 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/exception/SysLoginException.java +++ b/system/src/main/java/io/geekidea/boot/system/exception/SysLoginException.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.exception; +package io.geekidea.boot.system.exception; -import io.geekidea.springbootplus.framework.common.api.ApiCode; -import io.geekidea.springbootplus.framework.common.exception.SpringBootPlusException; +import io.geekidea.boot.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.exception.SpringBootPlusException; /** * 系统登录异常 diff --git a/system/src/main/java/io/geekidea/springbootplus/system/exception/VerificationCodeException.java b/system/src/main/java/io/geekidea/boot/system/exception/VerificationCodeException.java similarity index 84% rename from system/src/main/java/io/geekidea/springbootplus/system/exception/VerificationCodeException.java rename to system/src/main/java/io/geekidea/boot/system/exception/VerificationCodeException.java index 5ea91ae..a83f68b 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/exception/VerificationCodeException.java +++ b/system/src/main/java/io/geekidea/boot/system/exception/VerificationCodeException.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.exception; +package io.geekidea.boot.system.exception; -import io.geekidea.springbootplus.framework.common.api.ApiCode; -import io.geekidea.springbootplus.framework.common.exception.SpringBootPlusException; +import io.geekidea.boot.framework.common.api.ApiCode; +import io.geekidea.boot.framework.common.exception.SpringBootPlusException; /** * 验证码校验异常 diff --git a/system/src/main/java/io/geekidea/springbootplus/system/interceptor/DownloadInterceptor.java b/system/src/main/java/io/geekidea/boot/system/interceptor/DownloadInterceptor.java similarity index 97% rename from system/src/main/java/io/geekidea/springbootplus/system/interceptor/DownloadInterceptor.java rename to system/src/main/java/io/geekidea/boot/system/interceptor/DownloadInterceptor.java index 409ecae..4b61bb5 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/interceptor/DownloadInterceptor.java +++ b/system/src/main/java/io/geekidea/boot/system/interceptor/DownloadInterceptor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.interceptor; +package io.geekidea.boot.system.interceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/interceptor/ResourceInterceptor.java b/system/src/main/java/io/geekidea/boot/system/interceptor/ResourceInterceptor.java similarity index 97% rename from system/src/main/java/io/geekidea/springbootplus/system/interceptor/ResourceInterceptor.java rename to system/src/main/java/io/geekidea/boot/system/interceptor/ResourceInterceptor.java index d02e5a3..c02b0b8 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/interceptor/ResourceInterceptor.java +++ b/system/src/main/java/io/geekidea/boot/system/interceptor/ResourceInterceptor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.interceptor; +package io.geekidea.boot.system.interceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/interceptor/UploadInterceptor.java b/system/src/main/java/io/geekidea/boot/system/interceptor/UploadInterceptor.java similarity index 97% rename from system/src/main/java/io/geekidea/springbootplus/system/interceptor/UploadInterceptor.java rename to system/src/main/java/io/geekidea/boot/system/interceptor/UploadInterceptor.java index f5e8343..a49f3ff 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/interceptor/UploadInterceptor.java +++ b/system/src/main/java/io/geekidea/boot/system/interceptor/UploadInterceptor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.interceptor; +package io.geekidea.boot.system.interceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysDepartmentMapper.java b/system/src/main/java/io/geekidea/boot/system/mapper/SysDepartmentMapper.java similarity index 85% rename from system/src/main/java/io/geekidea/springbootplus/system/mapper/SysDepartmentMapper.java rename to system/src/main/java/io/geekidea/boot/system/mapper/SysDepartmentMapper.java index abc7cf9..9a7cc58 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysDepartmentMapper.java +++ b/system/src/main/java/io/geekidea/boot/system/mapper/SysDepartmentMapper.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.mapper; +package io.geekidea.boot.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.system.entity.SysDepartment; -import io.geekidea.springbootplus.system.param.SysDepartmentPageParam; -import io.geekidea.springbootplus.system.vo.SysDepartmentQueryVo; +import io.geekidea.boot.system.entity.SysDepartment; +import io.geekidea.boot.system.param.SysDepartmentPageParam; +import io.geekidea.boot.system.vo.SysDepartmentQueryVo; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysPermissionMapper.java b/system/src/main/java/io/geekidea/boot/system/mapper/SysPermissionMapper.java similarity index 88% rename from system/src/main/java/io/geekidea/springbootplus/system/mapper/SysPermissionMapper.java rename to system/src/main/java/io/geekidea/boot/system/mapper/SysPermissionMapper.java index 6e3ff7e..e1c4e0f 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysPermissionMapper.java +++ b/system/src/main/java/io/geekidea/boot/system/mapper/SysPermissionMapper.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.mapper; +package io.geekidea.boot.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.system.entity.SysPermission; -import io.geekidea.springbootplus.system.param.SysPermissionPageParam; -import io.geekidea.springbootplus.system.vo.SysPermissionQueryVo; +import io.geekidea.boot.system.entity.SysPermission; +import io.geekidea.boot.system.param.SysPermissionPageParam; +import io.geekidea.boot.system.vo.SysPermissionQueryVo; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysRoleMapper.java b/system/src/main/java/io/geekidea/boot/system/mapper/SysRoleMapper.java similarity index 86% rename from system/src/main/java/io/geekidea/springbootplus/system/mapper/SysRoleMapper.java rename to system/src/main/java/io/geekidea/boot/system/mapper/SysRoleMapper.java index 95348b3..e5fc22c 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysRoleMapper.java +++ b/system/src/main/java/io/geekidea/boot/system/mapper/SysRoleMapper.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.mapper; +package io.geekidea.boot.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.system.entity.SysRole; -import io.geekidea.springbootplus.system.param.sysrole.SysRolePageParam; -import io.geekidea.springbootplus.system.vo.SysRoleQueryVo; +import io.geekidea.boot.system.entity.SysRole; +import io.geekidea.boot.system.param.sysrole.SysRolePageParam; +import io.geekidea.boot.system.vo.SysRoleQueryVo; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysRolePermissionMapper.java b/system/src/main/java/io/geekidea/boot/system/mapper/SysRolePermissionMapper.java similarity index 88% rename from system/src/main/java/io/geekidea/springbootplus/system/mapper/SysRolePermissionMapper.java rename to system/src/main/java/io/geekidea/boot/system/mapper/SysRolePermissionMapper.java index 6fb323f..8260e41 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysRolePermissionMapper.java +++ b/system/src/main/java/io/geekidea/boot/system/mapper/SysRolePermissionMapper.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.mapper; +package io.geekidea.boot.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.system.entity.SysRolePermission; -import io.geekidea.springbootplus.system.param.sysrole.SysRolePermissionPageParam; -import io.geekidea.springbootplus.system.vo.SysRolePermissionQueryVo; +import io.geekidea.boot.system.entity.SysRolePermission; +import io.geekidea.boot.system.param.sysrole.SysRolePermissionPageParam; +import io.geekidea.boot.system.vo.SysRolePermissionQueryVo; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysUserMapper.java b/system/src/main/java/io/geekidea/boot/system/mapper/SysUserMapper.java similarity index 86% rename from system/src/main/java/io/geekidea/springbootplus/system/mapper/SysUserMapper.java rename to system/src/main/java/io/geekidea/boot/system/mapper/SysUserMapper.java index 64073d8..5893fd8 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/mapper/SysUserMapper.java +++ b/system/src/main/java/io/geekidea/boot/system/mapper/SysUserMapper.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.mapper; +package io.geekidea.boot.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.system.entity.SysUser; -import io.geekidea.springbootplus.system.param.sysuser.SysUserPageParam; -import io.geekidea.springbootplus.system.vo.SysUserQueryVo; +import io.geekidea.boot.system.entity.SysUser; +import io.geekidea.boot.system.param.sysuser.SysUserPageParam; +import io.geekidea.boot.system.vo.SysUserQueryVo; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/LoginParam.java b/system/src/main/java/io/geekidea/boot/system/param/LoginParam.java similarity index 91% rename from system/src/main/java/io/geekidea/springbootplus/system/param/LoginParam.java rename to system/src/main/java/io/geekidea/boot/system/param/LoginParam.java index 259c932..a45305f 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/LoginParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/LoginParam.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param; +package io.geekidea.boot.system.param; -import io.geekidea.springbootplus.framework.shiro.service.LoginUsername; +import io.geekidea.boot.framework.shiro.service.LoginUsername; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/SysDepartmentPageParam.java b/system/src/main/java/io/geekidea/boot/system/param/SysDepartmentPageParam.java similarity index 89% rename from system/src/main/java/io/geekidea/springbootplus/system/param/SysDepartmentPageParam.java rename to system/src/main/java/io/geekidea/boot/system/param/SysDepartmentPageParam.java index 24acea2..7092a63 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/SysDepartmentPageParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/SysDepartmentPageParam.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param; +package io.geekidea.boot.system.param; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/SysPermissionPageParam.java b/system/src/main/java/io/geekidea/boot/system/param/SysPermissionPageParam.java similarity index 89% rename from system/src/main/java/io/geekidea/springbootplus/system/param/SysPermissionPageParam.java rename to system/src/main/java/io/geekidea/boot/system/param/SysPermissionPageParam.java index 98c79bb..be888b7 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/SysPermissionPageParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/SysPermissionPageParam.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param; +package io.geekidea.boot.system.param; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/sysrole/SysRolePageParam.java b/system/src/main/java/io/geekidea/boot/system/param/sysrole/SysRolePageParam.java similarity index 91% rename from system/src/main/java/io/geekidea/springbootplus/system/param/sysrole/SysRolePageParam.java rename to system/src/main/java/io/geekidea/boot/system/param/sysrole/SysRolePageParam.java index b46a0fe..7dfa9c1 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/sysrole/SysRolePageParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/sysrole/SysRolePageParam.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param.sysrole; +package io.geekidea.boot.system.param.sysrole; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/sysrole/SysRolePermissionPageParam.java b/system/src/main/java/io/geekidea/boot/system/param/sysrole/SysRolePermissionPageParam.java similarity index 89% rename from system/src/main/java/io/geekidea/springbootplus/system/param/sysrole/SysRolePermissionPageParam.java rename to system/src/main/java/io/geekidea/boot/system/param/sysrole/SysRolePermissionPageParam.java index 0782359..2faf294 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/sysrole/SysRolePermissionPageParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/sysrole/SysRolePermissionPageParam.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param.sysrole; +package io.geekidea.boot.system.param.sysrole; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/sysrole/UpdateSysRolePermissionParam.java b/system/src/main/java/io/geekidea/boot/system/param/sysrole/UpdateSysRolePermissionParam.java similarity index 95% rename from system/src/main/java/io/geekidea/springbootplus/system/param/sysrole/UpdateSysRolePermissionParam.java rename to system/src/main/java/io/geekidea/boot/system/param/sysrole/UpdateSysRolePermissionParam.java index 5abcd2e..61ecae4 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/sysrole/UpdateSysRolePermissionParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/sysrole/UpdateSysRolePermissionParam.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param.sysrole; +package io.geekidea.boot.system.param.sysrole; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/ResetPasswordParam.java b/system/src/main/java/io/geekidea/boot/system/param/sysuser/ResetPasswordParam.java similarity index 96% rename from system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/ResetPasswordParam.java rename to system/src/main/java/io/geekidea/boot/system/param/sysuser/ResetPasswordParam.java index 58d2b64..52e00af 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/ResetPasswordParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/sysuser/ResetPasswordParam.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param.sysuser; +package io.geekidea.boot.system.param.sysuser; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/SysUserPageParam.java b/system/src/main/java/io/geekidea/boot/system/param/sysuser/SysUserPageParam.java similarity index 92% rename from system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/SysUserPageParam.java rename to system/src/main/java/io/geekidea/boot/system/param/sysuser/SysUserPageParam.java index ce50002..24e0e9d 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/SysUserPageParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/sysuser/SysUserPageParam.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param.sysuser; +package io.geekidea.boot.system.param.sysuser; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/UpdatePasswordParam.java b/system/src/main/java/io/geekidea/boot/system/param/sysuser/UpdatePasswordParam.java similarity index 96% rename from system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/UpdatePasswordParam.java rename to system/src/main/java/io/geekidea/boot/system/param/sysuser/UpdatePasswordParam.java index a6c5286..4eefe5c 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/UpdatePasswordParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/sysuser/UpdatePasswordParam.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param.sysuser; +package io.geekidea.boot.system.param.sysuser; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/UploadHeadParam.java b/system/src/main/java/io/geekidea/boot/system/param/sysuser/UploadHeadParam.java similarity index 96% rename from system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/UploadHeadParam.java rename to system/src/main/java/io/geekidea/boot/system/param/sysuser/UploadHeadParam.java index b19c6cd..4245241 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/param/sysuser/UploadHeadParam.java +++ b/system/src/main/java/io/geekidea/boot/system/param/sysuser/UploadHeadParam.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.param.sysuser; +package io.geekidea.boot.system.param.sysuser; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/LoginService.java b/system/src/main/java/io/geekidea/boot/system/service/LoginService.java similarity index 86% rename from system/src/main/java/io/geekidea/springbootplus/system/service/LoginService.java rename to system/src/main/java/io/geekidea/boot/system/service/LoginService.java index ec2c2c2..016059a 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/LoginService.java +++ b/system/src/main/java/io/geekidea/boot/system/service/LoginService.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service; +package io.geekidea.boot.system.service; -import io.geekidea.springbootplus.system.entity.SysUser; -import io.geekidea.springbootplus.system.param.LoginParam; -import io.geekidea.springbootplus.system.vo.LoginSysUserTokenVo; +import io.geekidea.boot.system.entity.SysUser; +import io.geekidea.boot.system.param.LoginParam; +import io.geekidea.boot.system.vo.LoginSysUserTokenVo; import javax.servlet.http.HttpServletRequest; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/SysDepartmentService.java b/system/src/main/java/io/geekidea/boot/system/service/SysDepartmentService.java similarity index 83% rename from system/src/main/java/io/geekidea/springbootplus/system/service/SysDepartmentService.java rename to system/src/main/java/io/geekidea/boot/system/service/SysDepartmentService.java index e1eb458..ca6af2a 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/SysDepartmentService.java +++ b/system/src/main/java/io/geekidea/boot/system/service/SysDepartmentService.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service; +package io.geekidea.boot.system.service; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.system.entity.SysDepartment; -import io.geekidea.springbootplus.system.param.SysDepartmentPageParam; -import io.geekidea.springbootplus.system.vo.SysDepartmentQueryVo; -import io.geekidea.springbootplus.system.vo.SysDepartmentTreeVo; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.system.entity.SysDepartment; +import io.geekidea.boot.system.param.SysDepartmentPageParam; +import io.geekidea.boot.system.vo.SysDepartmentQueryVo; +import io.geekidea.boot.system.vo.SysDepartmentTreeVo; import java.io.Serializable; import java.util.List; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/SysPermissionService.java b/system/src/main/java/io/geekidea/boot/system/service/SysPermissionService.java similarity index 88% rename from system/src/main/java/io/geekidea/springbootplus/system/service/SysPermissionService.java rename to system/src/main/java/io/geekidea/boot/system/service/SysPermissionService.java index c675185..743fba2 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/SysPermissionService.java +++ b/system/src/main/java/io/geekidea/boot/system/service/SysPermissionService.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service; - -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.system.entity.SysPermission; -import io.geekidea.springbootplus.system.param.SysPermissionPageParam; -import io.geekidea.springbootplus.system.vo.SysPermissionQueryVo; -import io.geekidea.springbootplus.system.vo.SysPermissionTreeVo; +package io.geekidea.boot.system.service; + +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.system.entity.SysPermission; +import io.geekidea.boot.system.param.SysPermissionPageParam; +import io.geekidea.boot.system.vo.SysPermissionQueryVo; +import io.geekidea.boot.system.vo.SysPermissionTreeVo; import java.io.Serializable; import java.util.List; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/SysRolePermissionService.java b/system/src/main/java/io/geekidea/boot/system/service/SysRolePermissionService.java similarity index 93% rename from system/src/main/java/io/geekidea/springbootplus/system/service/SysRolePermissionService.java rename to system/src/main/java/io/geekidea/boot/system/service/SysRolePermissionService.java index f385e8f..2a37029 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/SysRolePermissionService.java +++ b/system/src/main/java/io/geekidea/boot/system/service/SysRolePermissionService.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service; +package io.geekidea.boot.system.service; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.system.entity.SysRolePermission; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.system.entity.SysRolePermission; import org.apache.commons.collections4.SetUtils; import java.util.List; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/SysRoleService.java b/system/src/main/java/io/geekidea/boot/system/service/SysRoleService.java similarity index 83% rename from system/src/main/java/io/geekidea/springbootplus/system/service/SysRoleService.java rename to system/src/main/java/io/geekidea/boot/system/service/SysRoleService.java index abb7480..c7c1cb1 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/SysRoleService.java +++ b/system/src/main/java/io/geekidea/boot/system/service/SysRoleService.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service; +package io.geekidea.boot.system.service; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.system.entity.SysRole; -import io.geekidea.springbootplus.system.param.sysrole.SysRolePageParam; -import io.geekidea.springbootplus.system.param.sysrole.UpdateSysRolePermissionParam; -import io.geekidea.springbootplus.system.vo.SysRoleQueryVo; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.system.entity.SysRole; +import io.geekidea.boot.system.param.sysrole.SysRolePageParam; +import io.geekidea.boot.system.param.sysrole.UpdateSysRolePermissionParam; +import io.geekidea.boot.system.vo.SysRoleQueryVo; import java.io.Serializable; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/SysUserService.java b/system/src/main/java/io/geekidea/boot/system/service/SysUserService.java similarity index 84% rename from system/src/main/java/io/geekidea/springbootplus/system/service/SysUserService.java rename to system/src/main/java/io/geekidea/boot/system/service/SysUserService.java index e13f44c..d53239c 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/SysUserService.java +++ b/system/src/main/java/io/geekidea/boot/system/service/SysUserService.java @@ -14,15 +14,15 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service; +package io.geekidea.boot.system.service; -import io.geekidea.springbootplus.framework.common.service.BaseService; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.system.entity.SysUser; -import io.geekidea.springbootplus.system.param.sysuser.ResetPasswordParam; -import io.geekidea.springbootplus.system.param.sysuser.SysUserPageParam; -import io.geekidea.springbootplus.system.param.sysuser.UpdatePasswordParam; -import io.geekidea.springbootplus.system.vo.SysUserQueryVo; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.system.entity.SysUser; +import io.geekidea.boot.system.param.sysuser.ResetPasswordParam; +import io.geekidea.boot.system.param.sysuser.SysUserPageParam; +import io.geekidea.boot.system.param.sysuser.UpdatePasswordParam; +import io.geekidea.boot.system.vo.SysUserQueryVo; import java.io.Serializable; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/LoginServiceImpl.java b/system/src/main/java/io/geekidea/boot/system/service/impl/LoginServiceImpl.java similarity index 83% rename from system/src/main/java/io/geekidea/springbootplus/system/service/impl/LoginServiceImpl.java rename to system/src/main/java/io/geekidea/boot/system/service/impl/LoginServiceImpl.java index c0c565a..82166c7 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/LoginServiceImpl.java +++ b/system/src/main/java/io/geekidea/boot/system/service/impl/LoginServiceImpl.java @@ -14,32 +14,32 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service.impl; +package io.geekidea.boot.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import io.geekidea.springbootplus.config.constant.CommonRedisKey; -import io.geekidea.springbootplus.config.properties.JwtProperties; -import io.geekidea.springbootplus.config.properties.SpringBootPlusProperties; -import io.geekidea.springbootplus.framework.shiro.cache.LoginRedisService; -import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken; -import io.geekidea.springbootplus.framework.shiro.util.JwtTokenUtil; -import io.geekidea.springbootplus.framework.shiro.util.JwtUtil; -import io.geekidea.springbootplus.framework.shiro.util.SaltUtil; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserVo; -import io.geekidea.springbootplus.framework.util.PasswordUtil; -import io.geekidea.springbootplus.system.convert.SysUserConvert; -import io.geekidea.springbootplus.system.entity.SysDepartment; -import io.geekidea.springbootplus.system.entity.SysRole; -import io.geekidea.springbootplus.system.entity.SysUser; -import io.geekidea.springbootplus.system.enums.StateEnum; -import io.geekidea.springbootplus.system.exception.VerificationCodeException; -import io.geekidea.springbootplus.system.mapper.SysUserMapper; -import io.geekidea.springbootplus.system.param.LoginParam; -import io.geekidea.springbootplus.system.service.LoginService; -import io.geekidea.springbootplus.system.service.SysDepartmentService; -import io.geekidea.springbootplus.system.service.SysRolePermissionService; -import io.geekidea.springbootplus.system.service.SysRoleService; -import io.geekidea.springbootplus.system.vo.LoginSysUserTokenVo; +import io.geekidea.boot.config.constant.CommonRedisKey; +import io.geekidea.boot.config.properties.JwtProperties; +import io.geekidea.boot.config.properties.SpringBootPlusProperties; +import io.geekidea.boot.framework.shiro.cache.LoginRedisService; +import io.geekidea.boot.framework.shiro.jwt.JwtToken; +import io.geekidea.boot.framework.shiro.util.JwtTokenUtil; +import io.geekidea.boot.framework.shiro.util.JwtUtil; +import io.geekidea.boot.framework.shiro.util.SaltUtil; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserVo; +import io.geekidea.boot.framework.util.PasswordUtil; +import io.geekidea.boot.system.convert.SysUserConvert; +import io.geekidea.boot.system.entity.SysDepartment; +import io.geekidea.boot.system.entity.SysRole; +import io.geekidea.boot.system.entity.SysUser; +import io.geekidea.boot.system.enums.StateEnum; +import io.geekidea.boot.system.exception.VerificationCodeException; +import io.geekidea.boot.system.mapper.SysUserMapper; +import io.geekidea.boot.system.param.LoginParam; +import io.geekidea.boot.system.service.LoginService; +import io.geekidea.boot.system.service.SysDepartmentService; +import io.geekidea.boot.system.service.SysRolePermissionService; +import io.geekidea.boot.system.service.SysRoleService; +import io.geekidea.boot.system.vo.LoginSysUserTokenVo; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysDepartmentServiceImpl.java b/system/src/main/java/io/geekidea/boot/system/service/impl/SysDepartmentServiceImpl.java similarity index 85% rename from system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysDepartmentServiceImpl.java rename to system/src/main/java/io/geekidea/boot/system/service/impl/SysDepartmentServiceImpl.java index 4158965..740ce17 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysDepartmentServiceImpl.java +++ b/system/src/main/java/io/geekidea/boot/system/service/impl/SysDepartmentServiceImpl.java @@ -14,23 +14,23 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service.impl; +package io.geekidea.boot.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.framework.core.pagination.PageInfo; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.system.convert.SysDepartmentConvert; -import io.geekidea.springbootplus.system.entity.SysDepartment; -import io.geekidea.springbootplus.system.enums.StateEnum; -import io.geekidea.springbootplus.system.mapper.SysDepartmentMapper; -import io.geekidea.springbootplus.system.param.SysDepartmentPageParam; -import io.geekidea.springbootplus.system.service.SysDepartmentService; -import io.geekidea.springbootplus.system.vo.SysDepartmentQueryVo; -import io.geekidea.springbootplus.system.vo.SysDepartmentTreeVo; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.system.convert.SysDepartmentConvert; +import io.geekidea.boot.system.entity.SysDepartment; +import io.geekidea.boot.system.enums.StateEnum; +import io.geekidea.boot.system.mapper.SysDepartmentMapper; +import io.geekidea.boot.system.param.SysDepartmentPageParam; +import io.geekidea.boot.system.service.SysDepartmentService; +import io.geekidea.boot.system.vo.SysDepartmentQueryVo; +import io.geekidea.boot.system.vo.SysDepartmentTreeVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysPermissionServiceImpl.java b/system/src/main/java/io/geekidea/boot/system/service/impl/SysPermissionServiceImpl.java similarity index 88% rename from system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysPermissionServiceImpl.java rename to system/src/main/java/io/geekidea/boot/system/service/impl/SysPermissionServiceImpl.java index 0075562..3dbdf8e 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysPermissionServiceImpl.java +++ b/system/src/main/java/io/geekidea/boot/system/service/impl/SysPermissionServiceImpl.java @@ -14,27 +14,27 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service.impl; +package io.geekidea.boot.system.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.framework.common.exception.BusinessException; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.framework.core.pagination.PageInfo; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.system.convert.SysPermissionConvert; -import io.geekidea.springbootplus.system.entity.SysPermission; -import io.geekidea.springbootplus.system.enums.MenuLevelEnum; -import io.geekidea.springbootplus.system.enums.StateEnum; -import io.geekidea.springbootplus.system.mapper.SysPermissionMapper; -import io.geekidea.springbootplus.system.param.SysPermissionPageParam; -import io.geekidea.springbootplus.system.service.SysPermissionService; -import io.geekidea.springbootplus.system.service.SysRolePermissionService; -import io.geekidea.springbootplus.system.vo.SysPermissionQueryVo; -import io.geekidea.springbootplus.system.vo.SysPermissionTreeVo; +import io.geekidea.boot.framework.common.exception.BusinessException; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.system.convert.SysPermissionConvert; +import io.geekidea.boot.system.entity.SysPermission; +import io.geekidea.boot.system.enums.MenuLevelEnum; +import io.geekidea.boot.system.enums.StateEnum; +import io.geekidea.boot.system.mapper.SysPermissionMapper; +import io.geekidea.boot.system.param.SysPermissionPageParam; +import io.geekidea.boot.system.service.SysPermissionService; +import io.geekidea.boot.system.service.SysRolePermissionService; +import io.geekidea.boot.system.vo.SysPermissionQueryVo; +import io.geekidea.boot.system.vo.SysPermissionTreeVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysRolePermissionServiceImpl.java b/system/src/main/java/io/geekidea/boot/system/service/impl/SysRolePermissionServiceImpl.java similarity index 90% rename from system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysRolePermissionServiceImpl.java rename to system/src/main/java/io/geekidea/boot/system/service/impl/SysRolePermissionServiceImpl.java index d96b029..2d88fa4 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysRolePermissionServiceImpl.java +++ b/system/src/main/java/io/geekidea/boot/system/service/impl/SysRolePermissionServiceImpl.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service.impl; +package io.geekidea.boot.system.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.system.entity.SysRolePermission; -import io.geekidea.springbootplus.system.enums.StateEnum; -import io.geekidea.springbootplus.system.mapper.SysRoleMapper; -import io.geekidea.springbootplus.system.mapper.SysRolePermissionMapper; -import io.geekidea.springbootplus.system.service.SysRolePermissionService; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.system.entity.SysRolePermission; +import io.geekidea.boot.system.enums.StateEnum; +import io.geekidea.boot.system.mapper.SysRoleMapper; +import io.geekidea.boot.system.mapper.SysRolePermissionMapper; +import io.geekidea.boot.system.service.SysRolePermissionService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.SetUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysRoleServiceImpl.java b/system/src/main/java/io/geekidea/boot/system/service/impl/SysRoleServiceImpl.java similarity index 87% rename from system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysRoleServiceImpl.java rename to system/src/main/java/io/geekidea/boot/system/service/impl/SysRoleServiceImpl.java index 5406c91..7321bd6 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysRoleServiceImpl.java +++ b/system/src/main/java/io/geekidea/boot/system/service/impl/SysRoleServiceImpl.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service.impl; +package io.geekidea.boot.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -22,23 +22,23 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.framework.common.exception.BusinessException; -import io.geekidea.springbootplus.framework.common.exception.DaoException; -import io.geekidea.springbootplus.framework.common.exception.SpringBootPlusException; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.framework.core.pagination.PageInfo; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.system.entity.SysRole; -import io.geekidea.springbootplus.system.entity.SysRolePermission; -import io.geekidea.springbootplus.system.enums.StateEnum; -import io.geekidea.springbootplus.system.mapper.SysRoleMapper; -import io.geekidea.springbootplus.system.param.sysrole.SysRolePageParam; -import io.geekidea.springbootplus.system.param.sysrole.UpdateSysRolePermissionParam; -import io.geekidea.springbootplus.system.service.SysPermissionService; -import io.geekidea.springbootplus.system.service.SysRolePermissionService; -import io.geekidea.springbootplus.system.service.SysRoleService; -import io.geekidea.springbootplus.system.service.SysUserService; -import io.geekidea.springbootplus.system.vo.SysRoleQueryVo; +import io.geekidea.boot.framework.common.exception.BusinessException; +import io.geekidea.boot.framework.common.exception.DaoException; +import io.geekidea.boot.framework.common.exception.SpringBootPlusException; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.system.entity.SysRole; +import io.geekidea.boot.system.entity.SysRolePermission; +import io.geekidea.boot.system.enums.StateEnum; +import io.geekidea.boot.system.mapper.SysRoleMapper; +import io.geekidea.boot.system.param.sysrole.SysRolePageParam; +import io.geekidea.boot.system.param.sysrole.UpdateSysRolePermissionParam; +import io.geekidea.boot.system.service.SysPermissionService; +import io.geekidea.boot.system.service.SysRolePermissionService; +import io.geekidea.boot.system.service.SysRoleService; +import io.geekidea.boot.system.service.SysUserService; +import io.geekidea.boot.system.vo.SysRoleQueryVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.SetUtils; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysUserServiceImpl.java b/system/src/main/java/io/geekidea/boot/system/service/impl/SysUserServiceImpl.java similarity index 87% rename from system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysUserServiceImpl.java rename to system/src/main/java/io/geekidea/boot/system/service/impl/SysUserServiceImpl.java index de36669..36c1550 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysUserServiceImpl.java +++ b/system/src/main/java/io/geekidea/boot/system/service/impl/SysUserServiceImpl.java @@ -14,30 +14,30 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.service.impl; +package io.geekidea.boot.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.springbootplus.config.properties.SpringBootPlusProperties; -import io.geekidea.springbootplus.framework.common.exception.BusinessException; -import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.springbootplus.framework.core.pagination.PageInfo; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.shiro.util.SaltUtil; -import io.geekidea.springbootplus.framework.util.PasswordUtil; -import io.geekidea.springbootplus.framework.util.PhoneUtil; -import io.geekidea.springbootplus.system.entity.SysUser; -import io.geekidea.springbootplus.system.enums.StateEnum; -import io.geekidea.springbootplus.system.mapper.SysUserMapper; -import io.geekidea.springbootplus.system.param.sysuser.ResetPasswordParam; -import io.geekidea.springbootplus.system.param.sysuser.SysUserPageParam; -import io.geekidea.springbootplus.system.param.sysuser.UpdatePasswordParam; -import io.geekidea.springbootplus.system.service.SysDepartmentService; -import io.geekidea.springbootplus.system.service.SysRoleService; -import io.geekidea.springbootplus.system.service.SysUserService; -import io.geekidea.springbootplus.system.vo.SysUserQueryVo; +import io.geekidea.boot.config.properties.SpringBootPlusProperties; +import io.geekidea.boot.framework.common.exception.BusinessException; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.shiro.util.SaltUtil; +import io.geekidea.boot.framework.util.PasswordUtil; +import io.geekidea.boot.framework.util.PhoneUtil; +import io.geekidea.boot.system.entity.SysUser; +import io.geekidea.boot.system.enums.StateEnum; +import io.geekidea.boot.system.mapper.SysUserMapper; +import io.geekidea.boot.system.param.sysuser.ResetPasswordParam; +import io.geekidea.boot.system.param.sysuser.SysUserPageParam; +import io.geekidea.boot.system.param.sysuser.UpdatePasswordParam; +import io.geekidea.boot.system.service.SysDepartmentService; +import io.geekidea.boot.system.service.SysRoleService; +import io.geekidea.boot.system.service.SysUserService; +import io.geekidea.boot.system.vo.SysUserQueryVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/vo/LoginSysUserTokenVo.java b/system/src/main/java/io/geekidea/boot/system/vo/LoginSysUserTokenVo.java similarity index 86% rename from system/src/main/java/io/geekidea/springbootplus/system/vo/LoginSysUserTokenVo.java rename to system/src/main/java/io/geekidea/boot/system/vo/LoginSysUserTokenVo.java index 5a454fa..94f51a7 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/vo/LoginSysUserTokenVo.java +++ b/system/src/main/java/io/geekidea/boot/system/vo/LoginSysUserTokenVo.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.vo; +package io.geekidea.boot.system.vo; -import io.geekidea.springbootplus.framework.shiro.service.LoginToken; -import io.geekidea.springbootplus.framework.shiro.vo.LoginSysUserVo; +import io.geekidea.boot.framework.shiro.service.LoginToken; +import io.geekidea.boot.framework.shiro.vo.LoginSysUserVo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysDepartmentQueryVo.java b/system/src/main/java/io/geekidea/boot/system/vo/SysDepartmentQueryVo.java similarity index 97% rename from system/src/main/java/io/geekidea/springbootplus/system/vo/SysDepartmentQueryVo.java rename to system/src/main/java/io/geekidea/boot/system/vo/SysDepartmentQueryVo.java index b43a175..d23e60a 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysDepartmentQueryVo.java +++ b/system/src/main/java/io/geekidea/boot/system/vo/SysDepartmentQueryVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.vo; +package io.geekidea.boot.system.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysDepartmentTreeVo.java b/system/src/main/java/io/geekidea/boot/system/vo/SysDepartmentTreeVo.java similarity index 97% rename from system/src/main/java/io/geekidea/springbootplus/system/vo/SysDepartmentTreeVo.java rename to system/src/main/java/io/geekidea/boot/system/vo/SysDepartmentTreeVo.java index 58e4c2f..2e962e9 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysDepartmentTreeVo.java +++ b/system/src/main/java/io/geekidea/boot/system/vo/SysDepartmentTreeVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.vo; +package io.geekidea.boot.system.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysPermissionQueryVo.java b/system/src/main/java/io/geekidea/boot/system/vo/SysPermissionQueryVo.java similarity index 97% rename from system/src/main/java/io/geekidea/springbootplus/system/vo/SysPermissionQueryVo.java rename to system/src/main/java/io/geekidea/boot/system/vo/SysPermissionQueryVo.java index bdf4601..483ddc2 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysPermissionQueryVo.java +++ b/system/src/main/java/io/geekidea/boot/system/vo/SysPermissionQueryVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.vo; +package io.geekidea.boot.system.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysPermissionTreeVo.java b/system/src/main/java/io/geekidea/boot/system/vo/SysPermissionTreeVo.java similarity index 97% rename from system/src/main/java/io/geekidea/springbootplus/system/vo/SysPermissionTreeVo.java rename to system/src/main/java/io/geekidea/boot/system/vo/SysPermissionTreeVo.java index e31395c..4bf122e 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysPermissionTreeVo.java +++ b/system/src/main/java/io/geekidea/boot/system/vo/SysPermissionTreeVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.vo; +package io.geekidea.boot.system.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysRolePermissionQueryVo.java b/system/src/main/java/io/geekidea/boot/system/vo/SysRolePermissionQueryVo.java similarity index 97% rename from system/src/main/java/io/geekidea/springbootplus/system/vo/SysRolePermissionQueryVo.java rename to system/src/main/java/io/geekidea/boot/system/vo/SysRolePermissionQueryVo.java index 1a7feb9..abb1e9b 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysRolePermissionQueryVo.java +++ b/system/src/main/java/io/geekidea/boot/system/vo/SysRolePermissionQueryVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.vo; +package io.geekidea.boot.system.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysRoleQueryVo.java b/system/src/main/java/io/geekidea/boot/system/vo/SysRoleQueryVo.java similarity index 97% rename from system/src/main/java/io/geekidea/springbootplus/system/vo/SysRoleQueryVo.java rename to system/src/main/java/io/geekidea/boot/system/vo/SysRoleQueryVo.java index 6b56cc5..9955ed9 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysRoleQueryVo.java +++ b/system/src/main/java/io/geekidea/boot/system/vo/SysRoleQueryVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.vo; +package io.geekidea.boot.system.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysUserQueryVo.java b/system/src/main/java/io/geekidea/boot/system/vo/SysUserQueryVo.java similarity index 98% rename from system/src/main/java/io/geekidea/springbootplus/system/vo/SysUserQueryVo.java rename to system/src/main/java/io/geekidea/boot/system/vo/SysUserQueryVo.java index 61d12bc..2d7bdda 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/vo/SysUserQueryVo.java +++ b/system/src/main/java/io/geekidea/boot/system/vo/SysUserQueryVo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.geekidea.springbootplus.system.vo; +package io.geekidea.boot.system.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/system/src/main/resources/mapper/system/SysDepartmentMapper.xml b/system/src/main/resources/mapper/system/SysDepartmentMapper.xml index 538436d..322db42 100644 --- a/system/src/main/resources/mapper/system/SysDepartmentMapper.xml +++ b/system/src/main/resources/mapper/system/SysDepartmentMapper.xml @@ -16,20 +16,20 @@ --> - + id, name, parent_id, state, sort, remark, version, create_time, update_time - select from sys_department where id = #{id} - select from sys_department diff --git a/system/src/main/resources/mapper/system/SysPermissionMapper.xml b/system/src/main/resources/mapper/system/SysPermissionMapper.xml index f60b935..3c6fa19 100644 --- a/system/src/main/resources/mapper/system/SysPermissionMapper.xml +++ b/system/src/main/resources/mapper/system/SysPermissionMapper.xml @@ -16,20 +16,20 @@ --> - + id, name, parent_id, url, code, icon, type, level, state, sort, remark, version, create_time, update_time - select from sys_permission where id = #{id} - select from sys_permission @@ -52,7 +52,7 @@ and u.id = #{userId}; - select p.* from sys_user u inner join sys_role r diff --git a/system/src/main/resources/mapper/system/SysRoleMapper.xml b/system/src/main/resources/mapper/system/SysRoleMapper.xml index ea23291..884ce97 100644 --- a/system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -16,14 +16,14 @@ --> - + id, name, code, type, state, remark, version, create_time, update_time - select from sys_role where id = #{id} diff --git a/system/src/main/resources/mapper/system/SysRolePermissionMapper.xml b/system/src/main/resources/mapper/system/SysRolePermissionMapper.xml index 7d802dc..28fb847 100644 --- a/system/src/main/resources/mapper/system/SysRolePermissionMapper.xml +++ b/system/src/main/resources/mapper/system/SysRolePermissionMapper.xml @@ -16,21 +16,21 @@ --> - + id, role_id, permission_id, state, remark, version, create_time, update_time - select from sys_role_permission where id = #{id} + - and u.department_id = #{param.departmentId} -- Gitee From 19580d7abe32bd6e337d4f6674cdf258dac0aef1 Mon Sep 17 00:00:00 2001 From: limingguang Date: Sat, 30 Jan 2021 17:00:26 +0800 Subject: [PATCH 02/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=95=E5=8D=B7?= =?UTF-8?q?=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/service/impl/SysPermissionServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysPermissionServiceImpl.java b/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysPermissionServiceImpl.java index 0075562..18274d7 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysPermissionServiceImpl.java +++ b/system/src/main/java/io/geekidea/springbootplus/system/service/impl/SysPermissionServiceImpl.java @@ -17,6 +17,7 @@ package io.geekidea.springbootplus.system.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; @@ -117,7 +118,9 @@ public class SysPermissionServiceImpl extends BaseServiceImpl getAllMenuList() throws Exception { SysPermission sysPermission = new SysPermission().setState(StateEnum.ENABLE.getCode()); // 获取所有已启用的权限列表 - return sysPermissionMapper.selectList(new QueryWrapper(sysPermission)); +// QueryWrapper queryWrapper = new QueryWrapper(sysPermission); +// queryWrapper.orderByAsc("sort"); + return sysPermissionMapper.selectList(new LambdaQueryWrapper(sysPermission).orderByAsc(SysPermission::getSort)); } @Override -- Gitee From 4c9cc97e5c81014a913ce895828aa121288e5a2f Mon Sep 17 00:00:00 2001 From: limingguang Date: Sat, 30 Jan 2021 17:01:14 +0800 Subject: [PATCH 03/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=95=E5=8D=B7?= =?UTF-8?q?=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../geekidea/springbootplus/SpringBootPlusApplication.java | 2 ++ config/src/main/resources/config/application-dev.yml | 2 +- config/src/main/resources/config/application.yml | 3 ++- .../com/example/foobar/controller/FooBarController.java | 5 +++++ example/src/main/java/com/example/foobar/entity/FooBar.java | 3 ++- .../main/java/com/example/foobar/mapper/FooBarMapper.java | 2 +- example/src/main/resources/mapper/foobar/FooBarMapper.xml | 3 +++ .../springbootplus/generator/SpringBootPlusGenerator.java | 6 +++--- 8 files changed, 19 insertions(+), 7 deletions(-) diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/SpringBootPlusApplication.java b/bootstrap/src/main/java/io/geekidea/springbootplus/SpringBootPlusApplication.java index 82dda08..bf79cbe 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/SpringBootPlusApplication.java +++ b/bootstrap/src/main/java/io/geekidea/springbootplus/SpringBootPlusApplication.java @@ -22,6 +22,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @@ -35,6 +36,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; */ @EnableAsync @EnableScheduling +@EnableCaching // 开启基于注解的缓存 @EnableTransactionManagement @EnableConfigurationProperties @ServletComponentScan diff --git a/config/src/main/resources/config/application-dev.yml b/config/src/main/resources/config/application-dev.yml index eb3e3dc..e79889c 100644 --- a/config/src/main/resources/config/application-dev.yml +++ b/config/src/main/resources/config/application-dev.yml @@ -9,7 +9,7 @@ spring-boot-plus: spring: datasource: - url: jdbc:mysql://localhost:3306/spring_boot_plus?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true + url: jdbc:mysql://localhost:3306/spring_boot_pmp?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true username: root password: root diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index 831a00d..d14c43c 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -40,7 +40,8 @@ spring: --- spring: profiles: - active: @profileActive@ + active: dev +# active: @profileActive@ # logback.xml中有详细的日志配置 logging: diff --git a/example/src/main/java/com/example/foobar/controller/FooBarController.java b/example/src/main/java/com/example/foobar/controller/FooBarController.java index a5e98a8..65894e8 100644 --- a/example/src/main/java/com/example/foobar/controller/FooBarController.java +++ b/example/src/main/java/com/example/foobar/controller/FooBarController.java @@ -16,6 +16,7 @@ package com.example.foobar.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.example.foobar.entity.FooBar; import com.example.foobar.param.FooBarPageParam; import com.example.foobar.service.FooBarService; @@ -31,9 +32,12 @@ 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.cache.annotation.Cacheable; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * FooBar 控制器 * @@ -58,6 +62,7 @@ public class FooBarController extends BaseController { @ApiOperation(value = "添加FooBar", response = ApiResult.class) public ApiResult addFooBar(@Validated(Add.class) @RequestBody FooBar fooBar) throws Exception { boolean flag = fooBarService.saveFooBar(fooBar); + List fooBarList = new FooBar().selectList(new LambdaQueryWrapper().eq(FooBar::getBar, 1)); return ApiResult.result(flag); } diff --git a/example/src/main/java/com/example/foobar/entity/FooBar.java b/example/src/main/java/com/example/foobar/entity/FooBar.java index 42df4c6..c589f9e 100644 --- a/example/src/main/java/com/example/foobar/entity/FooBar.java +++ b/example/src/main/java/com/example/foobar/entity/FooBar.java @@ -19,6 +19,7 @@ package com.example.foobar.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.extension.activerecord.Model; import io.geekidea.springbootplus.framework.common.entity.BaseEntity; import io.geekidea.springbootplus.framework.core.validator.groups.Update; import io.swagger.annotations.ApiModel; @@ -41,7 +42,7 @@ import java.util.Date; @Accessors(chain = true) @EqualsAndHashCode(callSuper = true) @ApiModel(value = "FooBar对象") -public class FooBar extends BaseEntity { +public class FooBar extends Model { private static final long serialVersionUID = 1L; @NotNull(message = "id不能为空", groups = {Update.class}) diff --git a/example/src/main/java/com/example/foobar/mapper/FooBarMapper.java b/example/src/main/java/com/example/foobar/mapper/FooBarMapper.java index 9e26e2c..9c9fb0e 100644 --- a/example/src/main/java/com/example/foobar/mapper/FooBarMapper.java +++ b/example/src/main/java/com/example/foobar/mapper/FooBarMapper.java @@ -18,6 +18,7 @@ package com.example.foobar.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.foobar.entity.FooBar; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; /** @@ -29,5 +30,4 @@ import org.springframework.stereotype.Repository; @Repository public interface FooBarMapper extends BaseMapper { - } diff --git a/example/src/main/resources/mapper/foobar/FooBarMapper.xml b/example/src/main/resources/mapper/foobar/FooBarMapper.xml index 8fa137f..36330e6 100644 --- a/example/src/main/resources/mapper/foobar/FooBarMapper.xml +++ b/example/src/main/resources/mapper/foobar/FooBarMapper.xml @@ -18,4 +18,7 @@ + diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java index 85e6fad..c942087 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java +++ b/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java @@ -47,12 +47,12 @@ public class SpringBootPlusGenerator { generatorProperties .setMavenModuleName("example") .setParentPackage("com.example") - .setModuleName("foobar") + .setModuleName("category") .setAuthor("geekidea") .setFileOverride(true); // 设置表信息 - generatorProperties.addTable("foo_bar","id"); + generatorProperties.addTable("p_category","id"); // 设置表前缀 // generatorProperties.setTablePrefix(Arrays.asList("tb_")); @@ -62,7 +62,7 @@ public class SpringBootPlusGenerator { .setUsername("root") .setPassword("root") .setDriverName("com.mysql.jdbc.Driver") - .setUrl("jdbc:mysql://localhost:3306/spring_boot_plus?useUnicode=true&characterEncoding=UTF-8&useSSL=false"); + .setUrl("jdbc:mysql://localhost:3306/spring_boot_pmp?useUnicode=true&characterEncoding=UTF-8&useSSL=false"); // 生成配置 generatorProperties.getGeneratorConfig() -- Gitee From 43fc26620c6696a563855f3d8904c220bbab0690 Mon Sep 17 00:00:00 2001 From: limingguang Date: Sat, 30 Jan 2021 17:01:43 +0800 Subject: [PATCH 04/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=95=E5=8D=B7?= =?UTF-8?q?=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CategoryController.java | 108 ++++++++++++++++++ .../com/example/category/entity/Category.java | 66 +++++++++++ .../category/mapper/CategoryMapper.java | 24 ++++ .../category/param/CategoryPageParam.java | 23 ++++ .../category/service/CategoryService.java | 55 +++++++++ .../service/impl/CategoryServiceImpl.java | 59 ++++++++++ .../mapper/category/PCategoryMapper.xml | 5 + 7 files changed, 340 insertions(+) create mode 100644 example/src/main/java/com/example/category/controller/CategoryController.java create mode 100644 example/src/main/java/com/example/category/entity/Category.java create mode 100644 example/src/main/java/com/example/category/mapper/CategoryMapper.java create mode 100644 example/src/main/java/com/example/category/param/CategoryPageParam.java create mode 100644 example/src/main/java/com/example/category/service/CategoryService.java create mode 100644 example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java create mode 100644 example/src/main/resources/mapper/category/PCategoryMapper.xml diff --git a/example/src/main/java/com/example/category/controller/CategoryController.java b/example/src/main/java/com/example/category/controller/CategoryController.java new file mode 100644 index 0000000..2cb0f6d --- /dev/null +++ b/example/src/main/java/com/example/category/controller/CategoryController.java @@ -0,0 +1,108 @@ +package com.example.category.controller; + +import com.example.category.entity.Category; +import com.example.category.service.CategoryService; +import lombok.extern.slf4j.Slf4j; +import com.example.category.param.CategoryPageParam; +import io.geekidea.springbootplus.framework.common.controller.BaseController; +import io.geekidea.springbootplus.framework.common.api.ApiResult; +import io.geekidea.springbootplus.framework.core.pagination.Paging; +import io.geekidea.springbootplus.framework.log.annotation.Module; +import io.geekidea.springbootplus.framework.log.annotation.OperationLog; +import io.geekidea.springbootplus.framework.log.enums.OperationLogType; +import io.geekidea.springbootplus.framework.core.validator.groups.Add; +import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 题目分类 控制器 + * + * @author geekidea + * @since 2021-01-26 + */ +@Slf4j +@RestController +@RequestMapping("/category") +@Module("category") +@Api(value = "题目分类API", tags = {"题目分类"}) +public class CategoryController extends BaseController { + + @Autowired + private CategoryService categoryService; + + /** + * 添加题目分类 + */ + @PostMapping("/submit") + @OperationLog(name = "添加题目分类", type = OperationLogType.ADD) + @ApiOperation(value = "添加题目分类", response = ApiResult.class) + @CacheEvict(cacheNames = "category", allEntries = true) + public ApiResult addPCategory(@Validated(Add.class) @RequestBody Category category) throws Exception { + boolean flag = category.insertOrUpdate(); + return ApiResult.result(flag); + } + + /** + * 修改题目分类 + */ + @PostMapping("/update") + @OperationLog(name = "修改题目分类", type = OperationLogType.UPDATE) + @ApiOperation(value = "修改题目分类", response = ApiResult.class) + public ApiResult updatePCategory(@Validated(Update.class) @RequestBody Category pCategory) throws Exception { + boolean flag = categoryService.updatePCategory(pCategory); + return ApiResult.result(flag); + } + + /** + * 删除题目分类 + */ + @PostMapping("/delete") + @OperationLog(name = "删除题目分类", type = OperationLogType.DELETE) + @ApiOperation(value = "删除题目分类", response = ApiResult.class) + @CacheEvict(cacheNames = "category", allEntries = true) + public ApiResult deletePCategory(@RequestBody List ids) throws Exception { + boolean flag = categoryService.deletePCategory(ids); + return ApiResult.result(flag); + } + + /** + * 获取题目分类详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "题目分类详情", type = OperationLogType.INFO) + @ApiOperation(value = "题目分类详情", response = Category.class) + public ApiResult getPCategory(@PathVariable("id") Long id) throws Exception { + Category pCategory = categoryService.getById(id); + return ApiResult.ok(pCategory); + } + + /** + * 题目分类分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "题目分类分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "题目分类分页列表", response = Category.class) + @Cacheable(cacheNames = "category", key = "#categoryPageParam.getPageIndex()+'::'+#categoryPageParam.getPageSize()") + public ApiResult> getPCategoryPageList(@Validated @RequestBody CategoryPageParam categoryPageParam) throws Exception { + Paging paging = categoryService.getCategoryPageList(categoryPageParam); + return ApiResult.ok(paging); + } + + @GetMapping("/getAllList") + @OperationLog(name = "题目分类列表", type = OperationLogType.LIST) + @ApiOperation(value = "题目分类列表", response = Category.class) + @Cacheable(cacheNames = "category", key = "#root.method.name") + public ApiResult> getAllCategoryList() throws Exception { + return ApiResult.ok(categoryService.list()); + } + +} + diff --git a/example/src/main/java/com/example/category/entity/Category.java b/example/src/main/java/com/example/category/entity/Category.java new file mode 100644 index 0000000..0d2ecf1 --- /dev/null +++ b/example/src/main/java/com/example/category/entity/Category.java @@ -0,0 +1,66 @@ +package com.example.category.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.geekidea.springbootplus.framework.common.entity.BaseEntity; + +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import io.geekidea.springbootplus.framework.core.validator.groups.Update; + +/** + * 题目分类 + * + * @author geekidea + * @since 2021-01-26 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName(value = "p_category") +@ApiModel(value = "Category对象") +public class Category extends Model { + private static final long serialVersionUID = 1L; + + @NotNull(message = "id不能为空", groups = {Update.class}) + @ApiModelProperty("编号") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("标题") + @TableField("SUBJECT") + private String subject; + + @ApiModelProperty("描述") + @TableField("REMARK") + private String remark; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + @Version + private Integer revision; + + @ApiModelProperty("创建人") + @TableField("CREATED_BY") + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField("CREATED_TIME") + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField("UPDATED_BY") + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField("UPDATED_TIME") + private Date updatedTime; + +} diff --git a/example/src/main/java/com/example/category/mapper/CategoryMapper.java b/example/src/main/java/com/example/category/mapper/CategoryMapper.java new file mode 100644 index 0000000..e016b35 --- /dev/null +++ b/example/src/main/java/com/example/category/mapper/CategoryMapper.java @@ -0,0 +1,24 @@ +package com.example.category.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.category.entity.Category; +import com.example.category.param.CategoryPageParam; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import java.io.Serializable; + +/** + * 题目分类 Mapper 接口 + * + * @author geekidea + * @since 2021-01-26 + */ +@Repository +public interface CategoryMapper extends BaseMapper { + + +} diff --git a/example/src/main/java/com/example/category/param/CategoryPageParam.java b/example/src/main/java/com/example/category/param/CategoryPageParam.java new file mode 100644 index 0000000..675add0 --- /dev/null +++ b/example/src/main/java/com/example/category/param/CategoryPageParam.java @@ -0,0 +1,23 @@ +package com.example.category.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; + +/** + *

+ * 题目分类 分页参数对象
+ * 
+ * + * @author geekidea + * @date 2021-01-26 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "题目分类分页参数") +public class CategoryPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/category/service/CategoryService.java b/example/src/main/java/com/example/category/service/CategoryService.java new file mode 100644 index 0000000..1c784c1 --- /dev/null +++ b/example/src/main/java/com/example/category/service/CategoryService.java @@ -0,0 +1,55 @@ +package com.example.category.service; + +import com.example.category.entity.Category; +import com.example.category.param.CategoryPageParam; +import io.geekidea.springbootplus.framework.common.service.BaseService; +import io.geekidea.springbootplus.framework.core.pagination.Paging; + +import java.util.List; + +/** + * 题目分类 服务类 + * + * @author geekidea + * @since 2021-01-26 + */ +public interface CategoryService extends BaseService { + + /** + * 保存 + * + * @param pCategory + * @return + * @throws Exception + */ + boolean savePCategory(Category pCategory) throws Exception; + + /** + * 修改 + * + * @param pCategory + * @return + * @throws Exception + */ + boolean updatePCategory(Category pCategory) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deletePCategory(List id) throws Exception; + + + /** + * 获取分页对象 + * + * @param categoryPageParam + * @return + * @throws Exception + */ + Paging getCategoryPageList(CategoryPageParam categoryPageParam) throws Exception; + +} diff --git a/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java b/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..1ff623d --- /dev/null +++ b/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java @@ -0,0 +1,59 @@ +package com.example.category.service.impl; + +import com.example.category.entity.Category; +import com.example.category.mapper.CategoryMapper; +import com.example.category.service.CategoryService; +import com.example.category.param.CategoryPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.springbootplus.framework.core.pagination.Paging; +import io.geekidea.springbootplus.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * 题目分类 服务实现类 + * + * @author geekidea + * @since 2021-01-26 + */ +@Slf4j +@Service +public class CategoryServiceImpl extends BaseServiceImpl implements CategoryService { + + @Autowired + private CategoryMapper categoryMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean savePCategory(Category pCategory) throws Exception { + return super.save(pCategory); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updatePCategory(Category pCategory) throws Exception { + return super.updateById(pCategory); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deletePCategory(List ids) throws Exception { + return super.removeByIds(ids); + } + + @Override + public Paging getCategoryPageList(CategoryPageParam getCategoryPageList) throws Exception { + Page page = new PageInfo<>(getCategoryPageList, OrderItem.desc(getLambdaColumn(Category::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = categoryMapper.selectPage(page, wrapper); + return new Paging(iPage); + } +} diff --git a/example/src/main/resources/mapper/category/PCategoryMapper.xml b/example/src/main/resources/mapper/category/PCategoryMapper.xml new file mode 100644 index 0000000..91c73bc --- /dev/null +++ b/example/src/main/resources/mapper/category/PCategoryMapper.xml @@ -0,0 +1,5 @@ + + + + + -- Gitee From af44a4440858b66df193af06a522c903d5f45048 Mon Sep 17 00:00:00 2001 From: limingguang Date: Fri, 5 Feb 2021 08:43:01 +0800 Subject: [PATCH 05/36] commit paper --- .../springbootplus/config/QiniuConfig.java | 73 ++++++++++++ .../config/SpringBootPlusWebMvcConfig.java | 25 ++++ .../config/properties/QiniuProperties.java | 17 +++ .../main/resources/config/application-dev.yml | 14 ++- .../controller/CategoryController.java | 2 +- .../com/example/category/entity/Category.java | 6 +- .../interceptor/UpdateUserInterceptor.java | 44 +++++++ .../paper/controller/PaperController.java | 110 ++++++++++++++++++ .../java/com/example/paper/entity/Paper.java | 82 +++++++++++++ .../com/example/paper/mapper/PaperMapper.java | 32 +++++ .../example/paper/param/PaperPageParam.java | 30 +++++ .../example/paper/service/PaperService.java | 54 +++++++++ .../paper/service/impl/PaperServiceImpl.java | 60 ++++++++++ .../com/example/paper/vo/PaperQueryVo.java | 49 ++++++++ .../controller/QuestionController.java | 103 ++++++++++++++++ .../com/example/question/entity/Question.java | 105 +++++++++++++++++ .../question/mapper/QuestionMapper.java | 24 ++++ .../question/param/QuestionPageParam.java | 23 ++++ .../question/service/QuestionService.java | 55 +++++++++ .../service/impl/QuestionServiceImpl.java | 63 ++++++++++ .../resources/mapper/paper/PaperMapper.xml | 20 ++++ .../mapper/question/QuestionMapper.xml | 5 + framework/pom.xml | 8 ++ .../generator/SpringBootPlusGenerator.java | 8 +- pom.xml | 1 + .../system/controller/UploadController.java | 49 +++++--- .../system/service/UploadService.java | 28 +++++ .../service/impl/UploadServiceImpl.java | 78 +++++++++++++ 28 files changed, 1146 insertions(+), 22 deletions(-) create mode 100644 bootstrap/src/main/java/io/geekidea/springbootplus/config/QiniuConfig.java create mode 100644 config/src/main/java/io/geekidea/springbootplus/config/properties/QiniuProperties.java create mode 100644 example/src/main/java/com/example/interceptor/UpdateUserInterceptor.java create mode 100644 example/src/main/java/com/example/paper/controller/PaperController.java create mode 100644 example/src/main/java/com/example/paper/entity/Paper.java create mode 100644 example/src/main/java/com/example/paper/mapper/PaperMapper.java create mode 100644 example/src/main/java/com/example/paper/param/PaperPageParam.java create mode 100644 example/src/main/java/com/example/paper/service/PaperService.java create mode 100644 example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java create mode 100644 example/src/main/java/com/example/paper/vo/PaperQueryVo.java create mode 100644 example/src/main/java/com/example/question/controller/QuestionController.java create mode 100644 example/src/main/java/com/example/question/entity/Question.java create mode 100644 example/src/main/java/com/example/question/mapper/QuestionMapper.java create mode 100644 example/src/main/java/com/example/question/param/QuestionPageParam.java create mode 100644 example/src/main/java/com/example/question/service/QuestionService.java create mode 100644 example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java create mode 100644 example/src/main/resources/mapper/paper/PaperMapper.xml create mode 100644 example/src/main/resources/mapper/question/QuestionMapper.xml create mode 100644 system/src/main/java/io/geekidea/springbootplus/system/service/UploadService.java create mode 100644 system/src/main/java/io/geekidea/springbootplus/system/service/impl/UploadServiceImpl.java diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/QiniuConfig.java b/bootstrap/src/main/java/io/geekidea/springbootplus/config/QiniuConfig.java new file mode 100644 index 0000000..7f19e50 --- /dev/null +++ b/bootstrap/src/main/java/io/geekidea/springbootplus/config/QiniuConfig.java @@ -0,0 +1,73 @@ +package io.geekidea.springbootplus.config; + +import com.qiniu.common.Zone; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.Region; +import com.qiniu.storage.UploadManager; +import com.qiniu.util.Auth; +import io.geekidea.springbootplus.framework.common.exception.BusinessException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QiniuConfig { + @Value("${qiniu.accessKey}") + private String accessKey; + + @Value("${qiniu.secretKey}") + private String secretKey; + + @Value("${qiniu.zone}") + private String zone; + + /** + * 配置空间的存储区域 + */ + @Bean + public com.qiniu.storage.Configuration qiNiuConfig() { + switch (zone) { + case "huadong": + return new com.qiniu.storage.Configuration(Region.region0()); + case "huabei": + return new com.qiniu.storage.Configuration(Region.region1()); + case "huanan": + return new com.qiniu.storage.Configuration(Region.region2()); + case "beimei": + return new com.qiniu.storage.Configuration(Region.regionNa0()); + case "dongnanya": + return new com.qiniu.storage.Configuration(Region.regionAs0()); + default: + throw new BusinessException("存储区域配置错误"); + } + } + + /** + * 构建一个七牛上传工具实例 + */ + @Bean + public UploadManager uploadManager() { + return new UploadManager(qiNiuConfig()); + } + + /** + * 认证信息实例 + */ + @Bean + public Auth auth() { + return Auth.create(accessKey, secretKey); + } + + /** + * 构建七牛空间管理实例 + */ + @Bean + public BucketManager bucketManager() { + return new BucketManager(auth(), qiNiuConfig()); + } + +// @Bean +// public Gson gson() { +// return new Gson(); +// } +} diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusWebMvcConfig.java b/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusWebMvcConfig.java index 6749845..ccb4792 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusWebMvcConfig.java +++ b/bootstrap/src/main/java/io/geekidea/springbootplus/config/SpringBootPlusWebMvcConfig.java @@ -17,6 +17,7 @@ package io.geekidea.springbootplus.config; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import io.geekidea.springbootplus.config.properties.SpringBootPlusFilterProperties; import io.geekidea.springbootplus.config.properties.SpringBootPlusInterceptorProperties; import io.geekidea.springbootplus.config.properties.SpringBootPlusProperties; @@ -24,11 +25,13 @@ import io.geekidea.springbootplus.framework.core.filter.RequestDetailFilter; import io.geekidea.springbootplus.framework.core.interceptor.PermissionInterceptor; import io.geekidea.springbootplus.framework.core.xss.XssFilter; import io.geekidea.springbootplus.framework.util.IniUtil; +import io.geekidea.springbootplus.framework.util.LoginUtil; import io.geekidea.springbootplus.system.interceptor.DownloadInterceptor; import io.geekidea.springbootplus.system.interceptor.ResourceInterceptor; import io.geekidea.springbootplus.system.interceptor.UploadInterceptor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.reflection.MetaObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; @@ -38,6 +41,7 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.PostConstruct; +import java.util.Date; import java.util.Map; /** @@ -141,6 +145,27 @@ public class SpringBootPlusWebMvcConfig implements WebMvcConfigurer { return new DownloadInterceptor(); } + /** + * 配置自动填充 + * @return + */ + @Bean + public MetaObjectHandler metaObjectHandler() { return new MetaObjectHandler() { + @Override + public void insertFill(MetaObject metaObject) { + // 数据类型要与fileName一致 + this.strictInsertFill(metaObject, "createdBy", String.class, LoginUtil.getUsername()); + this.strictInsertFill(metaObject, "createdTime", Date.class, new Date()); + } + + @Override + public void updateFill(MetaObject metaObject) { + this.strictUpdateFill(metaObject, "updatedTime", Date.class, new Date()); + this.strictUpdateFill(metaObject, "updatedBy", String.class, LoginUtil.getUsername()); + } + }; + } + @PostConstruct public void init() { diff --git a/config/src/main/java/io/geekidea/springbootplus/config/properties/QiniuProperties.java b/config/src/main/java/io/geekidea/springbootplus/config/properties/QiniuProperties.java new file mode 100644 index 0000000..d76e884 --- /dev/null +++ b/config/src/main/java/io/geekidea/springbootplus/config/properties/QiniuProperties.java @@ -0,0 +1,17 @@ +package io.geekidea.springbootplus.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@Data +@ConfigurationProperties(prefix = "qiniu") +public class QiniuProperties { + + private String accessKey; + + private String secretKey; + + private String bucket; + + private String prefix; +} diff --git a/config/src/main/resources/config/application-dev.yml b/config/src/main/resources/config/application-dev.yml index e79889c..6feb8f0 100644 --- a/config/src/main/resources/config/application-dev.yml +++ b/config/src/main/resources/config/application-dev.yml @@ -20,7 +20,19 @@ spring: password: port: 6379 + servlet: + multipart: + location: /Users/limingguang/upload_tmp + # 打印SQL语句和结果集,本地开发环境可开启,线上注释掉 mybatis-plus: configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +# 七牛云配置 +qiniu: + accessKey: VNddBCSpToUG5AHuQHpQSHX2X1v_CWDgbbTCk-Mw + secretKey: t7eYfFBBsyj7RNas5N2l_z8mzKvGgIsHf49EfCQk + bucket: pmp-sys + zone: huadong + domain: cdn.koronol.com \ No newline at end of file diff --git a/example/src/main/java/com/example/category/controller/CategoryController.java b/example/src/main/java/com/example/category/controller/CategoryController.java index 2cb0f6d..3226275 100644 --- a/example/src/main/java/com/example/category/controller/CategoryController.java +++ b/example/src/main/java/com/example/category/controller/CategoryController.java @@ -57,7 +57,7 @@ public class CategoryController extends BaseController { @OperationLog(name = "修改题目分类", type = OperationLogType.UPDATE) @ApiOperation(value = "修改题目分类", response = ApiResult.class) public ApiResult updatePCategory(@Validated(Update.class) @RequestBody Category pCategory) throws Exception { - boolean flag = categoryService.updatePCategory(pCategory); + boolean flag = categoryService.updateById(pCategory); return ApiResult.result(flag); } diff --git a/example/src/main/java/com/example/category/entity/Category.java b/example/src/main/java/com/example/category/entity/Category.java index 0d2ecf1..56601e2 100644 --- a/example/src/main/java/com/example/category/entity/Category.java +++ b/example/src/main/java/com/example/category/entity/Category.java @@ -48,7 +48,7 @@ public class Category extends Model { private Integer revision; @ApiModelProperty("创建人") - @TableField("CREATED_BY") + @TableField(value = "CREATED_BY", fill = FieldFill.INSERT) private String createdBy; @ApiModelProperty("创建时间") @@ -56,11 +56,11 @@ public class Category extends Model { private Date createdTime; @ApiModelProperty("更新人") - @TableField("UPDATED_BY") + @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE) private String updatedBy; @ApiModelProperty("更新时间") - @TableField("UPDATED_TIME") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) private Date updatedTime; } diff --git a/example/src/main/java/com/example/interceptor/UpdateUserInterceptor.java b/example/src/main/java/com/example/interceptor/UpdateUserInterceptor.java new file mode 100644 index 0000000..8d4134f --- /dev/null +++ b/example/src/main/java/com/example/interceptor/UpdateUserInterceptor.java @@ -0,0 +1,44 @@ +package com.example.interceptor; + +import com.example.category.entity.Category; +import io.geekidea.springbootplus.framework.util.LoginUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.plugin.Intercepts; +import org.apache.ibatis.plugin.Invocation; +import org.apache.ibatis.plugin.Signature; + +import java.lang.reflect.Field; + +@Slf4j +@Intercepts({@Signature( + type = Executor.class, + method = "update", + args = {MappedStatement.class, Object.class})}) +public class UpdateUserInterceptor implements Interceptor { + @Override + public Object intercept(Invocation invocation) throws Throwable { + + MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; + SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); + Object parameter = invocation.getArgs()[1]; + if (parameter instanceof Category) { + log.info("更新人"); + } + Field[] declaredFields = parameter.getClass().getDeclaredFields(); + for (Field field : declaredFields) { + log.info(field.getName()); + if ("updatedBy".equals(field.getName())) { + if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) { + field.setAccessible(true); + field.set(parameter, LoginUtil.getUserId()); + } + } + } + + return invocation.proceed(); + } +} diff --git a/example/src/main/java/com/example/paper/controller/PaperController.java b/example/src/main/java/com/example/paper/controller/PaperController.java new file mode 100644 index 0000000..88f1fb4 --- /dev/null +++ b/example/src/main/java/com/example/paper/controller/PaperController.java @@ -0,0 +1,110 @@ +package com.example.paper.controller; + +import com.example.paper.entity.Paper; +import com.example.paper.service.PaperService; +import com.example.paper.vo.PaperQueryVo; +import lombok.extern.slf4j.Slf4j; +import com.example.paper.param.PaperPageParam; +import io.geekidea.springbootplus.framework.common.controller.BaseController; +import io.geekidea.springbootplus.framework.common.api.ApiResult; +import io.geekidea.springbootplus.framework.core.pagination.Paging; +import io.geekidea.springbootplus.framework.common.param.IdParam; +import io.geekidea.springbootplus.framework.log.annotation.Module; +import io.geekidea.springbootplus.framework.log.annotation.OperationLog; +import io.geekidea.springbootplus.framework.log.enums.OperationLogType; +import io.geekidea.springbootplus.framework.core.validator.groups.Add; +import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import org.apache.shiro.SecurityUtils; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 试卷实体 控制器 + * + * @author limg + * @since 2021-01-31 + */ +@Slf4j +@RestController +@RequestMapping("/paper") +@Module("paper") +@Api(value = "试卷实体API", tags = {"试卷实体"}) +public class PaperController extends BaseController { + + @Autowired + private PaperService paperService; + + /** + * 添加试卷实体 + */ + @PostMapping("/submit") + @OperationLog(name = "添加试卷实体", type = OperationLogType.ADD) + @ApiOperation(value = "添加试卷实体", response = ApiResult.class) + @CacheEvict(cacheNames = "p_paper", allEntries = true) + public ApiResult addPaper(@Validated(Add.class) @RequestBody Paper paper) throws Exception { + boolean flag = paper.insertOrUpdate(); + return ApiResult.result(flag); + } + + /** + * 修改试卷实体 + */ + @PostMapping("/update") + @OperationLog(name = "修改试卷实体", type = OperationLogType.UPDATE) + @ApiOperation(value = "修改试卷实体", response = ApiResult.class) + @CacheEvict(cacheNames = "p_paper", allEntries = true) + public ApiResult updatePaper(@Validated(Update.class) @RequestBody Paper paper) throws Exception { + Paper paper1 = new Paper(); + paper1.setId(paper.getId()); + paper1.setIsOpen(paper.getIsOpen()); + boolean flag = paperService.updatePaper(paper1); + return ApiResult.result(flag); + } + + /** + * 删除试卷实体 + */ + @PostMapping("/delete/{id}") + @OperationLog(name = "删除试卷实体", type = OperationLogType.DELETE) + @ApiOperation(value = "删除试卷实体", response = ApiResult.class) + @CacheEvict(cacheNames = "p_paper", allEntries = true) + public ApiResult deletePaper(@PathVariable("id") Long id) throws Exception { + boolean flag = paperService.deletePaper(id); + return ApiResult.result(flag); + } + + /** + * 获取试卷实体详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "试卷实体详情", type = OperationLogType.INFO) + @ApiOperation(value = "试卷实体详情", response = Paper.class) + public ApiResult getPaper(@PathVariable("id") Long id) throws Exception { + Paper paper = paperService.getById(id); + return ApiResult.ok(paper); + } + + /** + * 试卷实体分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "试卷实体分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "试卷实体分页列表", response = Paper.class) + @Cacheable(cacheNames = "p_paper", key = "#paperPageParam.getPageIndex() " + + "+ '::' +#paperPageParam.getPageSize() " + + "+ ':' + #paperPageParam.getName() " + + "+ ':' + #paperPageParam.getCategoryId()") + public ApiResult> getPaperPageList(@Validated @RequestBody PaperPageParam paperPageParam) throws Exception { +// Paging paging = paperService.getPaperPageList(paperPageParam); + Paging paging = paperService.getPaperPageList(paperPageParam); + return ApiResult.ok(paging); + } + +} + diff --git a/example/src/main/java/com/example/paper/entity/Paper.java b/example/src/main/java/com/example/paper/entity/Paper.java new file mode 100644 index 0000000..85b5879 --- /dev/null +++ b/example/src/main/java/com/example/paper/entity/Paper.java @@ -0,0 +1,82 @@ +package com.example.paper.entity; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.geekidea.springbootplus.framework.common.entity.BaseEntity; + +import java.util.Date; + +import io.geekidea.springbootplus.framework.core.validator.groups.Add; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.*; + +import io.geekidea.springbootplus.framework.core.validator.groups.Update; + +/** + * 试卷实体 + * + * @author limg + * @since 2021-01-31 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("p_paper") +@ApiModel(value = "Paper对象") +public class Paper extends Model { + private static final long serialVersionUID = 1L; + + @NotNull(message = "编号不能为空", groups = {Update.class}) + @ApiModelProperty("编号") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("试卷名称") + @TableField("PAPER_NAME") + @NotNull(message = "试卷名称不能为空", groups = Add.class) + private String paperName; + + @ApiModelProperty("是否开放") + @TableField("IS_OPEN") + private String isOpen; + + @ApiModelProperty("价格") + @TableField("PRICE") + @NotNull(message = "请输入价格", groups = Add.class) + @Min(value = 0, message = "价格不能小于0") + @Max(value = 99999, message = "价格不能超过99999") + private BigDecimal price; + + @ApiModelProperty("所属分类") + @TableField("CATEGORY_ID") + private Integer categoryId; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + @Version + private Integer revision; + + @ApiModelProperty("创建人") + @TableField(value = "CREATED_BY", fill = FieldFill.INSERT) + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE) + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/example/src/main/java/com/example/paper/mapper/PaperMapper.java b/example/src/main/java/com/example/paper/mapper/PaperMapper.java new file mode 100644 index 0000000..a36fc9d --- /dev/null +++ b/example/src/main/java/com/example/paper/mapper/PaperMapper.java @@ -0,0 +1,32 @@ +package com.example.paper.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.paper.entity.Paper; +import com.example.paper.param.PaperPageParam; + +import com.example.paper.vo.PaperQueryVo; +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import java.io.Serializable; + +/** + * 试卷实体 Mapper 接口 + * + * @author limg + * @since 2021-01-31 + */ +@Repository +public interface PaperMapper extends BaseMapper { + + /** + * 获取分页对象 + * + * @param page + * @param paperPageParam + * @return + */ + IPage getPaperPageList(@Param("page") Page page, @Param("param") PaperPageParam paperPageParam); +} diff --git a/example/src/main/java/com/example/paper/param/PaperPageParam.java b/example/src/main/java/com/example/paper/param/PaperPageParam.java new file mode 100644 index 0000000..24ea357 --- /dev/null +++ b/example/src/main/java/com/example/paper/param/PaperPageParam.java @@ -0,0 +1,30 @@ +package com.example.paper.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; + +/** + *
+ * 试卷实体 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-01-31 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "试卷实体分页参数") +public class PaperPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("试卷名称") + private String name; + + @ApiModelProperty("试卷分类") + private String categoryId; +} diff --git a/example/src/main/java/com/example/paper/service/PaperService.java b/example/src/main/java/com/example/paper/service/PaperService.java new file mode 100644 index 0000000..84ba339 --- /dev/null +++ b/example/src/main/java/com/example/paper/service/PaperService.java @@ -0,0 +1,54 @@ +package com.example.paper.service; + +import com.example.paper.entity.Paper; +import com.example.paper.param.PaperPageParam; +import com.example.paper.vo.PaperQueryVo; +import io.geekidea.springbootplus.framework.common.service.BaseService; +import io.geekidea.springbootplus.framework.core.pagination.Paging; + +/** + * 试卷实体 服务类 + * + * @author limg + * @since 2021-01-31 + */ +public interface PaperService extends BaseService { + + /** + * 保存 + * + * @param paper + * @return + * @throws Exception + */ + boolean savePaper(Paper paper) throws Exception; + + /** + * 修改 + * + * @param paper + * @return + * @throws Exception + */ + boolean updatePaper(Paper paper) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deletePaper(Long id) throws Exception; + + + /** + * 获取分页对象 + * + * @param paperPageParam + * @return + * @throws Exception + */ + Paging getPaperPageList(PaperPageParam paperPageParam) throws Exception; + +} diff --git a/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java b/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java new file mode 100644 index 0000000..951889f --- /dev/null +++ b/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java @@ -0,0 +1,60 @@ +package com.example.paper.service.impl; + +import com.example.paper.entity.Paper; +import com.example.paper.mapper.PaperMapper; +import com.example.paper.service.PaperService; +import com.example.paper.param.PaperPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.paper.vo.PaperQueryVo; +import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.springbootplus.framework.core.pagination.Paging; +import io.geekidea.springbootplus.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 试卷实体 服务实现类 + * + * @author limg + * @since 2021-01-31 + */ +@Slf4j +@Service +public class PaperServiceImpl extends BaseServiceImpl implements PaperService { + + @Autowired + private PaperMapper paperMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean savePaper(Paper paper) throws Exception { + return super.save(paper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updatePaper(Paper paper) throws Exception { + return super.updateById(paper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deletePaper(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Paging getPaperPageList(PaperPageParam paperPageParam) throws Exception { + Page page = new PageInfo<>(paperPageParam, OrderItem.desc(getLambdaColumn(Paper::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// IPage iPage = paperMapper.selectPage(page, wrapper); + IPage iPage = paperMapper.getPaperPageList(page, paperPageParam); + return new Paging(iPage); + } + +} diff --git a/example/src/main/java/com/example/paper/vo/PaperQueryVo.java b/example/src/main/java/com/example/paper/vo/PaperQueryVo.java new file mode 100644 index 0000000..4a7295d --- /dev/null +++ b/example/src/main/java/com/example/paper/vo/PaperQueryVo.java @@ -0,0 +1,49 @@ +package com.example.paper.vo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Accessors(chain = true) +@ApiModel(value = "PaperQueryVo对象", description = "试卷查询对象") +public class PaperQueryVo implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("试卷名称") + private String name; + + @ApiModelProperty("是否开放") + private String isOpen; + + @ApiModelProperty("价格") + private BigDecimal price; + + @ApiModelProperty("所属分类") + private Integer categoryId; + + @ApiModelProperty("试题数量") + private Integer count; + + @ApiModelProperty("创建人") + private String createdBy; + + @ApiModelProperty("创建时间") + private Date createdTime; + + @ApiModelProperty("更新人") + private String updatedBy; + + @ApiModelProperty("更新时间") + private Date updatedTime; +} diff --git a/example/src/main/java/com/example/question/controller/QuestionController.java b/example/src/main/java/com/example/question/controller/QuestionController.java new file mode 100644 index 0000000..cb354c3 --- /dev/null +++ b/example/src/main/java/com/example/question/controller/QuestionController.java @@ -0,0 +1,103 @@ +package com.example.question.controller; + +import com.example.question.entity.Question; +import com.example.question.service.QuestionService; +import lombok.extern.slf4j.Slf4j; +import com.example.question.param.QuestionPageParam; +import io.geekidea.springbootplus.framework.common.controller.BaseController; +import io.geekidea.springbootplus.framework.common.api.ApiResult; +import io.geekidea.springbootplus.framework.core.pagination.Paging; +import io.geekidea.springbootplus.framework.common.param.IdParam; +import io.geekidea.springbootplus.framework.log.annotation.Module; +import io.geekidea.springbootplus.framework.log.annotation.OperationLog; +import io.geekidea.springbootplus.framework.log.enums.OperationLogType; +import io.geekidea.springbootplus.framework.core.validator.groups.Add; +import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 题目信息 控制器 + * + * @author limg + * @since 2021-02-03 + */ +@Slf4j +@RestController +@RequestMapping("/question") +@Module("question") +@Api(value = "题目信息API", tags = {"题目信息"}) +public class QuestionController extends BaseController { + + @Autowired + private QuestionService questionService; + + /** + * 添加题目信息 + */ + @PostMapping("/submit") + @OperationLog(name = "添加题目信息", type = OperationLogType.ADD) + @ApiOperation(value = "添加题目信息", response = ApiResult.class) + public ApiResult addQuestion(@Validated(Add.class) @RequestBody Question question) throws Exception { +// boolean flag = questionService.saveQuestion(question); + boolean flag = question.insertOrUpdate(); + return ApiResult.result(flag); + } + + /** + * 修改题目信息 + */ + @PostMapping("/update") + @OperationLog(name = "修改题目信息", type = OperationLogType.UPDATE) + @ApiOperation(value = "修改题目信息", response = ApiResult.class) + public ApiResult updateQuestion(@Validated(Update.class) @RequestBody Question question) throws Exception { + boolean flag = questionService.updateQuestion(question); + return ApiResult.result(flag); + } + + /** + * 删除题目信息 + */ + @PostMapping("/delete/{id}") + @OperationLog(name = "删除题目信息", type = OperationLogType.DELETE) + @ApiOperation(value = "删除题目信息", response = ApiResult.class) + public ApiResult deleteQuestion(@PathVariable("id") Long id) throws Exception { + boolean flag = questionService.deleteQuestion(id); + return ApiResult.result(flag); + } + + @GetMapping("/maxorder/{pid}") + @OperationLog(name = "查询最大单号", type = OperationLogType.OTHER_QUERY) + @ApiOperation(value = "查询最大单号", response = ApiResult.class) + public ApiResult getMaxOrder(@PathVariable("pid") Long pid) throws Exception { + Integer order = questionService.getCountByPid(pid); + return ApiResult.ok(order + 1); + } + + /** + * 获取题目信息详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "题目信息详情", type = OperationLogType.INFO) + @ApiOperation(value = "题目信息详情", response = Question.class) + public ApiResult getQuestion(@PathVariable("id") Long id) throws Exception { + Question question = questionService.getById(id); + return ApiResult.ok(question); + } + + /** + * 题目信息分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "题目信息分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "题目信息分页列表", response = Question.class) + public ApiResult> getQuestionPageList(@Validated @RequestBody QuestionPageParam questionPageParam) throws Exception { + Paging paging = questionService.getQuestionPageList(questionPageParam); + return ApiResult.ok(paging); + } + +} + diff --git a/example/src/main/java/com/example/question/entity/Question.java b/example/src/main/java/com/example/question/entity/Question.java new file mode 100644 index 0000000..890f874 --- /dev/null +++ b/example/src/main/java/com/example/question/entity/Question.java @@ -0,0 +1,105 @@ +package com.example.question.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.geekidea.springbootplus.framework.common.entity.BaseEntity; + +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import io.geekidea.springbootplus.framework.core.validator.groups.Update; + +/** + * 题目信息 + * + * @author limg + * @since 2021-02-03 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("p_question") +@ApiModel(value = "Question对象") +public class Question extends Model { + private static final long serialVersionUID = 1L; + + @NotNull(message = "id不能为空", groups = {Update.class}) + @ApiModelProperty("编号") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("题目编号") + @TableField("SERIAL") + @NotNull(message = "题目编号不能为空") + private Integer serial; + + @ApiModelProperty("标题") + @TableField("SUBJECT") + @NotNull(message = "标题不能为空") + private String subject; + + @ApiModelProperty("所属试卷") + @TableField("PAPER_ID") + @NotNull(message = "请选择所属试卷") + private Integer paperId; + + @ApiModelProperty("图片") + @TableField("IMG_URL") + private String imgUrl; + + @ApiModelProperty("选项A") + @TableField("OPTION_A") + private String optionA; + + @ApiModelProperty("选项B") + @TableField("OPTION_B") + private String optionB; + + @ApiModelProperty("选项C") + @TableField("OPTION_C") + private String optionC; + + @ApiModelProperty("选项D") + @TableField("OPTION_D") + private String optionD; + + @ApiModelProperty("正确答案") + @TableField("ANSWER") + @NotNull(message = "请选择正确答案") + private String answer; + + @ApiModelProperty("解析") + @TableField("ANSWER_DETAIL") + private String explain; + + @ApiModelProperty("所属过程组") + @TableField("GOURP_ID") + private String gourpId; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + private Integer revision; + + @ApiModelProperty("创建人") + @TableField(value = "CREATED_BY", fill = FieldFill.INSERT) + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE) + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/example/src/main/java/com/example/question/mapper/QuestionMapper.java b/example/src/main/java/com/example/question/mapper/QuestionMapper.java new file mode 100644 index 0000000..628bc07 --- /dev/null +++ b/example/src/main/java/com/example/question/mapper/QuestionMapper.java @@ -0,0 +1,24 @@ +package com.example.question.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.question.entity.Question; +import com.example.question.param.QuestionPageParam; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import java.io.Serializable; + +/** + * 题目信息 Mapper 接口 + * + * @author limg + * @since 2021-02-03 + */ +@Repository +public interface QuestionMapper extends BaseMapper { + + +} diff --git a/example/src/main/java/com/example/question/param/QuestionPageParam.java b/example/src/main/java/com/example/question/param/QuestionPageParam.java new file mode 100644 index 0000000..26ed94b --- /dev/null +++ b/example/src/main/java/com/example/question/param/QuestionPageParam.java @@ -0,0 +1,23 @@ +package com.example.question.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; + +/** + *
+ * 题目信息 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-03 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "题目信息分页参数") +public class QuestionPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/question/service/QuestionService.java b/example/src/main/java/com/example/question/service/QuestionService.java new file mode 100644 index 0000000..b58a9e8 --- /dev/null +++ b/example/src/main/java/com/example/question/service/QuestionService.java @@ -0,0 +1,55 @@ +package com.example.question.service; + +import com.example.question.entity.Question; +import com.example.question.param.QuestionPageParam; +import io.geekidea.springbootplus.framework.common.service.BaseService; +import io.geekidea.springbootplus.framework.core.pagination.Paging; + +/** + * 题目信息 服务类 + * + * @author limg + * @since 2021-02-03 + */ +public interface QuestionService extends BaseService { + + /** + * 保存 + * + * @param question + * @return + * @throws Exception + */ + boolean saveQuestion(Question question) throws Exception; + + /** + * 修改 + * + * @param question + * @return + * @throws Exception + */ + boolean updateQuestion(Question question) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteQuestion(Long id) throws Exception; + + Integer getCountByPid(Long pid) throws Exception; + + + /** + * 获取分页对象 + * + * @param questionQueryParam + * @return + * @throws Exception + */ + Paging getQuestionPageList(QuestionPageParam questionPageParam) throws Exception; + +} diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java new file mode 100644 index 0000000..75d5830 --- /dev/null +++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java @@ -0,0 +1,63 @@ +package com.example.question.service.impl; + +import com.example.question.entity.Question; +import com.example.question.mapper.QuestionMapper; +import com.example.question.service.QuestionService; +import com.example.question.param.QuestionPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.springbootplus.framework.core.pagination.Paging; +import io.geekidea.springbootplus.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 题目信息 服务实现类 + * + * @author limg + * @since 2021-02-03 + */ +@Slf4j +@Service +public class QuestionServiceImpl extends BaseServiceImpl implements QuestionService { + + @Autowired + private QuestionMapper questionMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean saveQuestion(Question question) throws Exception { + return super.save(question); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateQuestion(Question question) throws Exception { + return super.updateById(question); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deleteQuestion(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Integer getCountByPid(Long pid) throws Exception { + return questionMapper.selectCount(new LambdaQueryWrapper().eq(Question::getPaperId, pid)); + } + + @Override + public Paging getQuestionPageList(QuestionPageParam questionPageParam) throws Exception { + Page page = new PageInfo<>(questionPageParam, OrderItem.desc(getLambdaColumn(Question::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = questionMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + +} diff --git a/example/src/main/resources/mapper/paper/PaperMapper.xml b/example/src/main/resources/mapper/paper/PaperMapper.xml new file mode 100644 index 0000000..933f20c --- /dev/null +++ b/example/src/main/resources/mapper/paper/PaperMapper.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/example/src/main/resources/mapper/question/QuestionMapper.xml b/example/src/main/resources/mapper/question/QuestionMapper.xml new file mode 100644 index 0000000..952c7c9 --- /dev/null +++ b/example/src/main/resources/mapper/question/QuestionMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/pom.xml b/framework/pom.xml index 7412c99..a4c3131 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -92,6 +92,14 @@ + + + com.qiniu + qiniu-java-sdk + ${qiniu.version} + + + io.geekidea.springbootplus config diff --git a/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java index c942087..f6ce8c8 100644 --- a/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java +++ b/generator/src/main/java/io/geekidea/springbootplus/generator/SpringBootPlusGenerator.java @@ -47,14 +47,14 @@ public class SpringBootPlusGenerator { generatorProperties .setMavenModuleName("example") .setParentPackage("com.example") - .setModuleName("category") - .setAuthor("geekidea") + .setModuleName("question") + .setAuthor("limg") .setFileOverride(true); // 设置表信息 - generatorProperties.addTable("p_category","id"); + generatorProperties.addTable("p_question","id"); // 设置表前缀 - // generatorProperties.setTablePrefix(Arrays.asList("tb_")); + generatorProperties.setTablePrefix(Arrays.asList("p_")); // 数据源配置 generatorProperties.getDataSourceConfig() diff --git a/pom.xml b/pom.xml index a4f929f..c15ed04 100644 --- a/pom.xml +++ b/pom.xml @@ -78,6 +78,7 @@ 1.26 2.9.2 2.0.2 + [7.4.0, 7.4.99] 3.8.1 3.1.0 diff --git a/system/src/main/java/io/geekidea/springbootplus/system/controller/UploadController.java b/system/src/main/java/io/geekidea/springbootplus/system/controller/UploadController.java index 7f22b41..78e3a9d 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/controller/UploadController.java +++ b/system/src/main/java/io/geekidea/springbootplus/system/controller/UploadController.java @@ -21,7 +21,9 @@ import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.log.annotation.Module; import io.geekidea.springbootplus.framework.log.annotation.OperationLog; import io.geekidea.springbootplus.framework.log.enums.OperationLogType; +import io.geekidea.springbootplus.framework.util.UUIDUtil; import io.geekidea.springbootplus.framework.util.UploadUtil; +import io.geekidea.springbootplus.system.service.UploadService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -29,6 +31,7 @@ import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -36,6 +39,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import java.io.FileInputStream; +import java.io.InputStream; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -56,6 +61,9 @@ public class UploadController { @Autowired private SpringBootPlusProperties springBootPlusProperties; + @Autowired + private UploadService uploadService; + /** * 上传单个文件 * @return @@ -76,22 +84,37 @@ public class UploadController { log.info("Size = " + multipartFile.getSize()); log.info("type = " + type); - // 上传文件,返回保存的文件名称 - String saveFileName = UploadUtil.upload(springBootPlusProperties.getUploadPath(), multipartFile, originalFilename -> { - // 文件后缀 - String fileExtension = FilenameUtils.getExtension(originalFilename); - // 这里可自定义文件名称,比如按照业务类型/文件格式/日期 - String dateString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssS")) + RandomStringUtils.randomNumeric(6); - String fileName = dateString + "." + fileExtension; - return fileName; - }); + // 获取文件的名称 + String originalFileName = multipartFile.getOriginalFilename(); + // 文件后缀 + String ext = FilenameUtils.getExtension(originalFileName); + String fileName = StringUtils.isNoneEmpty(ext) ? UUIDUtil.getUuid() + '.' + ext : UUIDUtil.getUuid(); - // 上传成功之后,返回访问路径,请根据实际情况设置 + if (!multipartFile.isEmpty()) { + InputStream inputStream = multipartFile.getInputStream(); - String fileAccessPath = springBootPlusProperties.getResourceAccessUrl() + saveFileName; - log.info("fileAccessPath:{}", fileAccessPath); + String path = uploadService.uploadFile(inputStream, fileName); + System.out.print("七牛云返回的图片链接:" + path); + return ApiResult.ok(path); + } + return ApiResult.fail("上传失败"); - return ApiResult.ok(fileAccessPath); +// // 上传文件,返回保存的文件名称 +// String saveFileName = UploadUtil.upload(springBootPlusProperties.getUploadPath(), multipartFile, originalFilename -> { +// // 文件后缀 +// String fileExtension = FilenameUtils.getExtension(originalFilename); +// // 这里可自定义文件名称,比如按照业务类型/文件格式/日期 +// String dateString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssS")) + RandomStringUtils.randomNumeric(6); +// String fileName = dateString + "." + fileExtension; +// return fileName; +// }); +// +// // 上传成功之后,返回访问路径,请根据实际情况设置 +// +// String fileAccessPath = springBootPlusProperties.getResourceAccessUrl() + saveFileName; +// log.info("fileAccessPath:{}", fileAccessPath); +// +// return ApiResult.ok(fileAccessPath); } } diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/UploadService.java b/system/src/main/java/io/geekidea/springbootplus/system/service/UploadService.java new file mode 100644 index 0000000..cea4e77 --- /dev/null +++ b/system/src/main/java/io/geekidea/springbootplus/system/service/UploadService.java @@ -0,0 +1,28 @@ +package io.geekidea.springbootplus.system.service; + +import com.qiniu.common.QiniuException; + +import java.io.FileInputStream; +import java.io.InputStream; + +public abstract class UploadService { + + public abstract String uploadImg(FileInputStream file, String path); + + /** + * 以流的形式上传 + * + * @param inputStream + * @param fileName: + * @return: java.lang.String + */ + public abstract String uploadFile(InputStream inputStream, String fileName) throws QiniuException; + + /** + * 删除文件 + * + * @param key: + * @return: java.lang.String + */ + public abstract String delete(String key) throws QiniuException; +} diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/UploadServiceImpl.java b/system/src/main/java/io/geekidea/springbootplus/system/service/impl/UploadServiceImpl.java new file mode 100644 index 0000000..97d8ee8 --- /dev/null +++ b/system/src/main/java/io/geekidea/springbootplus/system/service/impl/UploadServiceImpl.java @@ -0,0 +1,78 @@ +package io.geekidea.springbootplus.system.service.impl; + +import com.qiniu.common.QiniuException; +import com.qiniu.http.Response; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.UploadManager; +import com.qiniu.util.Auth; +import com.qiniu.util.StringMap; +import io.geekidea.springbootplus.system.service.UploadService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.FileInputStream; +import java.io.InputStream; + +@Slf4j +@Service +public class UploadServiceImpl extends UploadService implements InitializingBean { + @Autowired + private UploadManager uploadManager; + + @Autowired + private BucketManager bucketManager; + + @Autowired + private Auth auth; + + @Value("${qiniu.bucket}") + private String bucket; + + @Value("${qiniu.domain}") + private String domain; + + /** + * 定义七牛云上传的相关策略 + */ + private StringMap putPolicy; + + @Override + public String uploadImg(FileInputStream file, String path) { + return null; + } + + @Override + public String uploadFile(InputStream inputStream, String fileName) throws QiniuException { + Response response = this.uploadManager.put(inputStream, fileName, getUploadToken(), null, null); + int retry = 0; + while (response.needRetry() && retry < 3) { + response = this.uploadManager.put(inputStream, fileName, getUploadToken(), null, null); + retry++; + } + if (response.statusCode == 200) { + return "http://" + domain + "/" + fileName; + } + return "上传失败!"; + } + + @Override + public String delete(String key) throws QiniuException { + return null; + } + + @Override + public void afterPropertiesSet() throws Exception { + this.putPolicy = new StringMap(); + putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"width\":$(imageInfo.width), \"height\":${imageInfo.height}}"); + } + + /** + * 获取上传凭证 + */ + private String getUploadToken() { + return this.auth.uploadToken(bucket, null, 3600, putPolicy); + } +} -- Gitee From 4d78d3274d9b731cda09de45eda38869ea030b23 Mon Sep 17 00:00:00 2001 From: limingguang Date: Sat, 6 Feb 2021 22:42:43 +0800 Subject: [PATCH 06/36] commit profile code --- bootstrap/pom.xml | 4 + .../boot/SpringBootPlusApplication.java | 4 +- .../config/QiniuConfig.java | 5 +- .../controller/CategoryController.java | 17 ++-- .../com/example/category/entity/Category.java | 3 +- .../category/param/CategoryPageParam.java | 2 +- .../category/service/CategoryService.java | 4 +- .../service/impl/CategoryServiceImpl.java | 6 +- .../foobar/controller/FooBarController.java | 1 - .../interceptor/UpdateUserInterceptor.java | 2 +- .../paper/controller/PaperController.java | 17 ++-- .../java/com/example/paper/entity/Paper.java | 6 +- .../example/paper/param/PaperPageParam.java | 2 +- .../example/paper/service/PaperService.java | 4 +- .../paper/service/impl/PaperServiceImpl.java | 6 +- .../controller/QuestionController.java | 17 ++-- .../com/example/question/entity/Question.java | 3 +- .../question/param/QuestionPageParam.java | 2 +- .../question/service/QuestionService.java | 4 +- .../service/impl/QuestionServiceImpl.java | 6 +- .../framework/common/entity/BaseEntity.java | 4 +- .../framework/util/PrintApplicationInfo.java | 1 + .../generator/SpringBootPlusGenerator.java | 12 ++- pom.xml | 6 ++ wechat/pom.xml | 23 +++++ .../profile/controller/ProfileController.java | 94 ++++++++++++++++++ .../com/koronol/profile/entity/Profile.java | 90 +++++++++++++++++ .../koronol/profile/mapper/ProfileMapper.java | 24 +++++ .../profile/param/ProfilePageParam.java | 23 +++++ .../profile/service/ProfileService.java | 53 ++++++++++ .../service/impl/ProfileServiceImpl.java | 58 +++++++++++ .../mapper/profile/ProfileMapper.xml | 5 + .../controller/ProfileController.class | Bin 0 -> 4689 bytes .../com/koronol/profile/entity/Profile.class | Bin 0 -> 9078 bytes .../profile/mapper/ProfileMapper.class | Bin 0 -> 403 bytes .../profile/param/ProfilePageParam.class | Bin 0 -> 1103 bytes .../profile/service/ProfileService.class | Bin 0 -> 819 bytes .../service/impl/ProfileServiceImpl.class | Bin 0 -> 5351 bytes .../classes/mapper/profile/ProfileMapper.xml | 5 + wechat/target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 6 ++ .../compile/default-compile/inputFiles.lst | 6 ++ .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 wechat/target/wechat-2.1-SNAPSHOT.jar | Bin 0 -> 12314 bytes 45 files changed, 465 insertions(+), 65 deletions(-) rename bootstrap/src/main/java/io/geekidea/{springbootplus => boot}/config/QiniuConfig.java (92%) create mode 100644 wechat/pom.xml create mode 100644 wechat/src/main/java/com/koronol/profile/controller/ProfileController.java create mode 100644 wechat/src/main/java/com/koronol/profile/entity/Profile.java create mode 100644 wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java create mode 100644 wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java create mode 100644 wechat/src/main/java/com/koronol/profile/service/ProfileService.java create mode 100644 wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java create mode 100644 wechat/src/main/resources/mapper/profile/ProfileMapper.xml create mode 100644 wechat/target/classes/com/koronol/profile/controller/ProfileController.class create mode 100644 wechat/target/classes/com/koronol/profile/entity/Profile.class create mode 100644 wechat/target/classes/com/koronol/profile/mapper/ProfileMapper.class create mode 100644 wechat/target/classes/com/koronol/profile/param/ProfilePageParam.class create mode 100644 wechat/target/classes/com/koronol/profile/service/ProfileService.class create mode 100644 wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class create mode 100644 wechat/target/classes/mapper/profile/ProfileMapper.xml create mode 100644 wechat/target/maven-archiver/pom.properties create mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 wechat/target/wechat-2.1-SNAPSHOT.jar diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml index 4098a7e..40a6ad0 100644 --- a/bootstrap/pom.xml +++ b/bootstrap/pom.xml @@ -47,6 +47,10 @@ io.geekidea.boot system + + io.geekidea.boot + wechat + io.geekidea.boot scheduled diff --git a/bootstrap/src/main/java/io/geekidea/boot/SpringBootPlusApplication.java b/bootstrap/src/main/java/io/geekidea/boot/SpringBootPlusApplication.java index b144c54..dad04b2 100644 --- a/bootstrap/src/main/java/io/geekidea/boot/SpringBootPlusApplication.java +++ b/bootstrap/src/main/java/io/geekidea/boot/SpringBootPlusApplication.java @@ -40,8 +40,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @EnableConfigurationProperties @ServletComponentScan -@MapperScan({"io.geekidea.boot.**.mapper", "com.example.**.mapper"}) -@SpringBootApplication(scanBasePackages = {"io.geekidea.boot", "com.example"}) +@MapperScan({"io.geekidea.boot.**.mapper", "com.example.**.mapper", "com.koronol.**.mapper"}) +@SpringBootApplication(scanBasePackages = {"io.geekidea.boot", "com.example", "com.koronol"}) public class SpringBootPlusApplication { public static void main(String[] args) { diff --git a/bootstrap/src/main/java/io/geekidea/springbootplus/config/QiniuConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/QiniuConfig.java similarity index 92% rename from bootstrap/src/main/java/io/geekidea/springbootplus/config/QiniuConfig.java rename to bootstrap/src/main/java/io/geekidea/boot/config/QiniuConfig.java index 7f19e50..d5be009 100644 --- a/bootstrap/src/main/java/io/geekidea/springbootplus/config/QiniuConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/QiniuConfig.java @@ -1,11 +1,10 @@ -package io.geekidea.springbootplus.config; +package io.geekidea.boot.config; -import com.qiniu.common.Zone; import com.qiniu.storage.BucketManager; import com.qiniu.storage.Region; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; -import io.geekidea.springbootplus.framework.common.exception.BusinessException; +import io.geekidea.boot.framework.common.exception.BusinessException; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/example/src/main/java/com/example/category/controller/CategoryController.java b/example/src/main/java/com/example/category/controller/CategoryController.java index 3226275..fae82d6 100644 --- a/example/src/main/java/com/example/category/controller/CategoryController.java +++ b/example/src/main/java/com/example/category/controller/CategoryController.java @@ -2,16 +2,17 @@ package com.example.category.controller; import com.example.category.entity.Category; import com.example.category.service.CategoryService; +import io.geekidea.boot.framework.common.controller.BaseController; import lombok.extern.slf4j.Slf4j; import com.example.category.param.CategoryPageParam; -import io.geekidea.springbootplus.framework.common.controller.BaseController; -import io.geekidea.springbootplus.framework.common.api.ApiResult; -import io.geekidea.springbootplus.framework.core.pagination.Paging; -import io.geekidea.springbootplus.framework.log.annotation.Module; -import io.geekidea.springbootplus.framework.log.annotation.OperationLog; -import io.geekidea.springbootplus.framework.log.enums.OperationLogType; -import io.geekidea.springbootplus.framework.core.validator.groups.Add; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.validation.annotation.Validated; diff --git a/example/src/main/java/com/example/category/entity/Category.java b/example/src/main/java/com/example/category/entity/Category.java index 56601e2..1a6108a 100644 --- a/example/src/main/java/com/example/category/entity/Category.java +++ b/example/src/main/java/com/example/category/entity/Category.java @@ -2,7 +2,7 @@ package com.example.category.entity; import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.extension.activerecord.Model; -import io.geekidea.springbootplus.framework.common.entity.BaseEntity; +import io.geekidea.boot.framework.core.validator.groups.Update; import java.util.Date; @@ -13,7 +13,6 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import io.geekidea.springbootplus.framework.core.validator.groups.Update; /** * 题目分类 diff --git a/example/src/main/java/com/example/category/param/CategoryPageParam.java b/example/src/main/java/com/example/category/param/CategoryPageParam.java index 675add0..3843c4d 100644 --- a/example/src/main/java/com/example/category/param/CategoryPageParam.java +++ b/example/src/main/java/com/example/category/param/CategoryPageParam.java @@ -1,10 +1,10 @@ package com.example.category.param; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; -import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam; /** *
diff --git a/example/src/main/java/com/example/category/service/CategoryService.java b/example/src/main/java/com/example/category/service/CategoryService.java
index 1c784c1..8c9690b 100644
--- a/example/src/main/java/com/example/category/service/CategoryService.java
+++ b/example/src/main/java/com/example/category/service/CategoryService.java
@@ -2,8 +2,8 @@ package com.example.category.service;
 
 import com.example.category.entity.Category;
 import com.example.category.param.CategoryPageParam;
-import io.geekidea.springbootplus.framework.common.service.BaseService;
-import io.geekidea.springbootplus.framework.core.pagination.Paging;
+import io.geekidea.boot.framework.common.service.BaseService;
+import io.geekidea.boot.framework.core.pagination.Paging;
 
 import java.util.List;
 
diff --git a/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java b/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java
index 1ff623d..93f46f5 100644
--- a/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java
+++ b/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java
@@ -5,9 +5,9 @@ import com.example.category.mapper.CategoryMapper;
 import com.example.category.service.CategoryService;
 import com.example.category.param.CategoryPageParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
-import io.geekidea.springbootplus.framework.core.pagination.Paging;
-import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
+import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl;
+import io.geekidea.boot.framework.core.pagination.PageInfo;
+import io.geekidea.boot.framework.core.pagination.Paging;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
diff --git a/example/src/main/java/com/example/foobar/controller/FooBarController.java b/example/src/main/java/com/example/foobar/controller/FooBarController.java
index e3b35a6..a63db02 100644
--- a/example/src/main/java/com/example/foobar/controller/FooBarController.java
+++ b/example/src/main/java/com/example/foobar/controller/FooBarController.java
@@ -62,7 +62,6 @@ public class FooBarController extends BaseController {
     @ApiOperation(value = "添加FooBar", response = ApiResult.class)
     public ApiResult addFooBar(@Validated(Add.class) @RequestBody FooBar fooBar) throws Exception {
         boolean flag = fooBarService.saveFooBar(fooBar);
-        List fooBarList = new FooBar().selectList(new LambdaQueryWrapper().eq(FooBar::getBar, 1));
         return ApiResult.result(flag);
     }
 
diff --git a/example/src/main/java/com/example/interceptor/UpdateUserInterceptor.java b/example/src/main/java/com/example/interceptor/UpdateUserInterceptor.java
index 8d4134f..54aed4e 100644
--- a/example/src/main/java/com/example/interceptor/UpdateUserInterceptor.java
+++ b/example/src/main/java/com/example/interceptor/UpdateUserInterceptor.java
@@ -1,7 +1,7 @@
 package com.example.interceptor;
 
 import com.example.category.entity.Category;
-import io.geekidea.springbootplus.framework.util.LoginUtil;
+import io.geekidea.boot.framework.util.LoginUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.mapping.MappedStatement;
diff --git a/example/src/main/java/com/example/paper/controller/PaperController.java b/example/src/main/java/com/example/paper/controller/PaperController.java
index 88f1fb4..885d0d8 100644
--- a/example/src/main/java/com/example/paper/controller/PaperController.java
+++ b/example/src/main/java/com/example/paper/controller/PaperController.java
@@ -3,17 +3,16 @@ package com.example.paper.controller;
 import com.example.paper.entity.Paper;
 import com.example.paper.service.PaperService;
 import com.example.paper.vo.PaperQueryVo;
+import io.geekidea.boot.framework.common.api.ApiResult;
+import io.geekidea.boot.framework.common.controller.BaseController;
+import io.geekidea.boot.framework.core.pagination.Paging;
+import io.geekidea.boot.framework.core.validator.groups.Add;
+import io.geekidea.boot.framework.core.validator.groups.Update;
+import io.geekidea.boot.framework.log.annotation.Module;
+import io.geekidea.boot.framework.log.annotation.OperationLog;
+import io.geekidea.boot.framework.log.enums.OperationLogType;
 import lombok.extern.slf4j.Slf4j;
 import com.example.paper.param.PaperPageParam;
-import io.geekidea.springbootplus.framework.common.controller.BaseController;
-import io.geekidea.springbootplus.framework.common.api.ApiResult;
-import io.geekidea.springbootplus.framework.core.pagination.Paging;
-import io.geekidea.springbootplus.framework.common.param.IdParam;
-import io.geekidea.springbootplus.framework.log.annotation.Module;
-import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
-import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
-import io.geekidea.springbootplus.framework.core.validator.groups.Add;
-import io.geekidea.springbootplus.framework.core.validator.groups.Update;
 import org.apache.shiro.SecurityUtils;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.CachePut;
diff --git a/example/src/main/java/com/example/paper/entity/Paper.java b/example/src/main/java/com/example/paper/entity/Paper.java
index 85b5879..3519244 100644
--- a/example/src/main/java/com/example/paper/entity/Paper.java
+++ b/example/src/main/java/com/example/paper/entity/Paper.java
@@ -4,11 +4,11 @@ import java.math.BigDecimal;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
-import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
 
 import java.util.Date;
 
-import io.geekidea.springbootplus.framework.core.validator.groups.Add;
+import io.geekidea.boot.framework.core.validator.groups.Add;
+import io.geekidea.boot.framework.core.validator.groups.Update;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -17,8 +17,6 @@ import lombok.experimental.Accessors;
 
 import javax.validation.constraints.*;
 
-import io.geekidea.springbootplus.framework.core.validator.groups.Update;
-
 /**
  * 试卷实体
  *
diff --git a/example/src/main/java/com/example/paper/param/PaperPageParam.java b/example/src/main/java/com/example/paper/param/PaperPageParam.java
index 24ea357..aa056d1 100644
--- a/example/src/main/java/com/example/paper/param/PaperPageParam.java
+++ b/example/src/main/java/com/example/paper/param/PaperPageParam.java
@@ -1,11 +1,11 @@
 package com.example.paper.param;
 
+import io.geekidea.boot.framework.core.pagination.BasePageOrderParam;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam;
 
 /**
  * 
diff --git a/example/src/main/java/com/example/paper/service/PaperService.java b/example/src/main/java/com/example/paper/service/PaperService.java
index 84ba339..daed25c 100644
--- a/example/src/main/java/com/example/paper/service/PaperService.java
+++ b/example/src/main/java/com/example/paper/service/PaperService.java
@@ -3,8 +3,8 @@ package com.example.paper.service;
 import com.example.paper.entity.Paper;
 import com.example.paper.param.PaperPageParam;
 import com.example.paper.vo.PaperQueryVo;
-import io.geekidea.springbootplus.framework.common.service.BaseService;
-import io.geekidea.springbootplus.framework.core.pagination.Paging;
+import io.geekidea.boot.framework.common.service.BaseService;
+import io.geekidea.boot.framework.core.pagination.Paging;
 
 /**
  * 试卷实体 服务类
diff --git a/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java b/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java
index 951889f..29392c1 100644
--- a/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java
+++ b/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java
@@ -6,12 +6,12 @@ import com.example.paper.service.PaperService;
 import com.example.paper.param.PaperPageParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.example.paper.vo.PaperQueryVo;
-import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
-import io.geekidea.springbootplus.framework.core.pagination.Paging;
-import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl;
+import io.geekidea.boot.framework.core.pagination.PageInfo;
+import io.geekidea.boot.framework.core.pagination.Paging;
 import org.springframework.transaction.annotation.Transactional;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
diff --git a/example/src/main/java/com/example/question/controller/QuestionController.java b/example/src/main/java/com/example/question/controller/QuestionController.java
index cb354c3..f315325 100644
--- a/example/src/main/java/com/example/question/controller/QuestionController.java
+++ b/example/src/main/java/com/example/question/controller/QuestionController.java
@@ -2,17 +2,16 @@ package com.example.question.controller;
 
 import com.example.question.entity.Question;
 import com.example.question.service.QuestionService;
+import io.geekidea.boot.framework.common.api.ApiResult;
+import io.geekidea.boot.framework.common.controller.BaseController;
+import io.geekidea.boot.framework.core.pagination.Paging;
+import io.geekidea.boot.framework.core.validator.groups.Add;
+import io.geekidea.boot.framework.core.validator.groups.Update;
+import io.geekidea.boot.framework.log.annotation.Module;
+import io.geekidea.boot.framework.log.annotation.OperationLog;
+import io.geekidea.boot.framework.log.enums.OperationLogType;
 import lombok.extern.slf4j.Slf4j;
 import com.example.question.param.QuestionPageParam;
-import io.geekidea.springbootplus.framework.common.controller.BaseController;
-import io.geekidea.springbootplus.framework.common.api.ApiResult;
-import io.geekidea.springbootplus.framework.core.pagination.Paging;
-import io.geekidea.springbootplus.framework.common.param.IdParam;
-import io.geekidea.springbootplus.framework.log.annotation.Module;
-import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
-import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
-import io.geekidea.springbootplus.framework.core.validator.groups.Add;
-import io.geekidea.springbootplus.framework.core.validator.groups.Update;
 import org.springframework.validation.annotation.Validated;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
diff --git a/example/src/main/java/com/example/question/entity/Question.java b/example/src/main/java/com/example/question/entity/Question.java
index 890f874..8299d37 100644
--- a/example/src/main/java/com/example/question/entity/Question.java
+++ b/example/src/main/java/com/example/question/entity/Question.java
@@ -2,10 +2,10 @@ package com.example.question.entity;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
-import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
 
 import java.util.Date;
 
+import io.geekidea.boot.framework.core.validator.groups.Update;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -13,7 +13,6 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
-import io.geekidea.springbootplus.framework.core.validator.groups.Update;
 
 /**
  * 题目信息
diff --git a/example/src/main/java/com/example/question/param/QuestionPageParam.java b/example/src/main/java/com/example/question/param/QuestionPageParam.java
index 26ed94b..6ee8c49 100644
--- a/example/src/main/java/com/example/question/param/QuestionPageParam.java
+++ b/example/src/main/java/com/example/question/param/QuestionPageParam.java
@@ -1,10 +1,10 @@
 package com.example.question.param;
 
+import io.geekidea.boot.framework.core.pagination.BasePageOrderParam;
 import io.swagger.annotations.ApiModel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam;
 
 /**
  * 
diff --git a/example/src/main/java/com/example/question/service/QuestionService.java b/example/src/main/java/com/example/question/service/QuestionService.java
index b58a9e8..db1207f 100644
--- a/example/src/main/java/com/example/question/service/QuestionService.java
+++ b/example/src/main/java/com/example/question/service/QuestionService.java
@@ -2,8 +2,8 @@ package com.example.question.service;
 
 import com.example.question.entity.Question;
 import com.example.question.param.QuestionPageParam;
-import io.geekidea.springbootplus.framework.common.service.BaseService;
-import io.geekidea.springbootplus.framework.core.pagination.Paging;
+import io.geekidea.boot.framework.common.service.BaseService;
+import io.geekidea.boot.framework.core.pagination.Paging;
 
 /**
  * 题目信息 服务类
diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
index 75d5830..0c13ae6 100644
--- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
+++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
@@ -5,9 +5,9 @@ import com.example.question.mapper.QuestionMapper;
 import com.example.question.service.QuestionService;
 import com.example.question.param.QuestionPageParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
-import io.geekidea.springbootplus.framework.core.pagination.Paging;
-import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
+import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl;
+import io.geekidea.boot.framework.core.pagination.PageInfo;
+import io.geekidea.boot.framework.core.pagination.Paging;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
diff --git a/framework/src/main/java/io/geekidea/boot/framework/common/entity/BaseEntity.java b/framework/src/main/java/io/geekidea/boot/framework/common/entity/BaseEntity.java
index e7b95fa..c56b91b 100644
--- a/framework/src/main/java/io/geekidea/boot/framework/common/entity/BaseEntity.java
+++ b/framework/src/main/java/io/geekidea/boot/framework/common/entity/BaseEntity.java
@@ -16,9 +16,11 @@
 
 package io.geekidea.boot.framework.common.entity;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import io.swagger.annotations.ApiModel;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 实体父类
@@ -28,5 +30,5 @@ import java.io.Serializable;
 @ApiModel("BaseEntity")
 public abstract class BaseEntity implements Serializable{
 	private static final long serialVersionUID = -7176390653391227433L;
-	
+
 }
diff --git a/framework/src/main/java/io/geekidea/boot/framework/util/PrintApplicationInfo.java b/framework/src/main/java/io/geekidea/boot/framework/util/PrintApplicationInfo.java
index 991cbea..d2d2042 100644
--- a/framework/src/main/java/io/geekidea/boot/framework/util/PrintApplicationInfo.java
+++ b/framework/src/main/java/io/geekidea/boot/framework/util/PrintApplicationInfo.java
@@ -53,6 +53,7 @@ public class PrintApplicationInfo {
         tip.append("    config:      项目配置模块\n");
         tip.append("    distribution:项目打包模块,打包时,请先选中Maven Profiles中的release和对应环境\n");
         tip.append("    example:     业务自定义模块,自己的业务代码可在example下进行,也可以再创建模块\n");
+        tip.append("    wechat:      微信相关模块\n");
         tip.append("    framework:   项目核心框架模块\n");
         tip.append("    generator:   代码生成模块,启动类:SpringBootPlusGenerator,请根据实际情况进行配置\n");
         tip.append("    scheduled:   任务调度模块\n");
diff --git a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java
index 6541921..0674617 100644
--- a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java
+++ b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java
@@ -25,6 +25,8 @@ import io.geekidea.boot.generator.constant.GeneratorConstant;
 import io.geekidea.boot.generator.properties.GeneratorProperties;
 import org.springframework.stereotype.Component;
 
+import java.util.Arrays;
+
 /**
  * spring-boot-plus代码生成器入口类
  *
@@ -43,16 +45,16 @@ public class SpringBootPlusGenerator {
 
         // 设置基本信息
         generatorProperties
-                .setMavenModuleName("example")
-                .setParentPackage("com.example")
-                .setModuleName("question")
+                .setMavenModuleName("wechat")
+                .setParentPackage("com.koronol")
+                .setModuleName("profile")
                 .setAuthor("limg")
                 .setFileOverride(true);
 
         // 设置表信息
-        generatorProperties.addTable("p_question","id");
+        generatorProperties.addTable("p_profile","id");
         // 设置表前缀
-         generatorProperties.setTablePrefix(Arrays.asList("p_"));
+        generatorProperties.setTablePrefix(Arrays.asList("p_"));
 
         // 数据源配置
         generatorProperties.getDataSourceConfig()
diff --git a/pom.xml b/pom.xml
index d09873d..75cb3a0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -98,6 +98,7 @@
         generator
         scheduled
         system
+        wechat
     
 
     
@@ -263,6 +264,11 @@
                 example
                 ${project.version}
             
+            
+                io.geekidea.boot
+                wechat
+                ${project.version}
+            
             
                 io.geekidea.boot
                 framework
diff --git a/wechat/pom.xml b/wechat/pom.xml
new file mode 100644
index 0000000..ef90ed5
--- /dev/null
+++ b/wechat/pom.xml
@@ -0,0 +1,23 @@
+
+
+    
+        spring-boot-plus
+        io.geekidea.boot
+        2.1-SNAPSHOT
+    
+    4.0.0
+
+    wechat
+    wechat
+    微信相关接口模块
+
+    
+        
+            io.geekidea.boot
+            framework
+        
+    
+
+
\ No newline at end of file
diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java
new file mode 100644
index 0000000..22d5e32
--- /dev/null
+++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java
@@ -0,0 +1,94 @@
+package com.koronol.profile.controller;
+
+import com.koronol.profile.entity.Profile;
+import com.koronol.profile.service.ProfileService;
+import lombok.extern.slf4j.Slf4j;
+import com.koronol.profile.param.ProfilePageParam;
+import io.geekidea.boot.framework.common.controller.BaseController;
+import io.geekidea.boot.framework.common.api.ApiResult;
+import io.geekidea.boot.framework.core.pagination.Paging;
+import io.geekidea.boot.framework.common.param.IdParam;
+import io.geekidea.boot.framework.log.annotation.Module;
+import io.geekidea.boot.framework.log.annotation.OperationLog;
+import io.geekidea.boot.framework.log.enums.OperationLogType;
+import io.geekidea.boot.framework.core.validator.groups.Add;
+import io.geekidea.boot.framework.core.validator.groups.Update;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 用户信息 控制器
+ *
+ * @author limg
+ * @since 2021-02-06
+ */
+@Slf4j
+@RestController
+@RequestMapping("/profile")
+@Module("profile")
+@Api(value = "用户信息API", tags = {"用户信息"})
+public class ProfileController extends BaseController {
+
+    @Autowired
+    private ProfileService profileService;
+
+    /**
+     * 添加用户信息
+     */
+    @PostMapping("/add")
+    @OperationLog(name = "添加用户信息", type = OperationLogType.ADD)
+    @ApiOperation(value = "添加用户信息", response = ApiResult.class)
+    public ApiResult addProfile(@Validated(Add.class) @RequestBody Profile profile) throws Exception {
+        boolean flag = profileService.saveProfile(profile);
+        return ApiResult.result(flag);
+    }
+
+    /**
+     * 修改用户信息
+     */
+    @PostMapping("/update")
+    @OperationLog(name = "修改用户信息", type = OperationLogType.UPDATE)
+    @ApiOperation(value = "修改用户信息", response = ApiResult.class)
+    public ApiResult updateProfile(@Validated(Update.class) @RequestBody Profile profile) throws Exception {
+        boolean flag = profileService.updateProfile(profile);
+        return ApiResult.result(flag);
+    }
+
+    /**
+     * 删除用户信息
+     */
+    @PostMapping("/delete/{id}")
+    @OperationLog(name = "删除用户信息", type = OperationLogType.DELETE)
+    @ApiOperation(value = "删除用户信息", response = ApiResult.class)
+    public ApiResult deleteProfile(@PathVariable("id") Long id) throws Exception {
+        boolean flag = profileService.deleteProfile(id);
+        return ApiResult.result(flag);
+    }
+
+    /**
+     * 获取用户信息详情
+     */
+    @GetMapping("/info/{id}")
+    @OperationLog(name = "用户信息详情", type = OperationLogType.INFO)
+    @ApiOperation(value = "用户信息详情", response = Profile.class)
+    public ApiResult getProfile(@PathVariable("id") Long id) throws Exception {
+        Profile profile = profileService.getById(id);
+        return ApiResult.ok(profile);
+    }
+
+    /**
+     * 用户信息分页列表
+     */
+    @PostMapping("/getPageList")
+    @OperationLog(name = "用户信息分页列表", type = OperationLogType.PAGE)
+    @ApiOperation(value = "用户信息分页列表", response = Profile.class)
+    public ApiResult> getProfilePageList(@Validated @RequestBody ProfilePageParam profilePageParam) throws Exception {
+        Paging paging = profileService.getProfilePageList(profilePageParam);
+        return ApiResult.ok(paging);
+    }
+
+}
+
diff --git a/wechat/src/main/java/com/koronol/profile/entity/Profile.java b/wechat/src/main/java/com/koronol/profile/entity/Profile.java
new file mode 100644
index 0000000..ce38b83
--- /dev/null
+++ b/wechat/src/main/java/com/koronol/profile/entity/Profile.java
@@ -0,0 +1,90 @@
+package com.koronol.profile.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.geekidea.boot.framework.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import io.geekidea.boot.framework.core.validator.groups.Update;
+
+/**
+ * 用户信息
+ *
+ * @author limg
+ * @since 2021-02-06
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@TableName("p_profile")
+@ApiModel(value = "Profile对象")
+public class Profile extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    @NotNull(message = "id不能为空", groups = {Update.class})
+    @ApiModelProperty("编号")
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("姓名")
+    @TableField("NAME")
+    private String name;
+
+    @ApiModelProperty("手机号")
+    @TableField("PHONE")
+    private String phone;
+
+    @ApiModelProperty("openid")
+    @TableField("OPEN_ID")
+    private String openId;
+
+    @ApiModelProperty("昵称")
+    @TableField("NICK_NAME")
+    private String nickName;
+
+    @ApiModelProperty("头像")
+    @TableField("AVATAR_URL")
+    private String avatarUrl;
+
+    @ApiModelProperty("状态 0-正常,1-冻结")
+    @TableField("STATUS")
+    private String status;
+
+    @ApiModelProperty("是否会员")
+    @TableField("IS_VIP")
+    private String isVip;
+
+    @ApiModelProperty("会员有效期")
+    @TableField("VALID")
+    private Date valid;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("REVISION")
+    private Integer revision;
+
+    @ApiModelProperty("创建人")
+    @TableField("CREATED_BY")
+    private String createdBy;
+
+    @ApiModelProperty("创建时间")
+    @TableField("CREATED_TIME")
+    private Date createdTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("UPDATED_BY")
+    private String updatedBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("UPDATED_TIME")
+    private Date updatedTime;
+
+}
diff --git a/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java b/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java
new file mode 100644
index 0000000..b2f9f5f
--- /dev/null
+++ b/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java
@@ -0,0 +1,24 @@
+package com.koronol.profile.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.koronol.profile.entity.Profile;
+import com.koronol.profile.param.ProfilePageParam;
+
+import org.springframework.stereotype.Repository;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import java.io.Serializable;
+
+/**
+ * 用户信息 Mapper 接口
+ *
+ * @author limg
+ * @since 2021-02-06
+ */
+@Repository
+public interface ProfileMapper extends BaseMapper {
+
+
+}
diff --git a/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java b/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java
new file mode 100644
index 0000000..9a42920
--- /dev/null
+++ b/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java
@@ -0,0 +1,23 @@
+package com.koronol.profile.param;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import io.geekidea.boot.framework.core.pagination.BasePageOrderParam;
+
+/**
+ * 
+ * 用户信息 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-06 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "用户信息分页参数") +public class ProfilePageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java new file mode 100644 index 0000000..bfa6639 --- /dev/null +++ b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java @@ -0,0 +1,53 @@ +package com.koronol.profile.service; + +import com.koronol.profile.entity.Profile; +import com.koronol.profile.param.ProfilePageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +/** + * 用户信息 服务类 + * + * @author limg + * @since 2021-02-06 + */ +public interface ProfileService extends BaseService { + + /** + * 保存 + * + * @param profile + * @return + * @throws Exception + */ + boolean saveProfile(Profile profile) throws Exception; + + /** + * 修改 + * + * @param profile + * @return + * @throws Exception + */ + boolean updateProfile(Profile profile) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteProfile(Long id) throws Exception; + + + /** + * 获取分页对象 + * + * @param profileQueryParam + * @return + * @throws Exception + */ + Paging getProfilePageList(ProfilePageParam profilePageParam) throws Exception; + +} diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java new file mode 100644 index 0000000..87c9641 --- /dev/null +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -0,0 +1,58 @@ +package com.koronol.profile.service.impl; + +import com.koronol.profile.entity.Profile; +import com.koronol.profile.mapper.ProfileMapper; +import com.koronol.profile.service.ProfileService; +import com.koronol.profile.param.ProfilePageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 用户信息 服务实现类 + * + * @author limg + * @since 2021-02-06 + */ +@Slf4j +@Service +public class ProfileServiceImpl extends BaseServiceImpl implements ProfileService { + + @Autowired + private ProfileMapper profileMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean saveProfile(Profile profile) throws Exception { + return super.save(profile); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateProfile(Profile profile) throws Exception { + return super.updateById(profile); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deleteProfile(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Paging getProfilePageList(ProfilePageParam profilePageParam) throws Exception { + Page page = new PageInfo<>(profilePageParam, OrderItem.desc(getLambdaColumn(Profile::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = profileMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + +} diff --git a/wechat/src/main/resources/mapper/profile/ProfileMapper.xml b/wechat/src/main/resources/mapper/profile/ProfileMapper.xml new file mode 100644 index 0000000..73580c6 --- /dev/null +++ b/wechat/src/main/resources/mapper/profile/ProfileMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/wechat/target/classes/com/koronol/profile/controller/ProfileController.class b/wechat/target/classes/com/koronol/profile/controller/ProfileController.class new file mode 100644 index 0000000000000000000000000000000000000000..acb4c227afe018ee42db28c224d74b6c1caa931c GIT binary patch literal 4689 zcmcInS#uOs6h1v!CYdx4iLxllB1jS<%}y`@ooo=CBx5!psMs@eGj!7FJ9PIX1Vlwk zE9Em)mTypHSv-lBS}azH&;AY);ZIn8x0jjD(36A+^Dy0g`<`>Y^WC%c-~T@NlZXz{ zmoZvPYAw}Ks*ci>i4mi5ahDZ;7sa0zr3tY-DIWAFO~uF{E<|!sx+GDB&a)D&PjEA< zSo-*(2_?a^S!T9Lv^Hn*aZP7K%$(NJOrn-VnolW{+~fw=74NNLxv!PvqTP_+JeW6Z zZHkR*mX^|4+%UMU+8Q@3iCSHQIa4#TrX1F=2q?l@0%D9@gxjCz-1py_VxA}}_ zvJBK#w`+!Gp8)j6rcsG1J9!4!)+IE9_2;Kj%p6u>&G9L%>Z7WuiDz%I(!Qv{{DDwU z(%i63uItS7o#`yBz;H~>WIQJ&I@1`cg27{Z))#MUN@!fkGB&AYn5v{Wx0Rx|AajZv zikj1ucupH+R$jMZCh8F@(ax2a00ZN?iZhhP0I~aWn&ljhqhv}{JEUa|)y|vXLw_-d z+Y=M&w5sT;kySc4*KvexC*a26&=a0vDJ7*Dnc(3jxn=jMxg0_Pa#ho+o(J4Y1$2u* zS%N{tZcx!cj+st?A%vl+(m-4x4i@hIG5_t&e{S4fn7jMv;jM-1cks@h&EehA<+L*+ zKV>OF#lsMU@``v@mqfdSyfveWj0qsI#DNxsu)D@&Rt|v=llzx4StcZQEY75)Dl*1q z=Ax7eCmd{Q8HbbrK4sKhb@J)R(tu2+csjVLWKEvW!Mlt|#BhUQCp^e5<(Xx7@XRda z*5q?Q#0setRon#})uV?$E!?=j_^7H!l3nrPZi$XPJJ1owlCYU!Iv6Y1>}(8#ZGt26 zR+Fj`4G~&js!5`=|6hB#w2~Fq6XmLwxdz7O=Wagv{)ZCAy1EnHg0Ukj&q39`=$A^+ z70WWaz?Jqqyb0?ZCB;%yjYBI&e3AuxWaIIj9~Zv*8VTRq-!lNdijF1K zEK6vXEzyPW%9s;r=9hA@+sV6C1xmeF(+gV4HPbRS(e-j_76nqGgUe=tv(rs^*mJAu zh6E2bL)0*@A)b47b?qx@OX4seyjWh_Ul?=&UPj-x#d*0gvMCr;^K;)kx%K<}+;@*} z-9~67<0p}9HSKBLn@nOuJa4914~8d+Hh76toF(>(j#+L73a_7*T@(kn@bM{J)G58i z{#xS?Zej{rd2j9GnY=C<-xeWMrsd)Fx*$*SWUpwoY8E4x9DE_uE3`qTmuP*IESYS| zM`>E78M-Xf5z5QdMzbMV7-*r#@fr%*}dY{KZLEDwCqq=}M( zp#&o*if-fBYPw&;(|rLrqDY&L*oOKF0EJc5jip~qJ?>`(V&A(A(&wZ+h(D5zzsPbp5xq4!_61@#zdmUZd-2I*|NYWd$ z6*}vnaU1MKXb1LJV&zTR>1f&IfNz1^TUgzFo+OJJsR=uqE!smZ4BGd?jR@@)&->D} zpAJB>0ntDQJ&`m%a}Q$?!%SK5Rb{}p0^G6Z2>z%KzSRYP%m?3E7W_LN_%>=U!+doa z@SOnPRR;WVIsrn;GyiS~^Y8iK<1Y9PAAGzBUKSD6DVVqDI4)fU)FU_&5ibp1yhJ1P z7uEE&+@spkkm*Mx4+MZW6hfu}N(Jz>ph5)C(;?Gc0Nx`|I3aV=2Y$*0-s=NDC4g^r zLZ%e>X?owIJL3WO13ea@0_qAUVcbAJ2Rg?BsOt-;>nTBfKqKhxhi4H=f(VgX?#c%t zehe1;D2D!!@5iv~$B6I8aM6!CH}uJgni?7{B>Q%l6TjN^b@xdAmDY%amjVgD1t`v7 jEkb8K+m&<<&tur-@_3#;6!#XW{|MV~^D$j;82;ox5w1Qe literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/profile/entity/Profile.class b/wechat/target/classes/com/koronol/profile/entity/Profile.class new file mode 100644 index 0000000000000000000000000000000000000000..e8453b6efc790d4a88c0344a77b8616cbd19b054 GIT binary patch literal 9078 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 LE>iSTfXjaXw`bx0 literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/profile/service/ProfileService.class b/wechat/target/classes/com/koronol/profile/service/ProfileService.class new file mode 100644 index 0000000000000000000000000000000000000000..52a303290f42b0dccbf66c023fb4c6161d9c5524 GIT binary patch literal 819 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 bUuwj-jX&WJ=s}U|Zmvr_E`bS@F$wEGS^PZE literal 0 HcmV?d00001 diff --git a/wechat/target/classes/mapper/profile/ProfileMapper.xml b/wechat/target/classes/mapper/profile/ProfileMapper.xml new file mode 100644 index 0000000..73580c6 --- /dev/null +++ b/wechat/target/classes/mapper/profile/ProfileMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/wechat/target/maven-archiver/pom.properties b/wechat/target/maven-archiver/pom.properties new file mode 100644 index 0000000..c40f4df --- /dev/null +++ b/wechat/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Sat Feb 06 22:34:34 CST 2021 +version=2.1-SNAPSHOT +groupId=io.geekidea.boot +artifactId=wechat diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..184fcc6 --- /dev/null +++ b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,6 @@ +com/koronol/profile/mapper/ProfileMapper.class +com/koronol/profile/param/ProfilePageParam.class +com/koronol/profile/controller/ProfileController.class +com/koronol/profile/service/impl/ProfileServiceImpl.class +com/koronol/profile/entity/Profile.class +com/koronol/profile/service/ProfileService.class diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..8a3154e --- /dev/null +++ b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,6 @@ +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/entity/Profile.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/ProfileService.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java diff --git a/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/wechat/target/wechat-2.1-SNAPSHOT.jar b/wechat/target/wechat-2.1-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..4b6adf2e7e3f86c67e8237fa6fa9352609e81914 GIT binary patch literal 12314 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 bKhApvY1rHP6a)mp?T^pxu@`j54~F Date: Sat, 13 Feb 2021 17:27:22 +0800 Subject: [PATCH 07/36] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/geekidea/boot/aop/LogAop.java | 1 + .../config/SpringBootPlusWebMvcConfig.java | 1 + .../main/resources/config/application-dev.yml | 7 +- .../src/main/resources/config/application.yml | 6 +- .../com/example/category/entity/Category.java | 4 + .../favorite/controller/FavorController.java | 95 ++++++++++++++++++ .../com/example/favorite/entity/Favor.java | 70 +++++++++++++ .../example/favorite/mapper/FavorMapper.java | 24 +++++ .../favorite/param/FavorPageParam.java | 23 +++++ .../favorite/service/FavorService.java | 53 ++++++++++ .../service/impl/FavorServiceImpl.java | 65 ++++++++++++ .../paper/controller/PaperController.java | 11 ++ .../java/com/example/paper/entity/Paper.java | 2 +- .../com/example/paper/mapper/PaperMapper.java | 4 + .../example/paper/service/PaperService.java | 5 + .../paper/service/impl/PaperServiceImpl.java | 10 ++ .../java/com/example/paper/vo/PaperAppVo.java | 38 +++++++ .../com/example/paper/vo/PaperQueryVo.java | 2 +- .../resources/mapper/favorite/FavorMapper.xml | 5 + .../resources/mapper/paper/PaperMapper.xml | 21 ++++ .../boot/framework/shiro/jwt/JwtFilter.java | 16 +++ .../generator/SpringBootPlusGenerator.java | 8 +- .../profile/controller/ProfileController.java | 22 +++- .../com/koronol/profile/entity/Profile.java | 16 ++- .../koronol/profile/mapper/ProfileMapper.java | 3 +- .../profile/param/ProfileQueryParam.java | 26 +++++ .../profile/service/ProfileService.java | 4 + .../service/impl/ProfileServiceImpl.java | 90 +++++++++++++++++ .../koronol/profile/vo/ProfileTokenVo.java | 46 +++++++++ .../mapper/profile/ProfileMapper.xml | 5 +- .../controller/ProfileController.class | Bin 4689 -> 5423 bytes .../com/koronol/profile/entity/Profile.class | Bin 9078 -> 9181 bytes .../profile/mapper/ProfileMapper.class | Bin 403 -> 701 bytes .../profile/param/ProfileQueryParam.class | Bin 0 -> 2719 bytes .../profile/service/ProfileService.class | Bin 819 -> 935 bytes .../service/impl/ProfileServiceImpl.class | Bin 5351 -> 10034 bytes .../koronol/profile/vo/ProfileTokenVo.class | Bin 0 -> 5671 bytes .../classes/mapper/profile/ProfileMapper.xml | 5 +- 38 files changed, 665 insertions(+), 23 deletions(-) create mode 100644 example/src/main/java/com/example/favorite/controller/FavorController.java create mode 100644 example/src/main/java/com/example/favorite/entity/Favor.java create mode 100644 example/src/main/java/com/example/favorite/mapper/FavorMapper.java create mode 100644 example/src/main/java/com/example/favorite/param/FavorPageParam.java create mode 100644 example/src/main/java/com/example/favorite/service/FavorService.java create mode 100644 example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java create mode 100644 example/src/main/java/com/example/paper/vo/PaperAppVo.java create mode 100644 example/src/main/resources/mapper/favorite/FavorMapper.xml create mode 100644 wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java create mode 100644 wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java create mode 100644 wechat/target/classes/com/koronol/profile/param/ProfileQueryParam.class create mode 100644 wechat/target/classes/com/koronol/profile/vo/ProfileTokenVo.class diff --git a/bootstrap/src/main/java/io/geekidea/boot/aop/LogAop.java b/bootstrap/src/main/java/io/geekidea/boot/aop/LogAop.java index b8a2416..d9ff74a 100644 --- a/bootstrap/src/main/java/io/geekidea/boot/aop/LogAop.java +++ b/bootstrap/src/main/java/io/geekidea/boot/aop/LogAop.java @@ -48,6 +48,7 @@ public class LogAop extends BaseLogAop { */ private static final String POINTCUT = "execution(public * io.geekidea.boot..*.controller..*.*(..)) || " + + "execution(public * com.koronol..*.controller..*.*(..))" + "execution(public * com.example..*.controller..*.*(..))"; @Around(POINTCUT) diff --git a/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java index bc86f3c..935a2d7 100644 --- a/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java @@ -142,6 +142,7 @@ public class SpringBootPlusWebMvcConfig implements WebMvcConfigurer { } + @PostConstruct public void init() { filterConfig = springBootPlusProperties.getFilter(); diff --git a/config/src/main/resources/config/application-dev.yml b/config/src/main/resources/config/application-dev.yml index 6feb8f0..8b2d633 100644 --- a/config/src/main/resources/config/application-dev.yml +++ b/config/src/main/resources/config/application-dev.yml @@ -35,4 +35,9 @@ qiniu: secretKey: t7eYfFBBsyj7RNas5N2l_z8mzKvGgIsHf49EfCQk bucket: pmp-sys zone: huadong - domain: cdn.koronol.com \ No newline at end of file + domain: cdn.koronol.com + +# 微信配置 +wechat: + appId: wx89e746383cc2cf6a + secret: 9f1bf70209fb0feb97d577f5f4e163f7 \ No newline at end of file diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index 13b3764..903caf2 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -185,12 +185,14 @@ spring-boot-plus: anon: # 排除登录登出 - /login,/logout + - /profile/signIn # 排除静态资源 - /static/**,/templates/** # 排除Swagger - ${spring-boot-plus.swagger-paths} # 排除actuator - /actuator/** + - /paper/wechat/getOpenPaper - # 排除首页 - /,/index.html # 排除测试路径 @@ -222,7 +224,7 @@ spring-boot-plus: # 刷新token的时间间隔,默认10分钟,单位:秒 refresh-token-countdown: 600 # redis校验jwt token是否存在,可选 - redis-check: true + redis-check: false # true: 同一个账号只能是最后一次登录token有效,false:同一个账号可多次登录 single-login: false # 盐值校验,如果不加自定义盐值,则使用secret校验 @@ -303,7 +305,7 @@ spring-boot-plus: enable: true base: # 扫描的包,多个包使用逗号隔开 - package: io.geekidea.boot,com.example + package: io.geekidea.boot,com.example,com.koronol contact: email: geekidea@qq.com name: springboot.plus diff --git a/example/src/main/java/com/example/category/entity/Category.java b/example/src/main/java/com/example/category/entity/Category.java index 1a6108a..48b9e25 100644 --- a/example/src/main/java/com/example/category/entity/Category.java +++ b/example/src/main/java/com/example/category/entity/Category.java @@ -37,6 +37,10 @@ public class Category extends Model { @TableField("SUBJECT") private String subject; + @ApiModelProperty("编号") + @TableField("CODE") + private String code; + @ApiModelProperty("描述") @TableField("REMARK") private String remark; diff --git a/example/src/main/java/com/example/favorite/controller/FavorController.java b/example/src/main/java/com/example/favorite/controller/FavorController.java new file mode 100644 index 0000000..5ffda4e --- /dev/null +++ b/example/src/main/java/com/example/favorite/controller/FavorController.java @@ -0,0 +1,95 @@ +package com.example.favorite.controller; + +import com.example.favorite.entity.Favor; +import com.example.favorite.service.FavorService; +import io.geekidea.boot.framework.util.LoginUtil; +import lombok.extern.slf4j.Slf4j; +import com.example.favorite.param.FavorPageParam; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.common.param.IdParam; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 收藏记录 控制器 + * + * @author limg + * @since 2021-02-12 + */ +@Slf4j +@RestController +@RequestMapping("/favor") +@Module("favorite") +@Api(value = "收藏记录API", tags = {"收藏记录"}) +public class FavorController extends BaseController { + + @Autowired + private FavorService favorService; + + /** + * 添加收藏记录 + */ + @PostMapping("/add") + @OperationLog(name = "添加收藏记录", type = OperationLogType.ADD) + @ApiOperation(value = "添加收藏记录", response = ApiResult.class) + public ApiResult addFavor(@Validated(Add.class) @RequestBody Favor favor) throws Exception { + boolean flag = favorService.saveFavor(favor); + return ApiResult.result(flag); + } + + /** + * 修改收藏记录 + */ + @PostMapping("/update") + @OperationLog(name = "修改收藏记录", type = OperationLogType.UPDATE) + @ApiOperation(value = "修改收藏记录", response = ApiResult.class) + public ApiResult updateFavor(@Validated(Update.class) @RequestBody Favor favor) throws Exception { + boolean flag = favorService.updateFavor(favor); + return ApiResult.result(flag); + } + + /** + * 删除收藏记录 + */ + @PostMapping("/delete") + @OperationLog(name = "删除收藏记录", type = OperationLogType.DELETE) + @ApiOperation(value = "删除收藏记录", response = ApiResult.class) + public ApiResult deleteFavor(@RequestBody Favor favor) throws Exception { + boolean flag = favorService.deleteFavor(favor); + return ApiResult.result(flag); + } + + /** + * 获取收藏记录详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "收藏记录详情", type = OperationLogType.INFO) + @ApiOperation(value = "收藏记录详情", response = Favor.class) + public ApiResult getFavor(@PathVariable Long id) throws Exception { + Favor favor = favorService.getById(id); + return ApiResult.ok(favor); + } + + /** + * 收藏记录分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "收藏记录分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "收藏记录分页列表", response = Favor.class) + public ApiResult> getFavorPageList(@Validated @RequestBody FavorPageParam favorPageParam) throws Exception { + Paging paging = favorService.getFavorPageList(favorPageParam); + return ApiResult.ok(paging); + } + +} + diff --git a/example/src/main/java/com/example/favorite/entity/Favor.java b/example/src/main/java/com/example/favorite/entity/Favor.java new file mode 100644 index 0000000..85eec3b --- /dev/null +++ b/example/src/main/java/com/example/favorite/entity/Favor.java @@ -0,0 +1,70 @@ +package com.example.favorite.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.util.Date; + +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import io.geekidea.boot.framework.core.validator.groups.Update; +import io.geekidea.boot.framework.core.validator.groups.Add; + +/** + * 收藏记录 + * + * @author limg + * @since 2021-02-12 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("p_favor") +@ApiModel(value = "Favor对象") +public class Favor extends BaseEntity { + private static final long serialVersionUID = 1L; + + @NotNull(message = "id不能为空", groups = {Update.class}) + @ApiModelProperty("编号") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("用户编号") + @TableField("USER_ID") + private Integer userId; + + @ApiModelProperty("试卷编号") + @TableField("PAPER_ID") + private Integer paperId; + + @ApiModelProperty("试题编号") + @TableField("QUESTION_ID") + @NotNull(message = "试题编号不能为空", groups = {Add.class, Update.class}) + private Integer questionId; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + private Integer revision; + + @ApiModelProperty("创建人") + @TableField(value = "CREATED_BY", fill = FieldFill.INSERT) + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE) + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/example/src/main/java/com/example/favorite/mapper/FavorMapper.java b/example/src/main/java/com/example/favorite/mapper/FavorMapper.java new file mode 100644 index 0000000..e7c6eee --- /dev/null +++ b/example/src/main/java/com/example/favorite/mapper/FavorMapper.java @@ -0,0 +1,24 @@ +package com.example.favorite.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.favorite.entity.Favor; +import com.example.favorite.param.FavorPageParam; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import java.io.Serializable; + +/** + * 收藏记录 Mapper 接口 + * + * @author limg + * @since 2021-02-12 + */ +@Repository +public interface FavorMapper extends BaseMapper { + + +} diff --git a/example/src/main/java/com/example/favorite/param/FavorPageParam.java b/example/src/main/java/com/example/favorite/param/FavorPageParam.java new file mode 100644 index 0000000..f85a220 --- /dev/null +++ b/example/src/main/java/com/example/favorite/param/FavorPageParam.java @@ -0,0 +1,23 @@ +package com.example.favorite.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; + +/** + *
+ * 收藏记录 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-12 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "收藏记录分页参数") +public class FavorPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/favorite/service/FavorService.java b/example/src/main/java/com/example/favorite/service/FavorService.java new file mode 100644 index 0000000..0631a4d --- /dev/null +++ b/example/src/main/java/com/example/favorite/service/FavorService.java @@ -0,0 +1,53 @@ +package com.example.favorite.service; + +import com.example.favorite.entity.Favor; +import com.example.favorite.param.FavorPageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +/** + * 收藏记录 服务类 + * + * @author limg + * @since 2021-02-12 + */ +public interface FavorService extends BaseService { + + /** + * 保存 + * + * @param favor + * @return + * @throws Exception + */ + boolean saveFavor(Favor favor) throws Exception; + + /** + * 修改 + * + * @param favor + * @return + * @throws Exception + */ + boolean updateFavor(Favor favor) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteFavor(Favor favor) throws Exception; + + + /** + * 获取分页对象 + * + * @param favorQueryParam + * @return + * @throws Exception + */ + Paging getFavorPageList(FavorPageParam favorPageParam) throws Exception; + +} diff --git a/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java b/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java new file mode 100644 index 0000000..993b470 --- /dev/null +++ b/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java @@ -0,0 +1,65 @@ +package com.example.favorite.service.impl; + +import com.example.favorite.entity.Favor; +import com.example.favorite.mapper.FavorMapper; +import com.example.favorite.service.FavorService; +import com.example.favorite.param.FavorPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 收藏记录 服务实现类 + * + * @author limg + * @since 2021-02-12 + */ +@Slf4j +@Service +public class FavorServiceImpl extends BaseServiceImpl implements FavorService { + + @Autowired + private FavorMapper favorMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + @Cacheable(cacheNames = "Favorite", key = "#favor.userId + '_' + #favor.questionId") + public boolean saveFavor(Favor favor) throws Exception { + return super.save(favor); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateFavor(Favor favor) throws Exception { + return super.updateById(favor); + } + + @Transactional(rollbackFor = Exception.class) + @Override + @CacheEvict(cacheNames = "Favorite", key = "#favor.userId + '_' + #favor.questionId") + public boolean deleteFavor(Favor favor) throws Exception { + return super.remove(lambdaQuery() + .eq(Favor::getUserId, favor.getUserId()) + .eq(Favor::getQuestionId, favor.getQuestionId()) + ); + } + + @Override + public Paging getFavorPageList(FavorPageParam favorPageParam) throws Exception { + Page page = new PageInfo<>(favorPageParam, OrderItem.desc(getLambdaColumn(Favor::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = favorMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + +} diff --git a/example/src/main/java/com/example/paper/controller/PaperController.java b/example/src/main/java/com/example/paper/controller/PaperController.java index 885d0d8..8883238 100644 --- a/example/src/main/java/com/example/paper/controller/PaperController.java +++ b/example/src/main/java/com/example/paper/controller/PaperController.java @@ -2,6 +2,7 @@ package com.example.paper.controller; import com.example.paper.entity.Paper; import com.example.paper.service.PaperService; +import com.example.paper.vo.PaperAppVo; import com.example.paper.vo.PaperQueryVo; import io.geekidea.boot.framework.common.api.ApiResult; import io.geekidea.boot.framework.common.controller.BaseController; @@ -23,6 +24,8 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 试卷实体 控制器 * @@ -105,5 +108,13 @@ public class PaperController extends BaseController { return ApiResult.ok(paging); } + @GetMapping("/wechat/getOpenPaper") + @OperationLog(name = "获取开放试卷分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "获取开放试卷分页列表", response = Paper.class) + public ApiResult> getOpenPaperList(@RequestParam("categoryCode") String code) throws Exception { + List list = paperService.getOpenPaperList(code); + return ApiResult.ok(list); + } + } diff --git a/example/src/main/java/com/example/paper/entity/Paper.java b/example/src/main/java/com/example/paper/entity/Paper.java index 3519244..c1c5caa 100644 --- a/example/src/main/java/com/example/paper/entity/Paper.java +++ b/example/src/main/java/com/example/paper/entity/Paper.java @@ -54,7 +54,7 @@ public class Paper extends Model { @ApiModelProperty("所属分类") @TableField("CATEGORY_ID") - private Integer categoryId; + private String categoryId; @ApiModelProperty("乐观锁") @TableField("REVISION") diff --git a/example/src/main/java/com/example/paper/mapper/PaperMapper.java b/example/src/main/java/com/example/paper/mapper/PaperMapper.java index a36fc9d..9772c6d 100644 --- a/example/src/main/java/com/example/paper/mapper/PaperMapper.java +++ b/example/src/main/java/com/example/paper/mapper/PaperMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.paper.entity.Paper; import com.example.paper.param.PaperPageParam; +import com.example.paper.vo.PaperAppVo; import com.example.paper.vo.PaperQueryVo; import org.springframework.stereotype.Repository; @@ -11,6 +12,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import java.io.Serializable; +import java.util.List; /** * 试卷实体 Mapper 接口 @@ -29,4 +31,6 @@ public interface PaperMapper extends BaseMapper { * @return */ IPage getPaperPageList(@Param("page") Page page, @Param("param") PaperPageParam paperPageParam); + + List getOpenPaperList(@Param("userId") Long userId, @Param("code") String code); } diff --git a/example/src/main/java/com/example/paper/service/PaperService.java b/example/src/main/java/com/example/paper/service/PaperService.java index daed25c..7128221 100644 --- a/example/src/main/java/com/example/paper/service/PaperService.java +++ b/example/src/main/java/com/example/paper/service/PaperService.java @@ -2,10 +2,13 @@ package com.example.paper.service; import com.example.paper.entity.Paper; import com.example.paper.param.PaperPageParam; +import com.example.paper.vo.PaperAppVo; import com.example.paper.vo.PaperQueryVo; import io.geekidea.boot.framework.common.service.BaseService; import io.geekidea.boot.framework.core.pagination.Paging; +import java.util.List; + /** * 试卷实体 服务类 * @@ -51,4 +54,6 @@ public interface PaperService extends BaseService { */ Paging getPaperPageList(PaperPageParam paperPageParam) throws Exception; + List getOpenPaperList(String code) throws Exception; + } diff --git a/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java b/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java index 29392c1..187fb6d 100644 --- a/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java +++ b/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java @@ -5,6 +5,7 @@ import com.example.paper.mapper.PaperMapper; import com.example.paper.service.PaperService; import com.example.paper.param.PaperPageParam; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.paper.vo.PaperAppVo; import com.example.paper.vo.PaperQueryVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; @@ -12,11 +13,14 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; import io.geekidea.boot.framework.core.pagination.PageInfo; import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.util.LoginUtil; import org.springframework.transaction.annotation.Transactional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; + /** * 试卷实体 服务实现类 * @@ -57,4 +61,10 @@ public class PaperServiceImpl extends BaseServiceImpl implem return new Paging(iPage); } + @Override + public List getOpenPaperList(String code) throws Exception { + Long userId = LoginUtil.getUserId(); + return paperMapper.getOpenPaperList(userId, code); + } + } diff --git a/example/src/main/java/com/example/paper/vo/PaperAppVo.java b/example/src/main/java/com/example/paper/vo/PaperAppVo.java new file mode 100644 index 0000000..b5a9142 --- /dev/null +++ b/example/src/main/java/com/example/paper/vo/PaperAppVo.java @@ -0,0 +1,38 @@ +package com.example.paper.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@Accessors(chain = true) +@ApiModel(value = "PaperAppVo对象", description = "小程序试卷对象") +public class PaperAppVo implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("试卷名称") + private String paperName; + + @ApiModelProperty("价格") + private BigDecimal price; + + @ApiModelProperty("试题数量") + private Integer count; + + @ApiModelProperty("记录编号") + private Long recordId; + + @ApiModelProperty("当前进度") + private Integer progress; + + @ApiModelProperty("正确数量") + private Integer correctCount; + +} diff --git a/example/src/main/java/com/example/paper/vo/PaperQueryVo.java b/example/src/main/java/com/example/paper/vo/PaperQueryVo.java index 4a7295d..d11795f 100644 --- a/example/src/main/java/com/example/paper/vo/PaperQueryVo.java +++ b/example/src/main/java/com/example/paper/vo/PaperQueryVo.java @@ -30,7 +30,7 @@ public class PaperQueryVo implements Serializable { private BigDecimal price; @ApiModelProperty("所属分类") - private Integer categoryId; + private String categoryId; @ApiModelProperty("试题数量") private Integer count; diff --git a/example/src/main/resources/mapper/favorite/FavorMapper.xml b/example/src/main/resources/mapper/favorite/FavorMapper.xml new file mode 100644 index 0000000..b426f97 --- /dev/null +++ b/example/src/main/resources/mapper/favorite/FavorMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/example/src/main/resources/mapper/paper/PaperMapper.xml b/example/src/main/resources/mapper/paper/PaperMapper.xml index 933f20c..5121031 100644 --- a/example/src/main/resources/mapper/paper/PaperMapper.xml +++ b/example/src/main/resources/mapper/paper/PaperMapper.xml @@ -17,4 +17,25 @@ and a.paper_name like concat('%', #{param.name} ,'%') + diff --git a/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtFilter.java b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtFilter.java index 28d7307..b7ea1d5 100644 --- a/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtFilter.java +++ b/framework/src/main/java/io/geekidea/boot/framework/shiro/jwt/JwtFilter.java @@ -16,6 +16,7 @@ package io.geekidea.boot.framework.shiro.jwt; +import cn.hutool.core.util.ObjectUtil; import io.geekidea.boot.config.properties.JwtProperties; import io.geekidea.boot.framework.common.api.ApiCode; import io.geekidea.boot.framework.common.api.ApiResult; @@ -23,6 +24,7 @@ import io.geekidea.boot.framework.shiro.cache.LoginRedisService; import io.geekidea.boot.framework.shiro.service.ShiroLoginService; import io.geekidea.boot.framework.shiro.util.JwtTokenUtil; import io.geekidea.boot.framework.shiro.util.JwtUtil; +import io.geekidea.boot.framework.shiro.util.SaltUtil; import io.geekidea.boot.framework.util.HttpServletResponseUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -89,6 +91,9 @@ public class JwtFilter extends AuthenticatingFilter { String salt; if (jwtProperties.isSaltCheck()){ salt = loginRedisService.getSalt(username); + if (salt == null) { + salt = SaltUtil.getSalt("666", jwtProperties); + } }else{ salt = jwtProperties.getSecret(); } @@ -133,6 +138,17 @@ public class JwtFilter extends AuthenticatingFilter { return true; } boolean allowed = false; +// String type = WebUtils.toHttp(request).getHeader("type"); +// if ("wechat".equals(type)){ +// String token = WebUtils.toHttp(request).getHeader("token"); +// if (ObjectUtil.isEmpty(token)){ +// return false; +// } +// log.info("token:{}",token); +// String newSalt = SaltUtil.getSalt("666", jwtProperties); +// return JwtUtil.verifyToken(token,newSalt); +// } + try { allowed = executeLogin(request, response); } catch (IllegalStateException e) { //not found any token diff --git a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java index 0674617..07f6bdb 100644 --- a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java +++ b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java @@ -45,14 +45,14 @@ public class SpringBootPlusGenerator { // 设置基本信息 generatorProperties - .setMavenModuleName("wechat") - .setParentPackage("com.koronol") - .setModuleName("profile") + .setMavenModuleName("example") + .setParentPackage("com.example") + .setModuleName("favorite") .setAuthor("limg") .setFileOverride(true); // 设置表信息 - generatorProperties.addTable("p_profile","id"); + generatorProperties.addTable("p_test","id"); // 设置表前缀 generatorProperties.setTablePrefix(Arrays.asList("p_")); diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java index 22d5e32..e53499c 100644 --- a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java @@ -1,24 +1,31 @@ package com.koronol.profile.controller; +import cn.hutool.http.HttpUtil; import com.koronol.profile.entity.Profile; +import com.koronol.profile.param.ProfileQueryParam; import com.koronol.profile.service.ProfileService; +import com.koronol.profile.vo.ProfileTokenVo; import lombok.extern.slf4j.Slf4j; import com.koronol.profile.param.ProfilePageParam; import io.geekidea.boot.framework.common.controller.BaseController; import io.geekidea.boot.framework.common.api.ApiResult; import io.geekidea.boot.framework.core.pagination.Paging; -import io.geekidea.boot.framework.common.param.IdParam; import io.geekidea.boot.framework.log.annotation.Module; import io.geekidea.boot.framework.log.annotation.OperationLog; import io.geekidea.boot.framework.log.enums.OperationLogType; import io.geekidea.boot.framework.core.validator.groups.Add; import io.geekidea.boot.framework.core.validator.groups.Update; +import org.springframework.beans.factory.annotation.Value; import org.springframework.validation.annotation.Validated; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + /** * 用户信息 控制器 * @@ -27,7 +34,7 @@ import org.springframework.web.bind.annotation.*; */ @Slf4j @RestController -@RequestMapping("/profile") +@RequestMapping("/wechat/profile") @Module("profile") @Api(value = "用户信息API", tags = {"用户信息"}) public class ProfileController extends BaseController { @@ -90,5 +97,16 @@ public class ProfileController extends BaseController { return ApiResult.ok(paging); } + @PostMapping("/signIn") + @OperationLog(name = "小程序用户登录", type = OperationLogType.OTHER) + @ApiOperation(value = "微信小程序用户登录", response = Profile.class) + public ApiResult signIn(@Validated @RequestBody ProfileQueryParam profileQueryParam) throws Exception { + + ProfileTokenVo profileTokenVo = profileService.signIn(profileQueryParam); + + //JSONObject obj= JSON.parseObject(response);//将json字符串转换为json对 + return ApiResult.ok(profileTokenVo); + } + } diff --git a/wechat/src/main/java/com/koronol/profile/entity/Profile.java b/wechat/src/main/java/com/koronol/profile/entity/Profile.java index ce38b83..b18b9d6 100644 --- a/wechat/src/main/java/com/koronol/profile/entity/Profile.java +++ b/wechat/src/main/java/com/koronol/profile/entity/Profile.java @@ -1,12 +1,10 @@ package com.koronol.profile.entity; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.*; + import java.util.Date; -import com.baomidou.mybatisplus.annotation.Version; -import com.baomidou.mybatisplus.annotation.TableId; + import io.geekidea.boot.framework.common.entity.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -72,19 +70,19 @@ public class Profile extends BaseEntity { private Integer revision; @ApiModelProperty("创建人") - @TableField("CREATED_BY") + @TableField(value = "CREATED_BY", fill = FieldFill.INSERT) private String createdBy; @ApiModelProperty("创建时间") - @TableField("CREATED_TIME") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) private Date createdTime; @ApiModelProperty("更新人") - @TableField("UPDATED_BY") + @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE) private String updatedBy; @ApiModelProperty("更新时间") - @TableField("UPDATED_TIME") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) private Date updatedTime; } diff --git a/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java b/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java index b2f9f5f..cdad911 100644 --- a/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java +++ b/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java @@ -20,5 +20,6 @@ import java.io.Serializable; @Repository public interface ProfileMapper extends BaseMapper { - + @Override + int insert(Profile entity); } diff --git a/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java b/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java new file mode 100644 index 0000000..3ab668d --- /dev/null +++ b/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java @@ -0,0 +1,26 @@ +package com.koronol.profile.param; + +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "用户登录参数") +public class ProfileQueryParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("code") + private String code; + + @ApiModelProperty("昵称") + private String nickName; + + @ApiModelProperty("头像") + private String avatarUrl; + +} diff --git a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java index bfa6639..f7fea84 100644 --- a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java +++ b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java @@ -2,6 +2,8 @@ package com.koronol.profile.service; import com.koronol.profile.entity.Profile; import com.koronol.profile.param.ProfilePageParam; +import com.koronol.profile.param.ProfileQueryParam; +import com.koronol.profile.vo.ProfileTokenVo; import io.geekidea.boot.framework.common.service.BaseService; import io.geekidea.boot.framework.core.pagination.Paging; @@ -50,4 +52,6 @@ public interface ProfileService extends BaseService { */ Paging getProfilePageList(ProfilePageParam profilePageParam) throws Exception; + ProfileTokenVo signIn(ProfileQueryParam profileQueryParam) throws Exception; + } diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index 87c9641..6c97e7b 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -1,21 +1,47 @@ package com.koronol.profile.service.impl; +import cn.hutool.core.convert.Convert; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.koronol.profile.entity.Profile; import com.koronol.profile.mapper.ProfileMapper; +import com.koronol.profile.param.ProfileQueryParam; import com.koronol.profile.service.ProfileService; import com.koronol.profile.param.ProfilePageParam; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.koronol.profile.vo.ProfileTokenVo; +import io.geekidea.boot.config.properties.JwtProperties; +import io.geekidea.boot.config.properties.SpringBootPlusProperties; import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; import io.geekidea.boot.framework.core.pagination.Paging; import io.geekidea.boot.framework.core.pagination.PageInfo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.geekidea.boot.framework.shiro.cache.LoginRedisService; +import io.geekidea.boot.framework.shiro.jwt.JwtToken; +import io.geekidea.boot.framework.shiro.util.JwtUtil; +import io.geekidea.boot.framework.shiro.util.SaltUtil; +import io.geekidea.boot.framework.util.LoginUtil; +import javafx.beans.property.LongPropertyBase; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.transaction.annotation.Transactional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + /** * 用户信息 服务实现类 * @@ -29,6 +55,20 @@ public class ProfileServiceImpl extends BaseServiceImpl @Autowired private ProfileMapper profileMapper; + @Value("${wechat.appId}") + private String appId; + + @Value("${wechat.secret}") + private String secret; + + @Lazy + @Autowired + private JwtProperties jwtProperties; + + @Lazy + @Autowired + private SpringBootPlusProperties springBootPlusProperties; + @Transactional(rollbackFor = Exception.class) @Override public boolean saveProfile(Profile profile) throws Exception { @@ -55,4 +95,54 @@ public class ProfileServiceImpl extends BaseServiceImpl return new Paging(iPage); } + @Override + public ProfileTokenVo signIn(ProfileQueryParam profileQueryParam) throws Exception { + Map data = new HashMap(); + data.put("appid", appId); + data.put("secret", secret); + data.put("js_code", profileQueryParam.getCode()); + data.put("grant_type", "authorization_code"); + String result = HttpUtil.get("https://api.weixin.qq.com/sns/jscode2session", data); + JSONObject response = JSONUtil.parseObj(result); + if (response.get("errcode") != null && !response.get("errcode").equals(0)) { + throw new AuthenticationException(response.getStr("errmsg")); + } + String openId = response.getStr("openid"); + Profile profile = profileMapper.selectOne(new LambdaQueryWrapper().eq(Profile::getOpenId, openId)); + if (profile == null) { + profile = new Profile(); + } + profile.setOpenId(openId); + profile.setAvatarUrl(profileQueryParam.getAvatarUrl()); + profile.setNickName(profileQueryParam.getNickName()); + // 获取数据库中保存的盐值 + String newSalt = SaltUtil.getSalt("666", jwtProperties); + + if (profile.getId() == null) { + profileMapper.insert(profile); + } else { + profileMapper.updateById(profile); + } + // 生成token字符串并返回 + Long expireSecond = jwtProperties.getExpireSecond(); + String token = JwtUtil.generateToken(profile.getId().toString(), newSalt, Duration.ofSeconds(expireSecond)); + ProfileTokenVo profileTokenVo = Convert.convert(ProfileTokenVo.class, profile); + profileTokenVo.setToken(token); + + // 创建AuthenticationToken + JwtToken jwtToken = JwtToken.build(token, profile.getId().toString(), newSalt, expireSecond); + + boolean enableShiro = springBootPlusProperties.getShiro().isEnable(); + if (enableShiro) { + // 从SecurityUtils里边创建一个 subject + Subject subject = SecurityUtils.getSubject(); + // 执行认证登录 + subject.login(jwtToken); + } else { + log.warn("未启用Shiro"); + } + + return profileTokenVo; + } + } diff --git a/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java b/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java new file mode 100644 index 0000000..4551b29 --- /dev/null +++ b/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java @@ -0,0 +1,46 @@ +package com.koronol.profile.vo; + + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +@Data +@Accessors(chain = true) +@ApiModel(value = "ProfileVo对象", description = "小程序用户对象") +public class ProfileTokenVo implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("用户昵称") + private String nickName; + + @ApiModelProperty("openId") + private String openId; + + @ApiModelProperty("手机号") + private String phone; + + @ApiModelProperty("头像") + private String avatarUrl; + + @ApiModelProperty("状态 0-正常,1-冻结") + private String status; + + @ApiModelProperty("是否会员") + private String isVip; + + @ApiModelProperty("会员有效期") + private Date valid; + + @ApiModelProperty("token") + private String token; + +} diff --git a/wechat/src/main/resources/mapper/profile/ProfileMapper.xml b/wechat/src/main/resources/mapper/profile/ProfileMapper.xml index 73580c6..365fb8e 100644 --- a/wechat/src/main/resources/mapper/profile/ProfileMapper.xml +++ b/wechat/src/main/resources/mapper/profile/ProfileMapper.xml @@ -1,5 +1,8 @@ - + + insert into p_profile (name, phone, open_id, nick_name, avatar_url) + values (#{name}, #{phone}, #{openId}, #{nickName}, #{avatarUrl}) + diff --git a/wechat/target/classes/com/koronol/profile/controller/ProfileController.class b/wechat/target/classes/com/koronol/profile/controller/ProfileController.class index acb4c227afe018ee42db28c224d74b6c1caa931c..7774cab6fb1693a75cebf9dffae9cba908ad88cb 100644 GIT binary patch delta 1683 zcmb`HNmEln5Xb-XG1fepx=Va7~oQn4}*Ld5;4rxBYbg%4_8H8v*0>zaKD=(Zhfrz$yjJANAQalW3ao^ zU+rgTmp$SpgJ;M$a8>?pDoQG0i0vN;T+BMV0 zK#$Mg9AL=ib_v4)cfI-#ZG%i7E(=sFe=^3OUTIfKmZDpSOIY|Yu{im7VRmBi#pLe? z(~GaZEPQ>*V5n=Xs%&6LUYL9LYyQouR`Lt;TT_gC#MjZ~9h6Hg_gslsCm{|_5u*~u zFfQV@ggdw^p$Ov=_Tip{`*^^RDUX>l<0L%9BMG&5ETIKY7z#)oFSoK3hlr;Vo?$|Q z1F;Mxvd5Mxzcw1CLRO=|n)ykkh&<);q{OZ`tUPXO=#{9lfPfABSBgZ0V2CH#NOJ{9I0v4++T&7MnXNGCrld1WAztT)mATGC`;Gf4urD1iComrdH7Hn1Ra;i8?qAo8)* zhiwE}K{oI)8xxts8X~NXLRgA2I$87_mame-13F=aN_bEwtXLwH5_tn0;yDbWl%`4z zt>2LqQQjul(Hw#1442nQUL4I%2jYcZS>D58v?Dx>Qr;>Zty)E^(b1|oTDnr+6==0M zs$?xUHZp7Nlof9TT4d)P!*L49vsQ0>pAvDp*G=s_+iMPc>FWRNi(ob!OkBC7JeMcK(|;x2Pp+y f(1NdpkJcB-Of7OJy0{#qzUU@15-y=fDSz)jsVel( delta 1259 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 Z$pR#q7+4wDz%)Ap2ask1%5yR>003lh3MK#m diff --git a/wechat/target/classes/com/koronol/profile/param/ProfileQueryParam.class b/wechat/target/classes/com/koronol/profile/param/ProfileQueryParam.class new file mode 100644 index 0000000000000000000000000000000000000000..9e9a7d2c41f3fde019b62606b630902051f5317a GIT binary patch literal 2719 zcmb7G-*XdH6#j0qo82ZG2$dG1prBRTrey^YC8b~~poO*+O3M!s*``anG~KP64Gc3r z;frs)$e=zu)(0MN2HF`J9eu$W|Bu2yA>wy;w@qj>BXruk=bj(;eD{3kp6TEJ{`xzB zy(p*Ajm6?K@Uw()O#4=S~bA5fH}(vV)#m4Ja@tUkO?^4GU0 z9B^DGI4F?p?3yIT!4TudVaK&cYjab!f5svniP|git`=|1eXLZ18HWIShfCg^IqUhJ z>s8Eo-@D>eY;)f7tvQp}_HT?y4MA#UJBadZ?(Aw-jSL+|S1(|2H&BPJRac@1 zI@bqxy(E?lPisiUT|+88@FIp-C;Q8qRpDjZ8k3%!x@wn#zOD~bHB7S$N|t+6;-)xb zRcE52lj$MC8aq8Sa+J6!r+m9ws{~ZWkXkzG+0z{jdD7!v%`e%kI&yc())v_L ze;vyvXnpeS&yT-Zdh-3l<=<{E-@5tu_B{h{;~fLru-(8;xx9t#0$bKTm%}xuGA%2* zWnKPGS>ApFHm(@xL9aljXUED_sNW@3M$eAb8&PLUo#-++G$<5aqLmE{VxNHzu#eR? za0D!8Ki_KEwr8Db+cKv-FEFpL>Fw*DKWmmeUp|YnA zZyR+G*|Fy5ZI^WRHnv_oI@Z6RxIBF*SgWm1%TQHX;XfqrjbzEOC84 z_&yT%)&#dU4JMyWf|F~5+nNTG_$I;1+Tg8CgWtpMIJl3+Nf52pU3h>*_uBC2*6oo? zd}}(#3<&ILeo*p-4~iHQc)$5U$_pP9F)ZXeh_7~us3o0yA3{C9gjB1x2)%m|E&Q~m zBRL~wBa*XH-oRxM8=Kc5Vt?-{`+Pf5E-}blEzEVN(ESrsv)oHr&L1Hh6*)$3c<0 zB+FVtA0-8+a0~}1sW^*|(N8IbYkYYJDQWl$ui+3Soi^}!WHtRCY|t>!@)YeF4)a$R zPq8%;TN*{4&50C~x1V3xm#VC!gr8UkKk7<#6~0Q)626eLEILN)W?YKV=W=}q_^LPe zOa4c<<@#n=bUjyCfY!T+w#!nVDJs&CS7M7UsfbM3q8ggWLKvjy)zGx9d0`JmIb&o= zOt5615Rr~Cd`c;SEKXpEXp#?gsRp;Y=UOeD32rzn_sHsi9VK)Q*pvSOaPkUP literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/profile/service/ProfileService.class b/wechat/target/classes/com/koronol/profile/service/ProfileService.class index 52a303290f42b0dccbf66c023fb4c6161d9c5524..cfb621a53c93976c0d35b429bf7a17bd9f012c2d 100644 GIT binary patch delta 146 zcmdnYwwzt~)W2Q(7#J8#7$n#kMA#Wb*%`zp3cE9kZ;WSs*_b&%h=GZL P7pRVjfuBJDObY@4xF8Ax diff --git a/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class b/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class index a788a0b4fbf00a197240191c20c6914a1d98a430..c533d8db856e2eebebec5e4907de0826b119a51c 100644 GIT binary patch literal 10034 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 delta 1472 zcmbVM+gDUo82_C!3}-m(@XV2!0cD06=psXMF%qPRjHpb+3bKr(4ln_Vh=3MZjhdld zBy4vhD~T@Tr2&x(lh5bw1c+$X zyErCLf^iLNZ&i11rwaJMz=r}KVUkq{ ze2n87vN~gfb^S4CFxJuBy*(yyLRE7T#|2JdQkGiPJ_DZ!e2Pg8Zl|xWXGq{PTJ~5` z15-*{ApbB5+yc|oervT5mEg1tdn*NI1U|YOrd;%es8$G&(UFcIxfdZeP&u9c`_mNoQFBd<=>l0|eA*Uc@+(%Ml&cuR5{c`+QgqNJk# zmo$~L7PtOe>1qEgz4Y(9tWKO<)xH+Dv9$lJJ+)08ZdcpL!;$(#={8TQp16;_3-VY| z_CR&Ef?ZWK*;$3^aR>AJkdHfY7dsb30PAo!vqkyd*Q0@%HZUekP137z(QD(P*FE$~ z)fi`k?`43F`z#YpXl8nKb>Gujy|&TlEUX5-rg#?Kla%wgwDS``93%G@+x9G$j`3aA zdR(qwr3pm|g@>h(mUM0%y## zt(ZE8@Mb$Qhk^@C?7Cu#auc0O&fqBS$0phz;L1YUZ^$$7pk`+O!XA0BIXT0$MN%bZ z*o7@;arF$YnWmQi2vRlmKrTCP^gNFRd`a(i$`<7g#>Ma$ JI?;vhKLM79?3n-n diff --git a/wechat/target/classes/com/koronol/profile/vo/ProfileTokenVo.class b/wechat/target/classes/com/koronol/profile/vo/ProfileTokenVo.class new file mode 100644 index 0000000000000000000000000000000000000000..c615ba7c9423aebccc8fdb9b805c3dae06b15672 GIT binary patch literal 5671 zcmb_gU364e75>g-e(ucNB$LSx3{VU*6!O=!)mpiMY6=vCNkD$0t$!VoA-QBSlg>=2 zMYOGGg;EU&wTReSTLCLApb&m_>4SAGpM2<(zUW#_&1t4g6Goo|WQF18*5P zXW+bn3kH5>;O7P|8n|R&O6o5Ma3z4N0+C!YYbR0z$!yNfq<8eJ7Z95Ss@G-GxqKp> zA4sGol0HTz{}Tcpdx%E8yAyj7ovB26xU)Bt9_|u|ZJkKx?Xl#5owIkQlHKWaCZEXD zWlo@_*Uoh2o=gl6C$pW2qNcNZ-0sT^B~x3nnek*c{}lcB_Q)?3@V|TI`d^Q|C19lO z!O{N27}ugDU%M@zwVf|EZyq}{bKvsK@k=*PpQjx?rF*zX-}p!-O{3tn>?u`@EM~KufC-O-~QmZ&KClAiNcwpw_D1XC#E%?$Er5qT#V#O7vK z_6}yoI!80vOgfY59M5KU*{Njbo=himDdBecRRbBB(cxrXCM3G5r6hm)*uqry&nCEG z4rMmQL6SD>v>L=)RAx=W?qWhEYnx7`Wc8?oNys9SNt)e3X_}BCngdp zo_%9!RGWA1P7da~S{`HLX6E*YRxz=e{75n@5RkPKmq%eZD-Nu77K>e0qg2I(utO;H zm8sN)$B?7cy%ttF{Z!+qN?NW~sY_Or>p}x+*M&#rTKAoHt)G;Nqe8}_Rr*P(bf;;R zeyZj%4UYCD#+_E;)a4LlDh3nj4KlNYBZ=II>PEI^4->a#Yfs+>W|r8WP39(2d3LRn zwqU%Np+LNl4u4z+ABvZR8Hg8R^2c=q{H?diYEmC|+ zimg&?lVUq|m>7`gt9V*qLGjK}d3t!lP7TSjj?T@{DtlA7O|xRKZVQ>t%=wP7XFw`klpUe1h0i1oU7NpMYRsl^G4_@lFLE_zGr1W1%8l=GHD(jK82ihOn_Z3B zye`Ipa^vN$#%y{QW24;oZdYRt3m4;Hxp9lDF^7zcaj4w5-PQQh_>4A|RqbJI1X|lJ z!P8o9u4=4FQFM)wth-R)Q9S16sH$Q|s%r&4>+Z-~u_M*x0-tkt_|;1fya?>JGEfNj?`2W*y+BbP{oea6cqAmRXg(h zp0(DIsUg1J&o#^FXk^HMXUfx5zB}LB+1aEK+Gs1)mcH3>a0*KC`lnr z3dTYuq^K1pDQcOquq2t9L{vhmx2j31w`yY5l2oHf)v=lqQiD}XQiBzV)k;!ClWJp; z5>lg8M^d8|jnzp~RFmpr(GpUVRZmir)ex(fqy|l@k2MrX-m~ogDwJO=@2F!aG`$!_ z61#XvjbZ@9ylgy(i;WoJS`}JFH*6v=Hi|fQ6Zz05mSU91j}&h4Zx_c#7XQW=k%1%l z1JXo6yo7g_IGsJsXs9^B_ z3z-zYLh627%}+UQeX^`&-aYg3u7<6zkauQsm^+v60eq!YZmN#c&ZPCfB3)~|Yn@hD z66qRYBN&mk(+G4-VZq~az1H$dMa-);hHMX|ida5J#m;byjF_*WswB+6>SwLsOl}lQ5mx;HjuJvu!4??y`!yy1y!RJa#W#N6+22}5Ph%x{oH}1U77Fes_5;`JUV2#@mH1VQk-JR$+!1?*Rk-?%ZNo6O<}QY)+sEB z-lcFYKcY(&=4@Xa{eZ%C5;rT%alSaZOyPQoKd3M#_~Phtg&U>MxWY|xeFeo7?sk8n iQ$HH^=~nUJTh1i - + + insert into p_profile (name, phone, open_id, nick_name, avatar_url) + values (#{name}, #{phone}, #{openId}, #{nickName}, #{avatarUrl}) + -- Gitee From 5a0e9e1699a60c7e4d475a9989c1b3566a74e0e4 Mon Sep 17 00:00:00 2001 From: limingguang Date: Sun, 14 Feb 2021 21:51:48 +0800 Subject: [PATCH 08/36] commit userPaper code --- .../config/SpringBootPlusWebMvcConfig.java | 25 +++++ .../favorite/controller/FavorController.java | 6 +- .../favorite/service/FavorService.java | 6 +- .../service/impl/FavorServiceImpl.java | 14 +-- .../com/example/paper/mapper/PaperMapper.java | 2 +- .../paper/service/impl/PaperServiceImpl.java | 2 +- .../controller/QuestionController.java | 5 +- .../com/example/question/entity/Question.java | 2 +- .../question/mapper/QuestionMapper.java | 12 ++- .../question/param/QuestionPageParam.java | 4 + .../question/service/QuestionService.java | 5 +- .../service/impl/QuestionServiceImpl.java | 11 +- .../example/question/vo/QuestionPageVo.java | 55 ++++++++++ .../controller/UserPaperController.java | 94 ++++++++++++++++++ .../example/userPaper/entity/UserPaper.java | 80 +++++++++++++++ .../userPaper/mapper/UserPaperMapper.java | 24 +++++ .../userPaper/param/UserPaperPageParam.java | 23 +++++ .../userPaper/service/UserPaperService.java | 53 ++++++++++ .../service/impl/UserPaperServiceImpl.java | 62 ++++++++++++ .../mapper/question/QuestionMapper.xml | 25 +++++ .../mapper/userPaper/UserPaperMapper.xml | 5 + .../boot/framework/util/LoginUtil.java | 11 ++ .../generator/SpringBootPlusGenerator.java | 4 +- .../profile/controller/ProfileController.java | 2 +- .../service/impl/ProfileServiceImpl.java | 5 + .../controller/ProfileController.class | Bin 5423 -> 5416 bytes .../service/impl/ProfileServiceImpl.class | Bin 10034 -> 10128 bytes 27 files changed, 509 insertions(+), 28 deletions(-) create mode 100644 example/src/main/java/com/example/question/vo/QuestionPageVo.java create mode 100644 example/src/main/java/com/example/userPaper/controller/UserPaperController.java create mode 100644 example/src/main/java/com/example/userPaper/entity/UserPaper.java create mode 100644 example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java create mode 100644 example/src/main/java/com/example/userPaper/param/UserPaperPageParam.java create mode 100644 example/src/main/java/com/example/userPaper/service/UserPaperService.java create mode 100644 example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java create mode 100644 example/src/main/resources/mapper/userPaper/UserPaperMapper.xml diff --git a/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java index 935a2d7..29e1a87 100644 --- a/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java @@ -17,6 +17,7 @@ package io.geekidea.boot.config; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import io.geekidea.boot.config.properties.SpringBootPlusFilterProperties; import io.geekidea.boot.config.properties.SpringBootPlusInterceptorProperties; import io.geekidea.boot.config.properties.SpringBootPlusProperties; @@ -24,11 +25,13 @@ import io.geekidea.boot.framework.core.filter.RequestDetailFilter; import io.geekidea.boot.framework.core.interceptor.PermissionInterceptor; import io.geekidea.boot.framework.core.xss.XssFilter; import io.geekidea.boot.framework.util.IniUtil; +import io.geekidea.boot.framework.util.LoginUtil; import io.geekidea.boot.system.interceptor.DownloadInterceptor; import io.geekidea.boot.system.interceptor.ResourceInterceptor; import io.geekidea.boot.system.interceptor.UploadInterceptor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.reflection.MetaObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; @@ -38,6 +41,7 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.PostConstruct; +import java.util.Date; import java.util.Map; /** @@ -141,7 +145,28 @@ public class SpringBootPlusWebMvcConfig implements WebMvcConfigurer { return new DownloadInterceptor(); } + /** + * 配置自动填充 + * + * @return + */ + @Bean + public MetaObjectHandler metaObjectHandler() { + return new MetaObjectHandler() { + @Override + public void insertFill(MetaObject metaObject) { + // 数据类型要与fileName一致 + this.strictInsertFill(metaObject, "createdBy", String.class, LoginUtil.getUsername()); + this.strictInsertFill(metaObject, "createdTime", Date.class, new Date()); + } + @Override + public void updateFill(MetaObject metaObject) { + this.strictUpdateFill(metaObject, "updatedTime", Date.class, new Date()); + this.strictUpdateFill(metaObject, "updatedBy", String.class, LoginUtil.getUsername()); + } + }; + } @PostConstruct public void init() { diff --git a/example/src/main/java/com/example/favorite/controller/FavorController.java b/example/src/main/java/com/example/favorite/controller/FavorController.java index 5ffda4e..6157593 100644 --- a/example/src/main/java/com/example/favorite/controller/FavorController.java +++ b/example/src/main/java/com/example/favorite/controller/FavorController.java @@ -61,11 +61,11 @@ public class FavorController extends BaseController { /** * 删除收藏记录 */ - @PostMapping("/delete") + @PostMapping("/delete/{questionId}") @OperationLog(name = "删除收藏记录", type = OperationLogType.DELETE) @ApiOperation(value = "删除收藏记录", response = ApiResult.class) - public ApiResult deleteFavor(@RequestBody Favor favor) throws Exception { - boolean flag = favorService.deleteFavor(favor); + public ApiResult deleteFavor(@PathVariable String questionId) throws Exception { + boolean flag = favorService.deleteFavor(questionId); return ApiResult.result(flag); } diff --git a/example/src/main/java/com/example/favorite/service/FavorService.java b/example/src/main/java/com/example/favorite/service/FavorService.java index 0631a4d..cab3f77 100644 --- a/example/src/main/java/com/example/favorite/service/FavorService.java +++ b/example/src/main/java/com/example/favorite/service/FavorService.java @@ -34,17 +34,17 @@ public interface FavorService extends BaseService { /** * 删除 * - * @param id + * @param questionId * @return * @throws Exception */ - boolean deleteFavor(Favor favor) throws Exception; + boolean deleteFavor(String questionId) throws Exception; /** * 获取分页对象 * - * @param favorQueryParam + * @param favorPageParam * @return * @throws Exception */ diff --git a/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java b/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java index 993b470..7022ca2 100644 --- a/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java +++ b/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java @@ -1,5 +1,6 @@ package com.example.favorite.service.impl; +import cn.hutool.core.convert.Convert; import com.example.favorite.entity.Favor; import com.example.favorite.mapper.FavorMapper; import com.example.favorite.service.FavorService; @@ -11,6 +12,7 @@ import io.geekidea.boot.framework.core.pagination.PageInfo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.geekidea.boot.framework.util.LoginUtil; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.transaction.annotation.Transactional; @@ -33,24 +35,24 @@ public class FavorServiceImpl extends BaseServiceImpl implem @Transactional(rollbackFor = Exception.class) @Override - @Cacheable(cacheNames = "Favorite", key = "#favor.userId + '_' + #favor.questionId") public boolean saveFavor(Favor favor) throws Exception { + favor.setUserId(Convert.toInt(LoginUtil.getAppUserId())); return super.save(favor); } @Transactional(rollbackFor = Exception.class) @Override public boolean updateFavor(Favor favor) throws Exception { + favor.setUserId(Convert.toInt(LoginUtil.getAppUserId())); return super.updateById(favor); } @Transactional(rollbackFor = Exception.class) @Override - @CacheEvict(cacheNames = "Favorite", key = "#favor.userId + '_' + #favor.questionId") - public boolean deleteFavor(Favor favor) throws Exception { - return super.remove(lambdaQuery() - .eq(Favor::getUserId, favor.getUserId()) - .eq(Favor::getQuestionId, favor.getQuestionId()) + public boolean deleteFavor(String questionId) throws Exception { + return super.remove(new LambdaQueryWrapper() + .eq(Favor::getUserId, LoginUtil.getAppUserId()) + .eq(Favor::getQuestionId, questionId) ); } diff --git a/example/src/main/java/com/example/paper/mapper/PaperMapper.java b/example/src/main/java/com/example/paper/mapper/PaperMapper.java index 9772c6d..1e83ac5 100644 --- a/example/src/main/java/com/example/paper/mapper/PaperMapper.java +++ b/example/src/main/java/com/example/paper/mapper/PaperMapper.java @@ -32,5 +32,5 @@ public interface PaperMapper extends BaseMapper { */ IPage getPaperPageList(@Param("page") Page page, @Param("param") PaperPageParam paperPageParam); - List getOpenPaperList(@Param("userId") Long userId, @Param("code") String code); + List getOpenPaperList(@Param("userId") String userId, @Param("code") String code); } diff --git a/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java b/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java index 187fb6d..916d028 100644 --- a/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java +++ b/example/src/main/java/com/example/paper/service/impl/PaperServiceImpl.java @@ -63,7 +63,7 @@ public class PaperServiceImpl extends BaseServiceImpl implem @Override public List getOpenPaperList(String code) throws Exception { - Long userId = LoginUtil.getUserId(); + String userId = LoginUtil.getAppUserId(); return paperMapper.getOpenPaperList(userId, code); } diff --git a/example/src/main/java/com/example/question/controller/QuestionController.java b/example/src/main/java/com/example/question/controller/QuestionController.java index f315325..eebb4e3 100644 --- a/example/src/main/java/com/example/question/controller/QuestionController.java +++ b/example/src/main/java/com/example/question/controller/QuestionController.java @@ -2,6 +2,7 @@ package com.example.question.controller; import com.example.question.entity.Question; import com.example.question.service.QuestionService; +import com.example.question.vo.QuestionPageVo; import io.geekidea.boot.framework.common.api.ApiResult; import io.geekidea.boot.framework.common.controller.BaseController; import io.geekidea.boot.framework.core.pagination.Paging; @@ -93,8 +94,8 @@ public class QuestionController extends BaseController { @PostMapping("/getPageList") @OperationLog(name = "题目信息分页列表", type = OperationLogType.PAGE) @ApiOperation(value = "题目信息分页列表", response = Question.class) - public ApiResult> getQuestionPageList(@Validated @RequestBody QuestionPageParam questionPageParam) throws Exception { - Paging paging = questionService.getQuestionPageList(questionPageParam); + public ApiResult> getQuestionPageList(@Validated @RequestBody QuestionPageParam questionPageParam) throws Exception { + Paging paging = questionService.getQuestionPageList(questionPageParam); return ApiResult.ok(paging); } diff --git a/example/src/main/java/com/example/question/entity/Question.java b/example/src/main/java/com/example/question/entity/Question.java index 8299d37..e51fef9 100644 --- a/example/src/main/java/com/example/question/entity/Question.java +++ b/example/src/main/java/com/example/question/entity/Question.java @@ -75,7 +75,7 @@ public class Question extends Model { @ApiModelProperty("解析") @TableField("ANSWER_DETAIL") - private String explain; + private String answerDetail; @ApiModelProperty("所属过程组") @TableField("GOURP_ID") diff --git a/example/src/main/java/com/example/question/mapper/QuestionMapper.java b/example/src/main/java/com/example/question/mapper/QuestionMapper.java index 628bc07..61bf37c 100644 --- a/example/src/main/java/com/example/question/mapper/QuestionMapper.java +++ b/example/src/main/java/com/example/question/mapper/QuestionMapper.java @@ -1,9 +1,12 @@ package com.example.question.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.paper.param.PaperPageParam; +import com.example.paper.vo.PaperQueryVo; import com.example.question.entity.Question; import com.example.question.param.QuestionPageParam; +import com.example.question.vo.QuestionPageVo; import org.springframework.stereotype.Repository; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -20,5 +23,12 @@ import java.io.Serializable; @Repository public interface QuestionMapper extends BaseMapper { - + /** + * 获取分页对象 + * + * @param page + * @param paperPageParam + * @return + */ + IPage getQuestionPageList(@Param("page") Page page, @Param("param") QuestionPageParam paperPageParam, @Param("userId") String userId); } diff --git a/example/src/main/java/com/example/question/param/QuestionPageParam.java b/example/src/main/java/com/example/question/param/QuestionPageParam.java index 6ee8c49..1694763 100644 --- a/example/src/main/java/com/example/question/param/QuestionPageParam.java +++ b/example/src/main/java/com/example/question/param/QuestionPageParam.java @@ -2,6 +2,7 @@ package com.example.question.param; import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -20,4 +21,7 @@ import lombok.experimental.Accessors; @ApiModel(value = "题目信息分页参数") public class QuestionPageParam extends BasePageOrderParam { private static final long serialVersionUID = 1L; + + @ApiModelProperty("试卷id") + private String paperId; } diff --git a/example/src/main/java/com/example/question/service/QuestionService.java b/example/src/main/java/com/example/question/service/QuestionService.java index db1207f..f4f41e5 100644 --- a/example/src/main/java/com/example/question/service/QuestionService.java +++ b/example/src/main/java/com/example/question/service/QuestionService.java @@ -2,6 +2,7 @@ package com.example.question.service; import com.example.question.entity.Question; import com.example.question.param.QuestionPageParam; +import com.example.question.vo.QuestionPageVo; import io.geekidea.boot.framework.common.service.BaseService; import io.geekidea.boot.framework.core.pagination.Paging; @@ -46,10 +47,10 @@ public interface QuestionService extends BaseService { /** * 获取分页对象 * - * @param questionQueryParam + * @param questionPageParam * @return * @throws Exception */ - Paging getQuestionPageList(QuestionPageParam questionPageParam) throws Exception; + Paging getQuestionPageList(QuestionPageParam questionPageParam) throws Exception; } diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java index 0c13ae6..65c46c7 100644 --- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java +++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java @@ -5,12 +5,14 @@ import com.example.question.mapper.QuestionMapper; import com.example.question.service.QuestionService; import com.example.question.param.QuestionPageParam; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.question.vo.QuestionPageVo; import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; import io.geekidea.boot.framework.core.pagination.PageInfo; import io.geekidea.boot.framework.core.pagination.Paging; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.geekidea.boot.framework.util.LoginUtil; import org.springframework.transaction.annotation.Transactional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -53,11 +55,10 @@ public class QuestionServiceImpl extends BaseServiceImpl getQuestionPageList(QuestionPageParam questionPageParam) throws Exception { - Page page = new PageInfo<>(questionPageParam, OrderItem.desc(getLambdaColumn(Question::getCreatedTime))); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - IPage iPage = questionMapper.selectPage(page, wrapper); - return new Paging(iPage); + public Paging getQuestionPageList(QuestionPageParam questionPageParam) throws Exception { + Page page = new PageInfo<>(questionPageParam, OrderItem.asc(getLambdaColumn(Question::getSerial))); + IPage iPage = questionMapper.getQuestionPageList(page, questionPageParam, LoginUtil.getAppUserId()); + return new Paging(iPage); } } diff --git a/example/src/main/java/com/example/question/vo/QuestionPageVo.java b/example/src/main/java/com/example/question/vo/QuestionPageVo.java new file mode 100644 index 0000000..e24fef5 --- /dev/null +++ b/example/src/main/java/com/example/question/vo/QuestionPageVo.java @@ -0,0 +1,55 @@ +package com.example.question.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@Accessors(chain = true) +@ApiModel(value = "QuestionPageVo对象", description = "小程序试题列表对象") +public class QuestionPageVo implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("编号") + private Integer id; + + @ApiModelProperty("题目编号") + private Integer serial; + + @ApiModelProperty("标题") + private String subject; + + @ApiModelProperty("所属试卷") + private Integer paperId; + + @ApiModelProperty("图片") + private String imgUrl; + + @ApiModelProperty("选项A") + private String optionA; + + @ApiModelProperty("选项B") + private String optionB; + + @ApiModelProperty("选项C") + private String optionC; + + @ApiModelProperty("选项D") + private String optionD; + + @ApiModelProperty("正确答案") + private String answer; + + @ApiModelProperty("解析") + private String answerDetail; + + @ApiModelProperty("是否收藏") + private Boolean isFavorite; +} diff --git a/example/src/main/java/com/example/userPaper/controller/UserPaperController.java b/example/src/main/java/com/example/userPaper/controller/UserPaperController.java new file mode 100644 index 0000000..49c3669 --- /dev/null +++ b/example/src/main/java/com/example/userPaper/controller/UserPaperController.java @@ -0,0 +1,94 @@ +package com.example.userPaper.controller; + +import com.example.userPaper.entity.UserPaper; +import com.example.userPaper.service.UserPaperService; +import lombok.extern.slf4j.Slf4j; +import com.example.userPaper.param.UserPaperPageParam; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.common.param.IdParam; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 用户考试表 控制器 + * + * @author limg + * @since 2021-02-14 + */ +@Slf4j +@RestController +@RequestMapping("/userPaper") +@Module("userPaper") +@Api(value = "用户考试表API", tags = {"用户考试表"}) +public class UserPaperController extends BaseController { + + @Autowired + private UserPaperService userPaperService; + + /** + * 添加用户考试表 + */ + @PostMapping("/add") + @OperationLog(name = "添加用户考试表", type = OperationLogType.ADD) + @ApiOperation(value = "添加用户考试表", response = ApiResult.class) + public ApiResult addUserPaper(@Validated(Add.class) @RequestBody UserPaper userPaper) throws Exception { + Integer id = userPaperService.saveUserPaper(userPaper); + return ApiResult.ok(id); + } + + /** + * 修改用户考试表 + */ + @PostMapping("/update") + @OperationLog(name = "修改用户考试表", type = OperationLogType.UPDATE) + @ApiOperation(value = "修改用户考试表", response = ApiResult.class) + public ApiResult updateUserPaper(@Validated(Update.class) @RequestBody UserPaper userPaper) throws Exception { + boolean flag = userPaperService.updateUserPaper(userPaper); + return ApiResult.result(flag); + } + + /** + * 删除用户考试表 + */ + @PostMapping("/delete/{id}") + @OperationLog(name = "删除用户考试表", type = OperationLogType.DELETE) + @ApiOperation(value = "删除用户考试表", response = ApiResult.class) + public ApiResult deleteUserPaper(@PathVariable("id") Long id) throws Exception { + boolean flag = userPaperService.deleteUserPaper(id); + return ApiResult.result(flag); + } + + /** + * 获取用户考试表详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "用户考试表详情", type = OperationLogType.INFO) + @ApiOperation(value = "用户考试表详情", response = UserPaper.class) + public ApiResult getUserPaper(@PathVariable("id") Long id) throws Exception { + UserPaper userPaper = userPaperService.getById(id); + return ApiResult.ok(userPaper); + } + + /** + * 用户考试表分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "用户考试表分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "用户考试表分页列表", response = UserPaper.class) + public ApiResult> getUserPaperPageList(@Validated @RequestBody UserPaperPageParam userPaperPageParam) throws Exception { + Paging paging = userPaperService.getUserPaperPageList(userPaperPageParam); + return ApiResult.ok(paging); + } + +} + diff --git a/example/src/main/java/com/example/userPaper/entity/UserPaper.java b/example/src/main/java/com/example/userPaper/entity/UserPaper.java new file mode 100644 index 0000000..79a26de --- /dev/null +++ b/example/src/main/java/com/example/userPaper/entity/UserPaper.java @@ -0,0 +1,80 @@ +package com.example.userPaper.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.util.Date; + +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import io.geekidea.boot.framework.core.validator.groups.Update; + +/** + * 用户考试表 + * + * @author limg + * @since 2021-02-14 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("p_user_paper") +@ApiModel(value = "UserPaper对象") +public class UserPaper extends BaseEntity { + private static final long serialVersionUID = 1L; + + @NotNull(message = "id不能为空", groups = {Update.class}) + @ApiModelProperty("ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("用户编号") + @TableField("USER_ID") + private String userId; + + @ApiModelProperty("试卷编号") + @TableField("PAPER_ID") + private String paperId; + + @ApiModelProperty("当前进度") + @TableField("PROGRESS") + private Integer progress; + + @ApiModelProperty("正确数") + @TableField("CORRECT_COUNT") + private Integer correctCount; + + @ApiModelProperty("错误数") + @TableField("ERROR_COUNT") + private Integer errorCount; + + @ApiModelProperty("总用时") + @TableField("TIME_COST") + private Integer timeCost; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + private Integer revision; + + @ApiModelProperty("创建人") + @TableField("CREATED_BY") + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField("UPDATED_BY") + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java b/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java new file mode 100644 index 0000000..86caa51 --- /dev/null +++ b/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java @@ -0,0 +1,24 @@ +package com.example.userPaper.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.userPaper.entity.UserPaper; +import com.example.userPaper.param.UserPaperPageParam; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import java.io.Serializable; + +/** + * 用户考试表 Mapper 接口 + * + * @author limg + * @since 2021-02-14 + */ +@Repository +public interface UserPaperMapper extends BaseMapper { + + +} diff --git a/example/src/main/java/com/example/userPaper/param/UserPaperPageParam.java b/example/src/main/java/com/example/userPaper/param/UserPaperPageParam.java new file mode 100644 index 0000000..9a70d26 --- /dev/null +++ b/example/src/main/java/com/example/userPaper/param/UserPaperPageParam.java @@ -0,0 +1,23 @@ +package com.example.userPaper.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; + +/** + *
+ * 用户考试表 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-14 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "用户考试表分页参数") +public class UserPaperPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/userPaper/service/UserPaperService.java b/example/src/main/java/com/example/userPaper/service/UserPaperService.java new file mode 100644 index 0000000..53324b7 --- /dev/null +++ b/example/src/main/java/com/example/userPaper/service/UserPaperService.java @@ -0,0 +1,53 @@ +package com.example.userPaper.service; + +import com.example.userPaper.entity.UserPaper; +import com.example.userPaper.param.UserPaperPageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +/** + * 用户考试表 服务类 + * + * @author limg + * @since 2021-02-14 + */ +public interface UserPaperService extends BaseService { + + /** + * 保存 + * + * @param userPaper + * @return + * @throws Exception + */ + Integer saveUserPaper(UserPaper userPaper) throws Exception; + + /** + * 修改 + * + * @param userPaper + * @return + * @throws Exception + */ + boolean updateUserPaper(UserPaper userPaper) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteUserPaper(Long id) throws Exception; + + + /** + * 获取分页对象 + * + * @param userPaperQueryParam + * @return + * @throws Exception + */ + Paging getUserPaperPageList(UserPaperPageParam userPaperPageParam) throws Exception; + +} diff --git a/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java b/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java new file mode 100644 index 0000000..0b76133 --- /dev/null +++ b/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java @@ -0,0 +1,62 @@ +package com.example.userPaper.service.impl; + +import com.example.userPaper.entity.UserPaper; +import com.example.userPaper.mapper.UserPaperMapper; +import com.example.userPaper.service.UserPaperService; +import com.example.userPaper.param.UserPaperPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 用户考试表 服务实现类 + * + * @author limg + * @since 2021-02-14 + */ +@Slf4j +@Service +public class UserPaperServiceImpl extends BaseServiceImpl implements UserPaperService { + + @Autowired + private UserPaperMapper userPaperMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public Integer saveUserPaper(UserPaper userPaper) throws Exception { + boolean flag = super.save(userPaper); + if (flag) { + return userPaper.getId(); + } + throw new Exception("添加失败"); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateUserPaper(UserPaper userPaper) throws Exception { + return super.updateById(userPaper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deleteUserPaper(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Paging getUserPaperPageList(UserPaperPageParam userPaperPageParam) throws Exception { + Page page = new PageInfo<>(userPaperPageParam, OrderItem.desc(getLambdaColumn(UserPaper::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = userPaperMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + +} diff --git a/example/src/main/resources/mapper/question/QuestionMapper.xml b/example/src/main/resources/mapper/question/QuestionMapper.xml index 952c7c9..c255dc6 100644 --- a/example/src/main/resources/mapper/question/QuestionMapper.xml +++ b/example/src/main/resources/mapper/question/QuestionMapper.xml @@ -1,5 +1,30 @@ + diff --git a/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml b/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml new file mode 100644 index 0000000..cf48279 --- /dev/null +++ b/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/java/io/geekidea/boot/framework/util/LoginUtil.java b/framework/src/main/java/io/geekidea/boot/framework/util/LoginUtil.java index 2dba64e..8f44b84 100644 --- a/framework/src/main/java/io/geekidea/boot/framework/util/LoginUtil.java +++ b/framework/src/main/java/io/geekidea/boot/framework/util/LoginUtil.java @@ -71,6 +71,17 @@ public class LoginUtil { return loginSysUserRedisVo.getId(); } + /** + * 获取小程序用户的ID + * @return + */ + public static String getAppUserId() { + // 获取当前登录用户 + String token = JwtTokenUtil.getToken(); + String username = JwtUtil.getUsername(token); + return username; + } + /** * 获取当前登录用户的账号 * diff --git a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java index 07f6bdb..efc074e 100644 --- a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java +++ b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java @@ -47,12 +47,12 @@ public class SpringBootPlusGenerator { generatorProperties .setMavenModuleName("example") .setParentPackage("com.example") - .setModuleName("favorite") + .setModuleName("userPaper") .setAuthor("limg") .setFileOverride(true); // 设置表信息 - generatorProperties.addTable("p_test","id"); + generatorProperties.addTable("p_user_paper","id"); // 设置表前缀 generatorProperties.setTablePrefix(Arrays.asList("p_")); diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java index e53499c..6d29293 100644 --- a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java @@ -34,7 +34,7 @@ import java.util.Map; */ @Slf4j @RestController -@RequestMapping("/wechat/profile") +@RequestMapping("/profile") @Module("profile") @Api(value = "用户信息API", tags = {"用户信息"}) public class ProfileController extends BaseController { diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index 6c97e7b..5ed21bf 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -11,6 +11,7 @@ import com.koronol.profile.service.ProfileService; import com.koronol.profile.param.ProfilePageParam; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.koronol.profile.vo.ProfileTokenVo; +import io.geekidea.boot.config.constant.CommonRedisKey; import io.geekidea.boot.config.properties.JwtProperties; import io.geekidea.boot.config.properties.SpringBootPlusProperties; import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; @@ -69,6 +70,10 @@ public class ProfileServiceImpl extends BaseServiceImpl @Autowired private SpringBootPlusProperties springBootPlusProperties; + @Lazy + @Autowired + private RedisTemplate redisTemplate; + @Transactional(rollbackFor = Exception.class) @Override public boolean saveProfile(Profile profile) throws Exception { diff --git a/wechat/target/classes/com/koronol/profile/controller/ProfileController.class b/wechat/target/classes/com/koronol/profile/controller/ProfileController.class index 7774cab6fb1693a75cebf9dffae9cba908ad88cb..88ec3ab39620b8b2a4fc8f96e5c9f2ab1e0dd0d3 100644 GIT binary patch delta 14 VcmZ3lwL)tHBM&3TW=bc18D#N delta 36 rcmZ3XwO(rjBabk@etBwgMq-J6K~a8MW=<+2gVE#wW`)hVJij>r*rE%5 diff --git a/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class b/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class index c533d8db856e2eebebec5e4907de0826b119a51c..6616db5d526509585094f04bd3bed4145e165f0c 100644 GIT binary patch delta 2215 zcmbVNXLOWB6uozo&3w#G!X^R%G=)&aL|q9nB2q*^1QbvrDm^5tB!ncS7>c?`ZwciC z6ai@#j0l>wV*ydDsMxWKVlSZB1$?uKfFAwh*|Trnym{r$EA!P2STr#7+~J2G1CYf! zjZxTP$&;2mWywy3rxWD#C5;hySz|X|(eUC`h1WDRb~F<4>pr}JHx=H}h{GO*w>A9O z;ou#6_^uD{;e7{1cJqOQ4>dl*UI!mL_{70JjnJp~OyhHW;owV+ukf|TH~3cLJM33D z;NW{J{6QlP2Oa#F09q^>KP&uVsY zcJx{jqp3o4G#gP{;?p#Y)r@0fMZab|6EwQ=1kEOFYMnIGOk{J-7Hp|`B2V%$iOKdL z#bK(Ct(d0Snr$@OvYo?|WyOAn?XB<>OVS-?*!5J0r`h#%Sp$|i!;x#q+QDI_!;Xqs z4$ssWii3*TnrE?-;@OIw!?pBz;$zE#`32=U!SSU^KnqR*{S z&HV;>$XC4B@DdItI=H#TUDh@Lo&Jm&%EGw&5>Sj*@iX#n2akOHt;TZNLPIq^m)Yh$zYm$`5 zd>cx#7E@9hEH22G%Uo%A6^9UKG@wmz49Bv7NOO;OvCY(E4Ew-#}QH4 z+1UogC{ZjmoWL@}a#k2tQj*t;Rf-c0C$U0uYdG1OP2n|)*BV~Okm6Ls>p9Jx*f{;l z>4q~n({L7NO9>3;aIV1wlqt?LoX-V{)rK`(sJO^*F_$R1hD*83AQxkZxKCHr?pw6w zv!xpck1Z$@ILi%hprq|a!xhYwQXAgHm9FDYaaM7q;cCfcz~9AxGcyTqZfR-JB*Qf# zoZ`=L)>@?NWV6{{8?)YU18)hBjGs&AR^Dbu==Sh;35C(z7#^DVON{>x!&+`OY|oB{ zCyUjX1<)~Pany93+WQ?oaCM^Dsl$ne}1Z?Wu{!K^pS^oHqEJh1vfGJ^G)}hyOiFcI4(3`y9*_X#a`5 zAs6xZV;^oj7=oLH;RD=E5z|lSSegpIG85AZYwoS zJOKr8P$>S!$&+4$0LDvYi_rrm=z~(hJVActg0cduP>FTYE45PRI=RCmBHbw+v0JLT zN9y{yggYqZJA|2Rf>}((Y_`WdcEbYpLp29tA#<>pBd{dI(QsLa<&jj>NZoVftFQ{I z5i4Cb{;#A6cQe)qc85W%mEa!q;Hg-Tv2xu$Y=;fFMXoy;Kj2o8dBuYT6Ov->7XCJo zDS=ap+og1lfVu)3Mb?O+R9u8RfR{ z7!wrkQK(Z0A3~=HbMGJMDva-lq%c_>eMSl=mQb@pu$5kUGnvsDjp*<;MaH< zTP0dmxU#LhtH*{YE0Uf15&TKg{iv8&API;$gf`+&K8`JaN8ex3SBm&p!x(RE*K)-1 zKD-S*@Hn=Ktq0p9LuZHl3CZ_wr8u^zG`JzmX+<9+I=%d*72O0bLPJL?z_wP?(+WmJ-7D=>^-?_H-MJh zsxb(AEP2wBr!09|;hA_jeOV(PuV}oA*EFKBPvLb9jXg0U-tWa5cvImmjaa;`@Q#Kb zdmOxL58w0ReSF}c*ls>_@R7#HIN;!*gHIfMsuB1MhcrIN7Y+_LF@u0<`@sq;OHtsJ9ziMP!+?n{zI{)2r$1V4ViPDS?(4(p7SQ4YD>D4s!DaLBX(XY{tH8kT{Q=BkCGm*74lUQ4`4(obZkLTEf z`VN!5Okt{K12)u5Va0>eyRZrFug z6}uT;!R`j-?BN#px_NpU_TrW97GF+eIj?dL`_k&SG3?Dg2E`aos1fCZhLj8~6flNY zGs{hn?VWXvVP9UW*w3&(2Z&PPm@#3cw)Ui%;y}ZE7AOufypDP9rr5T12lILxb_n4q zDJ>jbG*oa7H7sNwmvOB;H*gry(9MfVaC^o13x>1Ea0IgqM_R7fa-MCRn=7>q`V z;%LJXmKv6EjA1z?Hyv1^IM#3+$4Kf7$6K=roTzw{;my27vC=TWN$&2rjNHkFQ#jS| zR!)-)8&2m8gEENaOv726tvJVUF6Sv$8Q#YEiVF;Hr|YKrYuCENa3O~%E;786SyDE` zySUix;ZN}{;bOz3%pzL5gMG>FB7Z&qGP{i)Tv}Q@!Em{xagRUKtgz_rwkHYcZfR1Y z>#MOKW~JdhTt&1G)%AckEqJKL|5D_}e($c~tZn-Cc?ZX?5Lccyi>kaexF#%XH_=)ujn zMch=1dX%gI6bctB+$8x=9smx(6yc_Z!?-C8k^+B2y7H_}|F6$mG3{*7qy7!O??0pD zgl=xLG95Dn+J8ZxiCH#`d!#|f5cGJtC@>I-@^sZl0W#zI*lVoUDJYYXn}`xDLn-c&-9~Al z?b1Y#N*_EcciATydRH_KOL2dckS8#S37E`OOkp~vu{~z6D`v7MX0s3GG9U8-ybe_y zAy=}gs6wn9#9#@Q!Y5re>aU~-w+zb#yTd}Pz}>sKt`f7n+Tj$a@~pe0jot8 zE!z7+9p;gB8SWLC5;&z;Bc*c$R6nd0SquZI=#F(*4=w1LV}snuD;U$T37e(oZI*54 zhr`|{Vec17H+W8>Oks<{R)uXRkQ-vQ|ABVGcuz^Xd Date: Wed, 17 Feb 2021 09:54:25 +0800 Subject: [PATCH 09/36] commit user Wrong Paper --- .../boot/config/RedisCacheConfig.java | 1 + .../src/main/resources/config/application.yml | 2 + .../history/controller/HistoryController.java | 70 +++++++++ .../com/example/history/entity/History.java | 76 ++++++++++ .../example/history/mapper/HistoryMapper.java | 17 +++ .../history/param/HistoryPageParam.java | 23 +++ .../history/service/HistoryService.java | 34 +++++ .../service/impl/HistoryServiceImpl.java | 46 ++++++ .../notes/controller/NotesController.java | 139 ++++++++++++++++++ .../java/com/example/notes/entity/Notes.java | 72 +++++++++ .../com/example/notes/mapper/NotesMapper.java | 27 ++++ .../example/notes/param/NotesPageParam.java | 23 +++ .../example/notes/service/NotesService.java | 68 +++++++++ .../notes/service/impl/NotesServiceImpl.java | 91 ++++++++++++ .../java/com/example/notes/vo/WrongVo.java | 24 +++ .../controller/QuestionController.java | 10 ++ .../question/param/QuestionAnswerParam.java | 42 ++++++ .../question/param/QuestionPageParam.java | 3 + .../question/service/QuestionService.java | 2 + .../service/impl/QuestionServiceImpl.java | 82 +++++++++++ .../controller/UserPaperController.java | 13 ++ .../userPaper/mapper/UserPaperMapper.java | 5 + .../userPaper/service/UserPaperService.java | 18 ++- .../service/impl/UserPaperServiceImpl.java | 16 ++ .../com/example/userPaper/vo/UserRankVo.java | 27 ++++ .../mapper/history/HistoryMapper.xml | 5 + .../resources/mapper/notes/NotesMapper.xml | 45 ++++++ .../resources/mapper/paper/PaperMapper.xml | 65 ++++++-- .../mapper/userPaper/UserPaperMapper.xml | 27 +++- .../generator/SpringBootPlusGenerator.java | 4 +- wechat/pom.xml | 4 + .../profile/controller/ProfileController.java | 16 +- .../com/koronol/profile/entity/Profile.java | 2 + .../profile/param/PhoneLoginParam.java | 27 ++++ .../profile/service/ProfileService.java | 18 ++- .../service/impl/ProfileServiceImpl.java | 76 +++++++++- .../com/koronol/profile/vo/ProfileInfoVo.java | 21 +++ .../koronol/profile/vo/ProfileTokenVo.java | 9 +- .../controller/ProfileController.class | Bin 5416 -> 6123 bytes .../com/koronol/profile/entity/Profile.class | Bin 9181 -> 9261 bytes .../profile/param/PhoneLoginParam.class | Bin 0 -> 2809 bytes .../profile/service/ProfileService.class | Bin 935 -> 1150 bytes .../service/impl/ProfileServiceImpl.class | Bin 10128 -> 13676 bytes .../koronol/profile/vo/ProfileInfoVo.class | Bin 0 -> 2304 bytes .../koronol/profile/vo/ProfileTokenVo.class | Bin 5671 -> 5766 bytes 45 files changed, 1223 insertions(+), 27 deletions(-) create mode 100644 example/src/main/java/com/example/history/controller/HistoryController.java create mode 100644 example/src/main/java/com/example/history/entity/History.java create mode 100644 example/src/main/java/com/example/history/mapper/HistoryMapper.java create mode 100644 example/src/main/java/com/example/history/param/HistoryPageParam.java create mode 100644 example/src/main/java/com/example/history/service/HistoryService.java create mode 100644 example/src/main/java/com/example/history/service/impl/HistoryServiceImpl.java create mode 100644 example/src/main/java/com/example/notes/controller/NotesController.java create mode 100644 example/src/main/java/com/example/notes/entity/Notes.java create mode 100644 example/src/main/java/com/example/notes/mapper/NotesMapper.java create mode 100644 example/src/main/java/com/example/notes/param/NotesPageParam.java create mode 100644 example/src/main/java/com/example/notes/service/NotesService.java create mode 100644 example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java create mode 100644 example/src/main/java/com/example/notes/vo/WrongVo.java create mode 100644 example/src/main/java/com/example/question/param/QuestionAnswerParam.java create mode 100644 example/src/main/java/com/example/userPaper/vo/UserRankVo.java create mode 100644 example/src/main/resources/mapper/history/HistoryMapper.xml create mode 100644 example/src/main/resources/mapper/notes/NotesMapper.xml create mode 100644 wechat/src/main/java/com/koronol/profile/param/PhoneLoginParam.java create mode 100644 wechat/src/main/java/com/koronol/profile/vo/ProfileInfoVo.java create mode 100644 wechat/target/classes/com/koronol/profile/param/PhoneLoginParam.class create mode 100644 wechat/target/classes/com/koronol/profile/vo/ProfileInfoVo.class diff --git a/bootstrap/src/main/java/io/geekidea/boot/config/RedisCacheConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/RedisCacheConfig.java index 650f543..1261886 100644 --- a/bootstrap/src/main/java/io/geekidea/boot/config/RedisCacheConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/RedisCacheConfig.java @@ -72,6 +72,7 @@ public class RedisCacheConfig extends CachingConfigurerSupport { Map configMap = new HashMap<>(10); configMap.put("my-redis-cache1", config); configMap.put("my-redis-cache2", config.entryTtl(Duration.ofSeconds(120))); + configMap.put("userRank", config.entryTtl(Duration.ofDays(1))); // 使用自定义的缓存配置初始化一个cacheManager RedisCacheManager cacheManager = RedisCacheManager.builder(factory) diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index 903caf2..85e1b52 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -186,6 +186,8 @@ spring-boot-plus: # 排除登录登出 - /login,/logout - /profile/signIn + - /profile/signInByPhone + - /**/wechat/** # 排除静态资源 - /static/**,/templates/** # 排除Swagger diff --git a/example/src/main/java/com/example/history/controller/HistoryController.java b/example/src/main/java/com/example/history/controller/HistoryController.java new file mode 100644 index 0000000..ee0a1bf --- /dev/null +++ b/example/src/main/java/com/example/history/controller/HistoryController.java @@ -0,0 +1,70 @@ +package com.example.history.controller; + +import com.example.history.entity.History; +import com.example.history.service.HistoryService; +import lombok.extern.slf4j.Slf4j; +import com.example.history.param.HistoryPageParam; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 做题记录 控制器 + * + * @author limg + * @since 2021-02-15 + */ +@Slf4j +@RestController +@RequestMapping("/history") +@Module("history") +@Api(value = "做题记录API", tags = {"做题记录"}) +public class HistoryController extends BaseController { + + @Autowired + private HistoryService historyService; + + /** + * 添加做题记录 + */ + @PostMapping("/add") + @OperationLog(name = "添加做题记录", type = OperationLogType.ADD) + @ApiOperation(value = "添加做题记录", response = ApiResult.class) + public ApiResult addHistory(@Validated(Add.class) @RequestBody History history) throws Exception { + boolean flag = historyService.saveHistory(history); + return ApiResult.result(flag); + } + + /** + * 获取做题记录详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "做题记录详情", type = OperationLogType.INFO) + @ApiOperation(value = "做题记录详情", response = History.class) + public ApiResult getHistory(@PathVariable("id") Long id) throws Exception { + History history = historyService.getById(id); + return ApiResult.ok(history); + } + + /** + * 做题记录分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "做题记录分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "做题记录分页列表", response = History.class) + public ApiResult> getHistoryPageList(@Validated @RequestBody HistoryPageParam historyPageParam) throws Exception { + Paging paging = historyService.getHistoryPageList(historyPageParam); + return ApiResult.ok(paging); + } + +} + diff --git a/example/src/main/java/com/example/history/entity/History.java b/example/src/main/java/com/example/history/entity/History.java new file mode 100644 index 0000000..5284367 --- /dev/null +++ b/example/src/main/java/com/example/history/entity/History.java @@ -0,0 +1,76 @@ +package com.example.history.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.util.Date; + +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import io.geekidea.boot.framework.core.validator.groups.Update; + +/** + * 做题记录 + * + * @author limg + * @since 2021-02-15 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("p_history") +@ApiModel(value = "History对象") +public class History extends BaseEntity { + private static final long serialVersionUID = 1L; + + @NotNull(message = "id不能为空", groups = {Update.class}) + @ApiModelProperty("编号") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("用户编号") + @TableField("USER_ID") + private Integer userId; + + @ApiModelProperty("试卷编号") + @TableField("PAPER_ID") + private Integer paperId; + + @ApiModelProperty("试题编号") + @TableField("QUESTION_ID") + private Integer questionId; + + @ApiModelProperty("用户选择") + @TableField("USER_ANSWER") + private String userAnswer; + + @ApiModelProperty("是否正确 0-错误,1-正确") + @TableField("IS_RIGHT") + private String isRight; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + private Integer revision; + + @ApiModelProperty("创建人") + @TableField("CREATED_BY") + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField("UPDATED_BY") + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/example/src/main/java/com/example/history/mapper/HistoryMapper.java b/example/src/main/java/com/example/history/mapper/HistoryMapper.java new file mode 100644 index 0000000..ee3bc4f --- /dev/null +++ b/example/src/main/java/com/example/history/mapper/HistoryMapper.java @@ -0,0 +1,17 @@ +package com.example.history.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.history.entity.History; + +import org.springframework.stereotype.Repository; + +/** + * 做题记录 Mapper 接口 + * + * @author limg + * @since 2021-02-15 + */ +@Repository +public interface HistoryMapper extends BaseMapper { + +} diff --git a/example/src/main/java/com/example/history/param/HistoryPageParam.java b/example/src/main/java/com/example/history/param/HistoryPageParam.java new file mode 100644 index 0000000..e1a8062 --- /dev/null +++ b/example/src/main/java/com/example/history/param/HistoryPageParam.java @@ -0,0 +1,23 @@ +package com.example.history.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; + +/** + *
+ * 做题记录 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-15 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "做题记录分页参数") +public class HistoryPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/history/service/HistoryService.java b/example/src/main/java/com/example/history/service/HistoryService.java new file mode 100644 index 0000000..c878049 --- /dev/null +++ b/example/src/main/java/com/example/history/service/HistoryService.java @@ -0,0 +1,34 @@ +package com.example.history.service; + +import com.example.history.entity.History; +import com.example.history.param.HistoryPageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +/** + * 做题记录 服务类 + * + * @author limg + * @since 2021-02-15 + */ +public interface HistoryService extends BaseService { + + /** + * 保存 + * + * @param history + * @return + * @throws Exception + */ + boolean saveHistory(History history) throws Exception; + + /** + * 获取分页对象 + * + * @param historyPageParam + * @return + * @throws Exception + */ + Paging getHistoryPageList(HistoryPageParam historyPageParam) throws Exception; + +} diff --git a/example/src/main/java/com/example/history/service/impl/HistoryServiceImpl.java b/example/src/main/java/com/example/history/service/impl/HistoryServiceImpl.java new file mode 100644 index 0000000..b28077c --- /dev/null +++ b/example/src/main/java/com/example/history/service/impl/HistoryServiceImpl.java @@ -0,0 +1,46 @@ +package com.example.history.service.impl; + +import com.example.history.entity.History; +import com.example.history.mapper.HistoryMapper; +import com.example.history.service.HistoryService; +import com.example.history.param.HistoryPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 做题记录 服务实现类 + * + * @author limg + * @since 2021-02-15 + */ +@Slf4j +@Service +public class HistoryServiceImpl extends BaseServiceImpl implements HistoryService { + + @Autowired + private HistoryMapper historyMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean saveHistory(History history) throws Exception { + return super.save(history); + } + + @Override + public Paging getHistoryPageList(HistoryPageParam historyPageParam) throws Exception { + Page page = new PageInfo<>(historyPageParam, OrderItem.desc(getLambdaColumn(History::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = historyMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + +} diff --git a/example/src/main/java/com/example/notes/controller/NotesController.java b/example/src/main/java/com/example/notes/controller/NotesController.java new file mode 100644 index 0000000..783e487 --- /dev/null +++ b/example/src/main/java/com/example/notes/controller/NotesController.java @@ -0,0 +1,139 @@ +package com.example.notes.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.history.entity.History; +import com.example.notes.entity.Notes; +import com.example.notes.service.NotesService; +import com.example.notes.vo.WrongVo; +import com.example.question.param.QuestionPageParam; +import com.example.question.vo.QuestionPageVo; +import io.geekidea.boot.framework.util.LoginUtil; +import lombok.extern.slf4j.Slf4j; +import com.example.notes.param.NotesPageParam; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 错题记录 控制器 + * + * @author limg + * @since 2021-02-16 + */ +@Slf4j +@RestController +@RequestMapping("/notes") +@Module("notes") +@Api(value = "错题记录API", tags = {"错题记录"}) +public class NotesController extends BaseController { + + @Autowired + private NotesService notesService; + + @Lazy + @Autowired + private RedisTemplate redisTemplate; + + /** + * 添加错题记录 + */ + @PostMapping("/add") + @OperationLog(name = "添加错题记录", type = OperationLogType.ADD) + @ApiOperation(value = "添加错题记录", response = ApiResult.class) + public ApiResult addNotes(@Validated(Add.class) @RequestBody Notes notes) throws Exception { + boolean flag = notesService.saveNotes(notes); + return ApiResult.result(flag); + } + + /** + * 修改错题记录 + */ + @PostMapping("/update") + @OperationLog(name = "修改错题记录", type = OperationLogType.UPDATE) + @ApiOperation(value = "修改错题记录", response = ApiResult.class) + public ApiResult updateNotes(@Validated(Update.class) @RequestBody Notes notes) throws Exception { + boolean flag = notesService.updateNotes(notes); + return ApiResult.result(flag); + } + + /** + * 删除错题记录 + */ + @PostMapping("/delete") + @OperationLog(name = "删除错题记录", type = OperationLogType.DELETE) + @ApiOperation(value = "删除错题记录", response = ApiResult.class) + public ApiResult deleteNotes(@RequestParam("id") String id) throws Exception { + boolean flag = false; + String appUserId = LoginUtil.getAppUserId(); + String key = String.format("wrongPaperList-%s", appUserId); + + if (StrUtil.isNotBlank(id)) { + flag = notesService.removeById(id); + } else { + flag = notesService.remove(new LambdaQueryWrapper().eq(Notes::getUserId, appUserId)); + } + redisTemplate.delete(key); + return ApiResult.result(flag); + } + + /** + * 获取错题记录详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "错题记录详情", type = OperationLogType.INFO) + @ApiOperation(value = "错题记录详情", response = Notes.class) + public ApiResult getNotes(@PathVariable("id") Long id) throws Exception { + Notes notes = notesService.getById(id); + return ApiResult.ok(notes); + } + + /** + * 错题记录分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "错题记录分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "错题记录分页列表", response = Notes.class) + public ApiResult> getNotesPageList(@Validated @RequestBody NotesPageParam notesPageParam) throws Exception { + Paging paging = notesService.getNotesPageList(notesPageParam); + return ApiResult.ok(paging); + } + + /** + * 错题试卷列表 + */ + @GetMapping("/getWrongList") + @OperationLog(name = "错题试卷列表", type = OperationLogType.LIST) + @ApiOperation(value = "错题试卷列表", response = History.class) + public ApiResult> getWrongList() throws Exception { + List list = notesService.getHistoryWrongList(); + return ApiResult.ok(list); + } + + /** + * 错题列表 + */ + @PostMapping("/getWrongQuestionList") + @OperationLog(name = "错题列表", type = OperationLogType.PAGE) + @ApiOperation(value = "错题列表", response = History.class) + public ApiResult> getWrongQuestionList(@Validated @RequestBody QuestionPageParam questionPageParam) throws Exception { + List list = notesService.getQuestionPageList(questionPageParam); + return ApiResult.ok(list); + } + +} + diff --git a/example/src/main/java/com/example/notes/entity/Notes.java b/example/src/main/java/com/example/notes/entity/Notes.java new file mode 100644 index 0000000..d9c9d49 --- /dev/null +++ b/example/src/main/java/com/example/notes/entity/Notes.java @@ -0,0 +1,72 @@ +package com.example.notes.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.util.Date; + +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import io.geekidea.boot.framework.core.validator.groups.Update; + +/** + * 错题记录 + * + * @author limg + * @since 2021-02-16 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("p_notes") +@ApiModel(value = "Notes对象") +public class Notes extends BaseEntity { + private static final long serialVersionUID = 1L; + + @NotNull(message = "id不能为空", groups = {Update.class}) + @ApiModelProperty("编号") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("用户编号") + @TableField("USER_ID") + private Integer userId; + + @ApiModelProperty("试卷编号") + @TableField("PAPER_ID") + private Integer paperId; + + @ApiModelProperty("试题编号") + @TableField("QUESTION_ID") + private Integer questionId; + + @ApiModelProperty("用户选择") + @TableField("USER_ANSWER") + private String userAnswer; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + private Integer revision; + + @ApiModelProperty("创建人") + @TableField("CREATED_BY") + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField("UPDATED_BY") + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/example/src/main/java/com/example/notes/mapper/NotesMapper.java b/example/src/main/java/com/example/notes/mapper/NotesMapper.java new file mode 100644 index 0000000..d9cbda6 --- /dev/null +++ b/example/src/main/java/com/example/notes/mapper/NotesMapper.java @@ -0,0 +1,27 @@ +package com.example.notes.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.example.notes.entity.Notes; + +import com.example.notes.vo.WrongVo; +import com.example.question.vo.QuestionPageVo; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 错题记录 Mapper 接口 + * + * @author limg + * @since 2021-02-16 + */ +@Repository +public interface NotesMapper extends BaseMapper { + + List selectWrongPaperList(String appUserId); + + List selectWrongQuestionPageList(@Param("appUserId") String appUserId, @Param("paperId") String paperId); +} diff --git a/example/src/main/java/com/example/notes/param/NotesPageParam.java b/example/src/main/java/com/example/notes/param/NotesPageParam.java new file mode 100644 index 0000000..30bd95d --- /dev/null +++ b/example/src/main/java/com/example/notes/param/NotesPageParam.java @@ -0,0 +1,23 @@ +package com.example.notes.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; + +/** + *
+ * 错题记录 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-16 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "错题记录分页参数") +public class NotesPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/notes/service/NotesService.java b/example/src/main/java/com/example/notes/service/NotesService.java new file mode 100644 index 0000000..81d4704 --- /dev/null +++ b/example/src/main/java/com/example/notes/service/NotesService.java @@ -0,0 +1,68 @@ +package com.example.notes.service; + +import com.example.notes.entity.Notes; +import com.example.notes.param.NotesPageParam; +import com.example.notes.vo.WrongVo; +import com.example.question.param.QuestionPageParam; +import com.example.question.vo.QuestionPageVo; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +import java.util.List; + +/** + * 错题记录 服务类 + * + * @author limg + * @since 2021-02-16 + */ +public interface NotesService extends BaseService { + + /** + * 保存 + * + * @param notes + * @return + * @throws Exception + */ + boolean saveNotes(Notes notes) throws Exception; + + /** + * 修改 + * + * @param notes + * @return + * @throws Exception + */ + boolean updateNotes(Notes notes) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteNotes(Long id) throws Exception; + + + /** + * 获取分页对象 + * + * @param notesPageParam + * @return + * @throws Exception + */ + Paging getNotesPageList(NotesPageParam notesPageParam) throws Exception; + + /** + * 获取错题列表 + * @param questionPageParam + * @return + * @throws Exception + */ + List getQuestionPageList(QuestionPageParam questionPageParam) throws Exception; + + List getHistoryWrongList() throws Exception; + +} diff --git a/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java b/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java new file mode 100644 index 0000000..116a757 --- /dev/null +++ b/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java @@ -0,0 +1,91 @@ +package com.example.notes.service.impl; + +import com.example.notes.entity.Notes; +import com.example.notes.mapper.NotesMapper; +import com.example.notes.service.NotesService; +import com.example.notes.param.NotesPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.notes.vo.WrongVo; +import com.example.question.param.QuestionPageParam; +import com.example.question.vo.QuestionPageVo; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.geekidea.boot.framework.util.LoginUtil; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * 错题记录 服务实现类 + * + * @author limg + * @since 2021-02-16 + */ +@Slf4j +@Service +public class NotesServiceImpl extends BaseServiceImpl implements NotesService { + + @Autowired + private NotesMapper notesMapper; + + @Lazy + @Autowired + private RedisTemplate redisTemplate; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean saveNotes(Notes notes) throws Exception { + return super.save(notes); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateNotes(Notes notes) throws Exception { + return super.updateById(notes); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deleteNotes(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Paging getNotesPageList(NotesPageParam notesPageParam) throws Exception { + Page page = new PageInfo<>(notesPageParam, OrderItem.desc(getLambdaColumn(Notes::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = notesMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + + @Override + public List getQuestionPageList(QuestionPageParam questionPageParam) throws Exception { + List list = notesMapper.selectWrongQuestionPageList(LoginUtil.getAppUserId(), questionPageParam.getPaperId()); + return list; + } + + @Override + public List getHistoryWrongList() throws Exception { + String appUserId = LoginUtil.getAppUserId(); + String key = String.format("wrongPaperList-%s", appUserId); + List redisList = (List) redisTemplate.opsForValue().get(key); + if (redisList != null) { + return redisList; + } + List list = notesMapper.selectWrongPaperList(appUserId); + redisTemplate.opsForValue().set(key, list, 3, TimeUnit.DAYS); + + return list; + } + +} diff --git a/example/src/main/java/com/example/notes/vo/WrongVo.java b/example/src/main/java/com/example/notes/vo/WrongVo.java new file mode 100644 index 0000000..32ea5a5 --- /dev/null +++ b/example/src/main/java/com/example/notes/vo/WrongVo.java @@ -0,0 +1,24 @@ +package com.example.notes.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@Accessors(chain = true) +@ApiModel(value = "做错试卷列表对象", description = "小程序用户做错试题列表") +public class WrongVo implements Serializable { + private static final long serialVersionUID = -5160036959137826314L; + + @ApiModelProperty("试卷编号") + private Integer paperId; + + @ApiModelProperty("试卷名称") + private String paperName; + + @ApiModelProperty("错题数") + private Integer count; +} diff --git a/example/src/main/java/com/example/question/controller/QuestionController.java b/example/src/main/java/com/example/question/controller/QuestionController.java index eebb4e3..888bc5e 100644 --- a/example/src/main/java/com/example/question/controller/QuestionController.java +++ b/example/src/main/java/com/example/question/controller/QuestionController.java @@ -1,6 +1,7 @@ package com.example.question.controller; import com.example.question.entity.Question; +import com.example.question.param.QuestionAnswerParam; import com.example.question.service.QuestionService; import com.example.question.vo.QuestionPageVo; import io.geekidea.boot.framework.common.api.ApiResult; @@ -13,6 +14,7 @@ import io.geekidea.boot.framework.log.annotation.OperationLog; import io.geekidea.boot.framework.log.enums.OperationLogType; import lombok.extern.slf4j.Slf4j; import com.example.question.param.QuestionPageParam; +import org.springframework.cache.annotation.Cacheable; import org.springframework.validation.annotation.Validated; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -99,5 +101,13 @@ public class QuestionController extends BaseController { return ApiResult.ok(paging); } + @PostMapping("/submitAnswer") + @OperationLog(name = "提交答案", type = OperationLogType.ADD) + @ApiOperation(value = "提交答案", response = Question.class) + public ApiResult submitAnswer(@Validated @RequestBody QuestionAnswerParam questionAnswerParam) throws Exception { + Boolean flag = questionService.sumitAnswer(questionAnswerParam); + return ApiResult.ok(flag); + } + } diff --git a/example/src/main/java/com/example/question/param/QuestionAnswerParam.java b/example/src/main/java/com/example/question/param/QuestionAnswerParam.java new file mode 100644 index 0000000..f0fa5b8 --- /dev/null +++ b/example/src/main/java/com/example/question/param/QuestionAnswerParam.java @@ -0,0 +1,42 @@ +package com.example.question.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + *
+ * 题目信息 提交答案表单对象
+ * 
+ * + * @author limg + * @date 2021-02-03 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "提交答案表单对象") +public class QuestionAnswerParam implements Serializable { + private static final long serialVersionUID = 5364321420976152006L; + + @ApiModelProperty("试卷id") + @NotNull(message = "试卷id不能为空") + private String paperId; + + @ApiModelProperty("考试id") + @NotNull(message = "考试id不能为空") + private Long recordId; + + @ApiModelProperty("试题id") + @NotNull(message = "试题id不能为空") + private Long questionId; + + @ApiModelProperty("用户选择的答案") + @NotNull(message = "答案不能为空") + private String answer; + +} diff --git a/example/src/main/java/com/example/question/param/QuestionPageParam.java b/example/src/main/java/com/example/question/param/QuestionPageParam.java index 1694763..0b91282 100644 --- a/example/src/main/java/com/example/question/param/QuestionPageParam.java +++ b/example/src/main/java/com/example/question/param/QuestionPageParam.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import javax.validation.constraints.NotNull; + /** *
  * 题目信息 分页参数对象
@@ -23,5 +25,6 @@ public class QuestionPageParam extends BasePageOrderParam {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("试卷id")
+    @NotNull(message = "请输入试卷编号")
     private String paperId;
 }
diff --git a/example/src/main/java/com/example/question/service/QuestionService.java b/example/src/main/java/com/example/question/service/QuestionService.java
index f4f41e5..8066fda 100644
--- a/example/src/main/java/com/example/question/service/QuestionService.java
+++ b/example/src/main/java/com/example/question/service/QuestionService.java
@@ -1,6 +1,7 @@
 package com.example.question.service;
 
 import com.example.question.entity.Question;
+import com.example.question.param.QuestionAnswerParam;
 import com.example.question.param.QuestionPageParam;
 import com.example.question.vo.QuestionPageVo;
 import io.geekidea.boot.framework.common.service.BaseService;
@@ -53,4 +54,5 @@ public interface QuestionService extends BaseService {
      */
     Paging getQuestionPageList(QuestionPageParam questionPageParam) throws Exception;
 
+    Boolean sumitAnswer(QuestionAnswerParam questionAnswerParam) throws Exception;
 }
diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
index 65c46c7..baa6bf0 100644
--- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
+++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
@@ -1,23 +1,38 @@
 package com.example.question.service.impl;
 
+import cn.hutool.core.convert.Convert;
+import com.example.history.entity.History;
+import com.example.history.service.HistoryService;
+import com.example.notes.entity.Notes;
+import com.example.notes.service.NotesService;
 import com.example.question.entity.Question;
 import com.example.question.mapper.QuestionMapper;
+import com.example.question.param.QuestionAnswerParam;
 import com.example.question.service.QuestionService;
 import com.example.question.param.QuestionPageParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.example.question.vo.QuestionPageVo;
+import com.example.userPaper.entity.UserPaper;
+import com.example.userPaper.service.UserPaperService;
+import io.geekidea.boot.config.constant.CommonRedisKey;
+import io.geekidea.boot.framework.common.exception.BusinessException;
 import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl;
 import io.geekidea.boot.framework.core.pagination.PageInfo;
 import io.geekidea.boot.framework.core.pagination.Paging;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.geekidea.boot.framework.shiro.vo.LoginSysUserRedisVo;
 import io.geekidea.boot.framework.util.LoginUtil;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.concurrent.TimeUnit;
+
 /**
  * 题目信息 服务实现类
  *
@@ -31,6 +46,22 @@ public class QuestionServiceImpl extends BaseServiceImpl getQuestionPageList(QuestionPageParam questionPageParam) throws Exception {
+        String key = String.format("questionList-%s-%s-%d-%d", LoginUtil.getAppUserId(), questionPageParam.getPaperId(), questionPageParam.getPageIndex(), questionPageParam.getPageSize());
+        IPage redisList = (IPage) redisTemplate.opsForValue().get(key);
+        if (redisList != null) {
+            return new Paging(redisList);
+        }
         Page page = new PageInfo<>(questionPageParam, OrderItem.asc(getLambdaColumn(Question::getSerial)));
         IPage iPage = questionMapper.getQuestionPageList(page, questionPageParam, LoginUtil.getAppUserId());
+        redisTemplate.opsForValue().set(key, iPage, 1, TimeUnit.DAYS);
         return new Paging(iPage);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean sumitAnswer(QuestionAnswerParam questionAnswerParam) throws Exception {
+        Question question = super.getById(questionAnswerParam.getQuestionId());
+        if (question == null) {
+            throw new BusinessException("试题不存在");
+        }
+        String appUserId = LoginUtil.getAppUserId();
+        // 插入历史记录
+        History history = new History();
+        history.setPaperId(Convert.toInt(questionAnswerParam.getPaperId()));
+        history.setQuestionId(question.getId());
+        history.setUserAnswer(questionAnswerParam.getAnswer());
+        history.setIsRight(questionAnswerParam.getAnswer().equals(question.getAnswer()) ? "1" : "0");
+        history.setUserId(Convert.toInt(appUserId));
+        historyService.saveOrUpdate(history, new LambdaQueryWrapper().eq(History::getQuestionId, question.getId()));
+        // 更新考试正确题数和当前进度
+        UserPaper userPaper = userPaperService.getById(questionAnswerParam.getRecordId());
+        if (userPaper == null) {
+            throw new BusinessException("考试记录不存在, 请重新开始");
+        }
+        userPaper.setPaperId(questionAnswerParam.getPaperId());
+        if (questionAnswerParam.getAnswer().equals(question.getAnswer())) {
+            userPaper.setCorrectCount(userPaper.getCorrectCount() + 1);
+        } else {
+            userPaper.setErrorCount(userPaper.getErrorCount() + 1);
+        }
+        userPaper.setProgress(question.getSerial());
+        userPaper.setUserId(appUserId);
+        Boolean flag = userPaperService.updateById(userPaper);
+        // 如果答错,插入错题集
+        if (!questionAnswerParam.getAnswer().equals(question.getAnswer())) {
+            String key = String.format("wrongPaperList-%s", appUserId);
+            Notes notes = new Notes();
+            notes.setPaperId(Convert.toInt(questionAnswerParam.getPaperId()));
+            notes.setQuestionId(question.getId());
+            notes.setUserAnswer(questionAnswerParam.getAnswer());
+            notes.setUserId(Convert.toInt(appUserId));
+            notesService.saveNotes(notes);
+            redisTemplate.delete(key);
+        }
+
+        return flag;
+    }
+
 }
diff --git a/example/src/main/java/com/example/userPaper/controller/UserPaperController.java b/example/src/main/java/com/example/userPaper/controller/UserPaperController.java
index 49c3669..05bbe63 100644
--- a/example/src/main/java/com/example/userPaper/controller/UserPaperController.java
+++ b/example/src/main/java/com/example/userPaper/controller/UserPaperController.java
@@ -2,6 +2,7 @@ package com.example.userPaper.controller;
 
 import com.example.userPaper.entity.UserPaper;
 import com.example.userPaper.service.UserPaperService;
+import com.example.userPaper.vo.UserRankVo;
 import lombok.extern.slf4j.Slf4j;
 import com.example.userPaper.param.UserPaperPageParam;
 import io.geekidea.boot.framework.common.controller.BaseController;
@@ -13,12 +14,15 @@ import io.geekidea.boot.framework.log.annotation.OperationLog;
 import io.geekidea.boot.framework.log.enums.OperationLogType;
 import io.geekidea.boot.framework.core.validator.groups.Add;
 import io.geekidea.boot.framework.core.validator.groups.Update;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.validation.annotation.Validated;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * 用户考试表 控制器
  *
@@ -90,5 +94,14 @@ public class UserPaperController extends BaseController {
         return ApiResult.ok(paging);
     }
 
+    @GetMapping("/wechat/userRank")
+    @OperationLog(name = "用户考试排行", type = OperationLogType.PAGE)
+    @ApiOperation(value = "用户考试排行", response = UserPaper.class)
+    @Cacheable(value = "userRank", key = "#root.methodName")
+    public ApiResult> getRankList() throws Exception {
+        List list = userPaperService.getRankList();
+        return ApiResult.ok(list);
+    }
+
 }
 
diff --git a/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java b/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java
index 86caa51..b89bcf3 100644
--- a/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java
+++ b/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java
@@ -4,12 +4,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.example.userPaper.entity.UserPaper;
 import com.example.userPaper.param.UserPaperPageParam;
 
+import com.example.userPaper.vo.UserRankVo;
 import org.springframework.stereotype.Repository;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 用户考试表 Mapper 接口
@@ -21,4 +23,7 @@ import java.io.Serializable;
 public interface UserPaperMapper extends BaseMapper {
 
 
+    List selectRank();
+
+    Integer getAvgScore(String appUserId);
 }
diff --git a/example/src/main/java/com/example/userPaper/service/UserPaperService.java b/example/src/main/java/com/example/userPaper/service/UserPaperService.java
index 53324b7..38f230c 100644
--- a/example/src/main/java/com/example/userPaper/service/UserPaperService.java
+++ b/example/src/main/java/com/example/userPaper/service/UserPaperService.java
@@ -2,9 +2,12 @@ package com.example.userPaper.service;
 
 import com.example.userPaper.entity.UserPaper;
 import com.example.userPaper.param.UserPaperPageParam;
+import com.example.userPaper.vo.UserRankVo;
 import io.geekidea.boot.framework.common.service.BaseService;
 import io.geekidea.boot.framework.core.pagination.Paging;
 
+import java.util.List;
+
 /**
  * 用户考试表 服务类
  *
@@ -44,10 +47,23 @@ public interface UserPaperService extends BaseService {
     /**
      * 获取分页对象
      *
-     * @param userPaperQueryParam
+     * @param userPaperPageParam
      * @return
      * @throws Exception
      */
     Paging getUserPaperPageList(UserPaperPageParam userPaperPageParam) throws Exception;
 
+    /**
+     * 获取用户排行
+     * @return
+     * @throws Exception
+     */
+    List getRankList() throws Exception;
+
+    /**
+     * 获取用户平均分
+     * @return
+     * @throws Exception
+     */
+    Integer getUserAvgScore() throws Exception;
 }
diff --git a/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java b/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java
index 0b76133..4f1c2a6 100644
--- a/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java
+++ b/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java
@@ -5,17 +5,21 @@ import com.example.userPaper.mapper.UserPaperMapper;
 import com.example.userPaper.service.UserPaperService;
 import com.example.userPaper.param.UserPaperPageParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.userPaper.vo.UserRankVo;
 import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl;
 import io.geekidea.boot.framework.core.pagination.Paging;
 import io.geekidea.boot.framework.core.pagination.PageInfo;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.geekidea.boot.framework.util.LoginUtil;
 import org.springframework.transaction.annotation.Transactional;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.List;
+
 /**
  * 用户考试表 服务实现类
  *
@@ -59,4 +63,16 @@ public class UserPaperServiceImpl extends BaseServiceImpl(iPage);
     }
 
+    @Override
+    public List getRankList() throws Exception {
+        List list = userPaperMapper.selectRank();
+        return list;
+    }
+
+    @Override
+    public Integer getUserAvgScore() throws Exception {
+        Integer score = userPaperMapper.getAvgScore(LoginUtil.getAppUserId());
+        return score;
+    }
+
 }
diff --git a/example/src/main/java/com/example/userPaper/vo/UserRankVo.java b/example/src/main/java/com/example/userPaper/vo/UserRankVo.java
new file mode 100644
index 0000000..68c4a51
--- /dev/null
+++ b/example/src/main/java/com/example/userPaper/vo/UserRankVo.java
@@ -0,0 +1,27 @@
+package com.example.userPaper.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "PaperRankVo对象", description = "考试排行对象")
+public class UserRankVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("userId")
+    private String userId;
+
+    @ApiModelProperty("nickName")
+    private String nickName;
+
+    @ApiModelProperty("avatarUrl")
+    private String avatarUrl;
+
+    @ApiModelProperty("count")
+    private Integer count;
+}
diff --git a/example/src/main/resources/mapper/history/HistoryMapper.xml b/example/src/main/resources/mapper/history/HistoryMapper.xml
new file mode 100644
index 0000000..f2c9757
--- /dev/null
+++ b/example/src/main/resources/mapper/history/HistoryMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/example/src/main/resources/mapper/notes/NotesMapper.xml b/example/src/main/resources/mapper/notes/NotesMapper.xml
new file mode 100644
index 0000000..11fc743
--- /dev/null
+++ b/example/src/main/resources/mapper/notes/NotesMapper.xml
@@ -0,0 +1,45 @@
+
+
+
+
+    
+
+    
+
diff --git a/example/src/main/resources/mapper/paper/PaperMapper.xml b/example/src/main/resources/mapper/paper/PaperMapper.xml
index 5121031..46329a1 100644
--- a/example/src/main/resources/mapper/paper/PaperMapper.xml
+++ b/example/src/main/resources/mapper/paper/PaperMapper.xml
@@ -4,11 +4,11 @@
     
     
     
 
diff --git a/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml b/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml
index cf48279..b903a0e 100644
--- a/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml
+++ b/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml
@@ -1,5 +1,30 @@
 
 
 
-
+    
+    
 
diff --git a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java
index efc074e..11cdbb1 100644
--- a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java
+++ b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java
@@ -47,12 +47,12 @@ public class SpringBootPlusGenerator {
         generatorProperties
                 .setMavenModuleName("example")
                 .setParentPackage("com.example")
-                .setModuleName("userPaper")
+                .setModuleName("notes")
                 .setAuthor("limg")
                 .setFileOverride(true);
 
         // 设置表信息
-        generatorProperties.addTable("p_user_paper","id");
+        generatorProperties.addTable("p_notes","id");
         // 设置表前缀
         generatorProperties.setTablePrefix(Arrays.asList("p_"));
 
diff --git a/wechat/pom.xml b/wechat/pom.xml
index ef90ed5..147cb4e 100644
--- a/wechat/pom.xml
+++ b/wechat/pom.xml
@@ -18,6 +18,10 @@
             io.geekidea.boot
             framework
         
+        
+            io.geekidea.boot
+            example
+        
     
 
 
\ No newline at end of file
diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java
index 6d29293..8cf0907 100644
--- a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java
+++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java
@@ -2,8 +2,10 @@ package com.koronol.profile.controller;
 
 import cn.hutool.http.HttpUtil;
 import com.koronol.profile.entity.Profile;
+import com.koronol.profile.param.PhoneLoginParam;
 import com.koronol.profile.param.ProfileQueryParam;
 import com.koronol.profile.service.ProfileService;
+import com.koronol.profile.vo.ProfileInfoVo;
 import com.koronol.profile.vo.ProfileTokenVo;
 import lombok.extern.slf4j.Slf4j;
 import com.koronol.profile.param.ProfilePageParam;
@@ -81,9 +83,9 @@ public class ProfileController extends BaseController {
     @GetMapping("/info/{id}")
     @OperationLog(name = "用户信息详情", type = OperationLogType.INFO)
     @ApiOperation(value = "用户信息详情", response = Profile.class)
-    public ApiResult getProfile(@PathVariable("id") Long id) throws Exception {
-        Profile profile = profileService.getById(id);
-        return ApiResult.ok(profile);
+    public ApiResult getProfile(@PathVariable("id") Long id) throws Exception {
+        ProfileInfoVo profileInfoVo = profileService.getProfileInfo(id);
+        return ApiResult.ok(profileInfoVo);
     }
 
     /**
@@ -108,5 +110,13 @@ public class ProfileController extends BaseController {
         return ApiResult.ok(profileTokenVo);
     }
 
+    @RequestMapping("/signInByPhone")
+    @OperationLog(name = "小程序手机号登录", type = OperationLogType.OTHER)
+    @ApiOperation(value = "微信小程序手机号登录", response = Profile.class)
+    public ApiResult signInByPhone(@Validated @RequestBody PhoneLoginParam phoneLoginParam) throws Exception {
+        ProfileTokenVo profileTokenVo = profileService.signInByPhone(phoneLoginParam);
+        return ApiResult.ok(profileTokenVo);
+    }
+
 }
 
diff --git a/wechat/src/main/java/com/koronol/profile/entity/Profile.java b/wechat/src/main/java/com/koronol/profile/entity/Profile.java
index b18b9d6..d170e7d 100644
--- a/wechat/src/main/java/com/koronol/profile/entity/Profile.java
+++ b/wechat/src/main/java/com/koronol/profile/entity/Profile.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.*;
 
 import java.util.Date;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.geekidea.boot.framework.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -63,6 +64,7 @@ public class Profile extends BaseEntity {
 
     @ApiModelProperty("会员有效期")
     @TableField("VALID")
+    @JsonFormat(pattern="yyyy-MM-dd")
     private Date valid;
 
     @ApiModelProperty("乐观锁")
diff --git a/wechat/src/main/java/com/koronol/profile/param/PhoneLoginParam.java b/wechat/src/main/java/com/koronol/profile/param/PhoneLoginParam.java
new file mode 100644
index 0000000..c119d0e
--- /dev/null
+++ b/wechat/src/main/java/com/koronol/profile/param/PhoneLoginParam.java
@@ -0,0 +1,27 @@
+package com.koronol.profile.param;
+
+import io.geekidea.boot.framework.shiro.service.LoginUsername;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+@ApiModel("登录参数")
+public class PhoneLoginParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @NotBlank(message = "请输入code")
+    @ApiModelProperty(value = "code", example = "admin")
+    private String code;
+
+    @ApiModelProperty(value = "iv")
+    @NotBlank(message = "请输入iv")
+    private String iv;
+
+    @ApiModelProperty(value = "encryptedData")
+    @NotBlank(message = "请输入encryptedData")
+    private String encryptedData;
+}
diff --git a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java
index f7fea84..d41255b 100644
--- a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java
+++ b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java
@@ -1,8 +1,10 @@
 package com.koronol.profile.service;
 
 import com.koronol.profile.entity.Profile;
+import com.koronol.profile.param.PhoneLoginParam;
 import com.koronol.profile.param.ProfilePageParam;
 import com.koronol.profile.param.ProfileQueryParam;
+import com.koronol.profile.vo.ProfileInfoVo;
 import com.koronol.profile.vo.ProfileTokenVo;
 import io.geekidea.boot.framework.common.service.BaseService;
 import io.geekidea.boot.framework.core.pagination.Paging;
@@ -46,12 +48,26 @@ public interface ProfileService extends BaseService {
     /**
      * 获取分页对象
      *
-     * @param profileQueryParam
+     * @param profilePageParam
      * @return
      * @throws Exception
      */
     Paging getProfilePageList(ProfilePageParam profilePageParam) throws Exception;
 
+    /**
+     * 小程序通过openId登录
+     * @param profileQueryParam
+     * @return
+     * @throws Exception
+     */
     ProfileTokenVo signIn(ProfileQueryParam profileQueryParam) throws Exception;
 
+    /**
+     * 小程序通过手机号登录
+     * @param phoneLoginParam
+     * @return
+     */
+    ProfileTokenVo signInByPhone(PhoneLoginParam phoneLoginParam) throws Exception;
+
+    ProfileInfoVo getProfileInfo(Long id) throws Exception;
 }
diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java
index 5ed21bf..9a7fddf 100644
--- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java
+++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java
@@ -1,15 +1,21 @@
 package com.koronol.profile.service.impl;
 
+import cn.hutool.core.codec.Base64;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.example.history.entity.History;
+import com.example.history.service.HistoryService;
+import com.example.userPaper.service.UserPaperService;
 import com.koronol.profile.entity.Profile;
 import com.koronol.profile.mapper.ProfileMapper;
+import com.koronol.profile.param.PhoneLoginParam;
 import com.koronol.profile.param.ProfileQueryParam;
 import com.koronol.profile.service.ProfileService;
 import com.koronol.profile.param.ProfilePageParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.koronol.profile.vo.ProfileInfoVo;
 import com.koronol.profile.vo.ProfileTokenVo;
 import io.geekidea.boot.config.constant.CommonRedisKey;
 import io.geekidea.boot.config.properties.JwtProperties;
@@ -26,6 +32,7 @@ import io.geekidea.boot.framework.shiro.util.JwtUtil;
 import io.geekidea.boot.framework.shiro.util.SaltUtil;
 import io.geekidea.boot.framework.util.LoginUtil;
 import javafx.beans.property.LongPropertyBase;
+import lombok.val;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.AuthenticationException;
@@ -38,6 +45,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.spec.AlgorithmParameterSpec;
 import java.time.Duration;
 import java.util.HashMap;
 import java.util.Map;
@@ -72,7 +83,11 @@ public class ProfileServiceImpl extends BaseServiceImpl
 
     @Lazy
     @Autowired
-    private RedisTemplate redisTemplate;
+    private UserPaperService userPaperService;
+
+    @Lazy
+    @Autowired
+    private HistoryService historyService;
 
     @Transactional(rollbackFor = Exception.class)
     @Override
@@ -120,6 +135,65 @@ public class ProfileServiceImpl extends BaseServiceImpl
         profile.setOpenId(openId);
         profile.setAvatarUrl(profileQueryParam.getAvatarUrl());
         profile.setNickName(profileQueryParam.getNickName());
+        ProfileTokenVo profileTokenVo = getProfileTokenVo(profile);
+
+        return profileTokenVo;
+    }
+
+    @Override
+    public ProfileTokenVo signInByPhone(PhoneLoginParam phoneLoginParam) throws Exception {
+        Map data = new HashMap();
+        data.put("appid", appId);
+        data.put("secret", secret);
+        data.put("js_code", phoneLoginParam.getCode());
+        data.put("grant_type", "authorization_code");
+        String result = HttpUtil.get("https://api.weixin.qq.com/sns/jscode2session", data);
+        JSONObject response = JSONUtil.parseObj(result);
+        if (response.get("errcode") != null && !response.get("errcode").equals(0)) {
+            throw new AuthenticationException(response.getStr("errmsg"));
+        }
+        String openId = response.getStr("openid");
+        String sessionKey = response.getStr("session_key");
+        Profile profile = profileMapper.selectOne(new LambdaQueryWrapper().eq(Profile::getOpenId, openId));
+        if (profile == null) {
+            profile = new Profile();
+        }
+        System.out.println(phoneLoginParam.getEncryptedData() + "-------" + phoneLoginParam.getIv() + "-------" + sessionKey);
+
+        // 解密手机号
+        byte[] encData = Base64.decode(phoneLoginParam.getEncryptedData());
+        byte[] keyByte = Base64.decode(phoneLoginParam.getIv());
+        byte[] key = Base64.decode(sessionKey);
+
+        AlgorithmParameterSpec ivSpec = new IvParameterSpec(keyByte);
+        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
+        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);// 初始化
+        byte[] resultByte = cipher.doFinal(encData);
+        if (null != resultByte && resultByte.length > 0) {
+            String phoneStr = new String(resultByte, "UTF-8");
+            JSONObject phoneObj = JSONUtil.parseObj(phoneStr);
+            profile.setPhone(phoneObj.getStr("phoneNumber"));
+        }
+        profile.setOpenId(openId);
+
+        ProfileTokenVo profileTokenVo = getProfileTokenVo(profile);
+
+        return profileTokenVo;
+    }
+
+    @Override
+    public ProfileInfoVo getProfileInfo(Long id) throws Exception {
+        Integer score = userPaperService.getUserAvgScore();
+        Integer count = historyService.count(new LambdaQueryWrapper().eq(History::getUserId, LoginUtil.getAppUserId()));
+        ProfileInfoVo profileInfoVo = new ProfileInfoVo();
+        profileInfoVo.setCount(count);
+        profileInfoVo.setScore(score);
+
+        return profileInfoVo;
+    }
+
+    private ProfileTokenVo getProfileTokenVo(Profile profile) throws Exception {
         // 获取数据库中保存的盐值
         String newSalt = SaltUtil.getSalt("666", jwtProperties);
 
diff --git a/wechat/src/main/java/com/koronol/profile/vo/ProfileInfoVo.java b/wechat/src/main/java/com/koronol/profile/vo/ProfileInfoVo.java
new file mode 100644
index 0000000..fadbe35
--- /dev/null
+++ b/wechat/src/main/java/com/koronol/profile/vo/ProfileInfoVo.java
@@ -0,0 +1,21 @@
+package com.koronol.profile.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "ProfileInfoVo对象", description = "小程序用户信息对象")
+public class ProfileInfoVo implements Serializable {
+    private static final long serialVersionUID = 8394435375794488165L;
+
+    @ApiModelProperty("答题数")
+    private Integer count;
+
+    @ApiModelProperty("平均分")
+    private Integer score;
+}
diff --git a/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java b/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java
index 4551b29..cfdc85f 100644
--- a/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java
+++ b/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java
@@ -1,20 +1,24 @@
 package com.koronol.profile.vo;
 
 
+import com.alibaba.fastjson.annotation.JSONField;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
+import java.time.LocalDate;
 import java.util.Date;
 
 @Data
 @Accessors(chain = true)
 @ApiModel(value = "ProfileVo对象", description = "小程序用户对象")
 public class ProfileTokenVo implements Serializable {
-    private static final long serialVersionUID = 1L;
+
+    private static final long serialVersionUID = -6120449937867930830L;
 
     @ApiModelProperty("主键")
     private Long id;
@@ -38,7 +42,8 @@ public class ProfileTokenVo implements Serializable {
     private String isVip;
 
     @ApiModelProperty("会员有效期")
-    private Date valid;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate valid;
 
     @ApiModelProperty("token")
     private String token;
diff --git a/wechat/target/classes/com/koronol/profile/controller/ProfileController.class b/wechat/target/classes/com/koronol/profile/controller/ProfileController.class
index 88ec3ab39620b8b2a4fc8f96e5c9f2ab1e0dd0d3..45679fb52dc6a67d5a3873a445e83a9f1ab14730 100644
GIT binary patch
delta 1156
zcmZ{iSx-|@5Xb+gP)geiEffKj#l#KDQjCO>;07_Qtu2axB4{b4l;sv%Kykwz5ft%=
z3i{%M2~P^a1jLB()vsW9FtPC9iyy!k=K{AZm4`cbX70@V{%7u)F#a-Ce)~H&4
zG|=Ia8UikB(Tgh@T*WoXyDpgTUdwMx$BD6fm^$GG!5;iHMid5i9BG?-6~}?Dx3E
zGO?)F-r^Nq3=Q0-OIAz1#q0Kn{Jq8;PXlzF!Ia(Mb969daJw!kc4L+b`$PJjET8{~
zNaw$`F~_4#n{bJN$>F7m!NA<`;=thI>$$-2%+lDWz~@nhl)(JEpI_dD6!1!IH)p~~
z?n42C7*gSpfX5gXV8)PuLwF)!1WyHUJQHBWsDLwgE}#i77;<=_I*!+~q(~KB3K+xq
zbV^hy+Y{|}b=lXp$dI3AX?65COzjTQZL)YpcR{+mRe62m(NT<5NypW1+Jamf%irp{
znVRp^8<~+8>r0e*(8A1ZF%^74-=Qp|sEDFjrG-2zc?o=XtdG0&`ec;?*34N%PSUke
zU^`h2y@494td%OGj^HR5MM@N-gijd^*`N=qc6fIVf;vipUTMTLih3===lfsr~8Qj

delta 819
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
L*Ks-^goFPB4~Yw<

literal 9181
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
G(fTuC5_1s#T5mvj_$lysPKcU41K
z!?HlPXS$YASu|bGa_oi4(*okGKYA};Xr_qG
zzsV>n52`VSX5KJXs}*vpQChWZfxXRHp1)ab&NO1J33P27Eq5u?F1k0XzF9hL_=Z5=
zhPFi!J7(FIe_S9sm|Y}Trvk9HPg%A(Q(Ij!-SY;4k?=W1f^HCc?(0IuU$%%;ZmQ_4
z=2slov7Ji3>N;1gikYt(uCbb*U3P49$|+m+tlUeq%BCNl(leOtR1}p4le|MW*NNt9
zXkNp&cd*@6UO=Tq;LNqfIc9!ZGb+rt$@kpSHM8iCWiPUgoaQ#Es~FVrmrYk7F7G=K
zmNpT{>KiRkNZ|EQEZKA*Y{7eHsBe*`=6$2MGHp}?VEItk?2J`3>mLeUNFGXPg
z|1~d*nf&{k`;UIT_2{e5|GITIi6P{Ycn{XT
zs01Ru-}zwPSf7OtA!byord<*k>C}O3O<7NI4Es6edcahnU=RARi~Md*s0cFr5i`=g
z+{@kb)V<(gADtq2(WCZ&hXK4qbqZo9HVq;Y=(=YQ*ZuUQ!@-8dp?0T3G-F}fodz3D
z*>M=}wNkj4UG7Y>t8h6Xf!nL8oNO4{uF6C!t8oYNhh
z*$Ew-qpi+;9i7=h9h{X`=RF;rU&HHl=K?Pok(V6G{ftQGOZSBq^-D`YWMw5*Z*-0m
zebzX#&N9x?&T*7yjU!7h
zY{_Ud!z2Y|@B8y|{sK_F06l#KLjPqHNY8-Xf=Ps+_^w
z*{OaNfc86?yD;tEaqewhO
zP(pkf6ACq1JEs{YQP9uE(!rxnE<&f-0$qjEG(k&7TfI?Yt0
zIKZbgLrx*cyKs)28o+iPv8NO$giQ!S#Xnw8X}-CSNI@^uhC#zdX%^MZVq45MEnB5D
zW}2MeA$GXTROL__y^rLDdq}0Xtz)}{kW0EdjTsr)CmS;-nXxc32r>vUFfy_8D=1`%Wt1||kxpez%E
KD1#W776$-`A}5ak

delta 58
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 eKKw}bDWdgbnXC!BuyK#3@M_(9U zlo=m*!5POHAMinVr~`~z2AuKof;0XNKH65_eH8I`vYWQ4nSq()obP=1@ArM@>~H_x z`4PYX-if0bV+~O7id@EHn22*fCYR$sgL{YV@Fh7!zn3acs{wY=6oqmQB^apk25&5H$tVyi>M)fvw}` zjCmtdH0;^TsO_7xrkfQ=O;TvhnNyZ$O&85!+je}zr(;i`d)#s|-uuQZRWrt#Br{yH zCY%|wc*1o`rt5z|KkB>;E6}j=&E>zo`h5Ab8{~O;$CbRL+utsI`N`77j|H@SmTmd_ z1)}NhDFJ1Kegrm;Tef+uJU4B+Ck>_{&^+$sS){>Ic@CM1U$B_h&hfl6mpSjaj_njP zCD%D?70t}NlVLuR9JS9nQx22TXH9=3sJ=DbUAKOzk_*z*y;bdOx{h-9Lx-iK(5Gg; zS2l{wxplqA@s?cPCf0r1E9eaoUAjAf5#Hi8 zcR|bPr^4cu%T+G8^dY=MHn#F)B8Ol zJsZt~#M=UuFmWn}Sg`^19Yr77QGl(GqZnrNH-p8PQK7fzYpBXX?=MikfEr!s{Ta$c zU(X`c%8`V2tdGl}(*G+OQ_5Xzxr#)8N?Am#s-X|6RM7{ulqz+!yJ)_Orj(k}s!GZN zV@0vCS4V>!R!c5mH}){YR^;#u`xl|bK|D)dls9NUKZJWYTt_$%&yi9w!9jYSl!h1R zpTiQ<|G}mhUc864820j~i+gw^ARG9Vkk>LqU@v#s6IGTj)04q!M=9utx|*KKq-1(R z-sI5D@3d2CH<--sQ-&&Vbtba~f~6;WuOimJh=zA1UmsMYAf<#7T|!7vXMJb}0mJT8AQ)%rSk&ITTRfVdK zQp=(m UKU8@UlJtL=C%y7B8@PF-SiQ zt8*9j7v1l6pyv-yIVE%ce0 zv9$lS=xwi7=h9E6# z^$%}0N3a(!``Yb=oaKD6e)HIwsY92ij$gWY`aJC5Dcg-R`bUTCEQ~@^hmTC1yf!(0 z85pN7n7N&~42YAjT%0^O4uE?W#&FDeH=mrCdhGF*yE~^|e|hrCmA~J3YFX#x6W4EE ze+KTXe4jNcNS``>Zu03<@7_2udGxqEE=QzM9*rY_i1eG8b!H)r>qI4S>g3_6XAe!C zd{IzmPrp5q+HK|w>D;3unbaP$e>iVv%i@ySg!KkHH)0mxAvkIlK+OsY@58^&-rmju zzFxr|PGd8$%F0@Wdj)xywDt+|twlWXwLMlgy?Jb8S30-DL^?Qje5yVZ$;Mi3`U*o9 zF22|~(y*PgvvwvmnzMIXnRIHeokCt1?%=QLvpGA1=>i8gzNED*7pepzP;Q=1R>KU+ zbh<(yZBZ%GfVavl>40lW$zj%Zl@?}o%iuFaL2|(76y47XIg^|dZ-XCv~aneTCp_`trcV%LA5Q9?R*=0~aq3s4jo6Iz`3Zt3QYaUn)j{^uuFj z2362lezh&T_N4m@U9Asd9N05EPpJ@HyD*f_p+dQelAILH*>PZvvsvohTB#~+L>xk~ zTXm@}F2jyeb#O%L)T-7|l{Ioys>^ny>tb6g*TtoDt-4vcRx7E(0OGqSm0C%a>N%xS zs~Y60f4J8ib(#vZ9HSMX=r^}k;wwqI$E4`0qPws(+QI-nKH?8k|v>(HVK`?0g6_g#_4`MZA(X#y(g%_*}_wG zyYuw6_RAq3Fh?<3QM{eyy*xdpN`7Ws6*-;3FZO=f%$&)mg?RT^OoEnBnC4L{wE?%| z?Z-nM_(P7dz8mWZK9}Kdd7eH31@b;y@i8b+3$qpXK!N(0tyl>KYG$^g3kuZHY{hCQ zP+PMVpMV1OrW6fWspH;9Yq7a5PwTOVVw`Qdf#zTnMGe`FyYig{KK*T%NnCJ(u?aHZ zY{ux*z`7(*5A|XtxMU$`8eb&O`3mE?uEwZx7h`XwakHy2y2HiTS82S!)fipnV(hOp zUg&C!ZgepYR2nB;jnTy}#=%PC#jeKaeivh{(zwml7*oT=I8F^XX}rwU z_(A%dGUoF3pf-YS?U%^YR%tG4tVvQ-je)G%QPAh<3vQ0QRXdXHE9i^vj(k-+lI>Fy|4wIexx1nqKnq*d)mjw?a^G~kxCP}Pp)coUR% zKT)`9M{)`Ze#XiZd47jlYs4TMZf`q9e&5;lUsB`*`Mqb`-=auwN81GH&Jv(za|eXs z>-;rE627;o?lkG03Eu?O78y~)4@%SsB>cR^u1BK{$dI$R!p86AXiSj@Zx1i4Rs-ZvAle8D8 z77xT>dITsc0;s@8fns729;o|(>O?ypzWagVViVpez6?|^wo)@40BWGG;I1RIAgKL^ zYJ>FE_oyjIU&DV*yhn2-4E=v0f`WHR)o&~D$>Y|~WzBK-%!<1lw*F$=5y?F`Ill+s z-BP;o9*3O{>wm?%R{2&ttuQ~>R-s>{RonSjsT`0P5 z0r~I>ca;tS`SJe#0v!elp!5!+*tlTFQS?WEG

!{}fP&enrda+dyIZ6JFQ80~F!1 z@^~qJ3mZO^l@KT;65 z?mA@{ax*O1-d3&5!?!Und3ZmDauT_{lail1kd!O^eO;Bj-I)i6C^!7Pl3hxtP;&hC ze&9OIec&=B;`1h`nVWTj=EpxEaTFi%1rlSnH^)CHaUJ6pi80Qb;|nFOXZ#_FF~OVT zcS+pHK9dqR@%|!+3Hq@63!VJYa6q++2Q!u@(NX93RSakTE>`$`^$Z=$)3g5r6VrN6 literal 5671 zcmb_gU364e75>g-e(ucNB$LSx3{VU*6!O=!)mpiMY6=vCNkD$0t$!VoA-QBSlg>=2 zMYOGGg;EU&wTReSTLCLApb&m_>4SAGpM2<(zUW#_&1t4g6Goo|WQF18*5P zXW+bn3kH5>;O7P|8n|R&O6o5Ma3z4N0+C!YYbR0z$!yNfq<8eJ7Z95Ss@G-GxqKp> zA4sGol0HTz{}Tcpdx%E8yAyj7ovB26xU)Bt9_|u|ZJkKx?Xl#5owIkQlHKWaCZEXD zWlo@_*Uoh2o=gl6C$pW2qNcNZ-0sT^B~x3nnek*c{}lcB_Q)?3@V|TI`d^Q|C19lO z!O{N27}ugDU%M@zwVf|EZyq}{bKvsK@k=*PpQjx?rF*zX-}p!-O{3tn>?u`@EM~KufC-O-~QmZ&KClAiNcwpw_D1XC#E%?$Er5qT#V#O7vK z_6}yoI!80vOgfY59M5KU*{Njbo=himDdBecRRbBB(cxrXCM3G5r6hm)*uqry&nCEG z4rMmQL6SD>v>L=)RAx=W?qWhEYnx7`Wc8?oNys9SNt)e3X_}BCngdp zo_%9!RGWA1P7da~S{`HLX6E*YRxz=e{75n@5RkPKmq%eZD-Nu77K>e0qg2I(utO;H zm8sN)$B?7cy%ttF{Z!+qN?NW~sY_Or>p}x+*M&#rTKAoHt)G;Nqe8}_Rr*P(bf;;R zeyZj%4UYCD#+_E;)a4LlDh3nj4KlNYBZ=II>PEI^4->a#Yfs+>W|r8WP39(2d3LRn zwqU%Np+LNl4u4z+ABvZR8Hg8R^2c=q{H?diYEmC|+ zimg&?lVUq|m>7`gt9V*qLGjK}d3t!lP7TSjj?T@{DtlA7O|xRKZVQ>t%=wP7XFw`klpUe1h0i1oU7NpMYRsl^G4_@lFLE_zGr1W1%8l=GHD(jK82ihOn_Z3B zye`Ipa^vN$#%y{QW24;oZdYRt3m4;Hxp9lDF^7zcaj4w5-PQQh_>4A|RqbJI1X|lJ z!P8o9u4=4FQFM)wth-R)Q9S16sH$Q|s%r&4>+Z-~u_M*x0-tkt_|;1fya?>JGEfNj?`2W*y+BbP{oea6cqAmRXg(h zp0(DIsUg1J&o#^FXk^HMXUfx5zB}LB+1aEK+Gs1)mcH3>a0*KC`lnr z3dTYuq^K1pDQcOquq2t9L{vhmx2j31w`yY5l2oHf)v=lqQiD}XQiBzV)k;!ClWJp; z5>lg8M^d8|jnzp~RFmpr(GpUVRZmir)ex(fqy|l@k2MrX-m~ogDwJO=@2F!aG`$!_ z61#XvjbZ@9ylgy(i;WoJS`}JFH*6v=Hi|fQ6Zz05mSU91j}&h4Zx_c#7XQW=k%1%l z1JXo6yo7g_IGsJsXs9^B_ z3z-zYLh627%}+UQeX^`&-aYg3u7<6zkauQsm^+v60eq!YZmN#c&ZPCfB3)~|Yn@hD z66qRYBN&mk(+G4-VZq~az1H$dMa-);hHMX|ida5J#m;byjF_*WswB+6>SwLsOl}lQ5mx;HjuJvu!4??y`!yy1y!RJa#W#N6+22}5Ph%x{oH}1U77Fes_5;`JUV2#@mH1VQk-JR$+!1?*Rk-?%ZNo6O<}QY)+sEB z-lcFYKcY(&=4@Xa{eZ%C5;rT%alSaZOyPQoKd3M#_~Phtg&U>MxWY|xeFeo7?sk8n iQ$HH^=~nUJTh1i Date: Thu, 18 Feb 2021 23:14:06 +0800 Subject: [PATCH 10/36] commit chapter list --- .../chapter/controller/ChapterController.java | 104 ++++++++++++++++++ .../com/example/chapter/entity/Chapter.java | 60 ++++++++++ .../example/chapter/mapper/ChapterMapper.java | 24 ++++ .../chapter/param/ChapterPageParam.java | 23 ++++ .../chapter/service/ChapterService.java | 53 +++++++++ .../service/impl/ChapterServiceImpl.java | 58 ++++++++++ .../paper/controller/PaperController.java | 1 + .../controller/QuestionController.java | 16 +++ .../com/example/question/entity/Question.java | 26 ++++- .../question/param/QuestionPageParam.java | 7 +- .../example/question/param/QuestionParam.java | 44 ++++++++ .../question/service/QuestionService.java | 3 + .../service/impl/QuestionServiceImpl.java | 28 ++++- .../example/question/vo/QuestionPageVo.java | 15 +++ .../mapper/chapter/ChapterMapper.xml | 5 + .../mapper/question/QuestionMapper.xml | 16 ++- .../generator/SpringBootPlusGenerator.java | 4 +- 17 files changed, 478 insertions(+), 9 deletions(-) create mode 100644 example/src/main/java/com/example/chapter/controller/ChapterController.java create mode 100644 example/src/main/java/com/example/chapter/entity/Chapter.java create mode 100644 example/src/main/java/com/example/chapter/mapper/ChapterMapper.java create mode 100644 example/src/main/java/com/example/chapter/param/ChapterPageParam.java create mode 100644 example/src/main/java/com/example/chapter/service/ChapterService.java create mode 100644 example/src/main/java/com/example/chapter/service/impl/ChapterServiceImpl.java create mode 100644 example/src/main/java/com/example/question/param/QuestionParam.java create mode 100644 example/src/main/resources/mapper/chapter/ChapterMapper.xml diff --git a/example/src/main/java/com/example/chapter/controller/ChapterController.java b/example/src/main/java/com/example/chapter/controller/ChapterController.java new file mode 100644 index 0000000..fd49772 --- /dev/null +++ b/example/src/main/java/com/example/chapter/controller/ChapterController.java @@ -0,0 +1,104 @@ +package com.example.chapter.controller; + +import com.example.chapter.entity.Chapter; +import com.example.chapter.service.ChapterService; +import lombok.extern.slf4j.Slf4j; +import com.example.chapter.param.ChapterPageParam; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.common.param.IdParam; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 控制器 + * + * @author limg + * @since 2021-02-18 + */ +@Slf4j +@RestController +@RequestMapping("/chapter") +@Module("chapter") +@Api(value = "章节管理API", tags = {"章节管理"}) +public class ChapterController extends BaseController { + + @Autowired + private ChapterService chapterService; + + /** + * 添加 + */ + @PostMapping("/submit") + @OperationLog(name = "添加", type = OperationLogType.ADD) + @ApiOperation(value = "添加", response = ApiResult.class) + @CacheEvict(cacheNames = "chapter", allEntries = true) + public ApiResult addChapter(@Validated(Add.class) @RequestBody Chapter chapter) throws Exception { +// boolean flag = chapterService.saveChapter(chapter); + boolean flag = chapter.insertOrUpdate(); + return ApiResult.result(flag); + } + + /** + * 删除 + */ + @PostMapping("/delete/{id}") + @OperationLog(name = "删除", type = OperationLogType.DELETE) + @ApiOperation(value = "删除", response = ApiResult.class) + @CacheEvict(cacheNames = "chapter", allEntries = true) + public ApiResult deleteChapter(@PathVariable("id") Long id) throws Exception { + boolean flag = chapterService.deleteChapter(id); + return ApiResult.result(flag); + } + + /** + * 获取详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "详情", type = OperationLogType.INFO) + @ApiOperation(value = "详情", response = Chapter.class) + public ApiResult getChapter(@PathVariable("id") Long id) throws Exception { + Chapter chapter = chapterService.getById(id); + return ApiResult.ok(chapter); + } + + /** + * 分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "分页列表", response = Chapter.class) + @Cacheable(cacheNames = "chapter", key = "#chapterPageParam.getPageIndex()+'::'+#chapterPageParam.getPageSize()") + public ApiResult> getChapterPageList(@Validated @RequestBody ChapterPageParam chapterPageParam) throws Exception { + Paging paging = chapterService.getChapterPageList(chapterPageParam); + return ApiResult.ok(paging); + } + + /** + * 分页列表 + */ + @GetMapping("/wechat/getPageList") + @OperationLog(name = "小程序端分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "小程序端分页列表", response = Chapter.class) + @Cacheable(cacheNames = "chapter", key = "#root.methodName") + public ApiResult> getWechatChapterPageList() throws Exception { + ChapterPageParam chapterPageParam = new ChapterPageParam(); + chapterPageParam.setPageIndex(1L); + chapterPageParam.setPageSize(100L); + Paging paging = chapterService.getChapterPageList(chapterPageParam); + return ApiResult.ok(paging); + } + +} + diff --git a/example/src/main/java/com/example/chapter/entity/Chapter.java b/example/src/main/java/com/example/chapter/entity/Chapter.java new file mode 100644 index 0000000..e412faf --- /dev/null +++ b/example/src/main/java/com/example/chapter/entity/Chapter.java @@ -0,0 +1,60 @@ +package com.example.chapter.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.util.Date; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import io.geekidea.boot.framework.core.validator.groups.Update; + +/** + * + * + * @author limg + * @since 2021-02-18 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("p_chapter") +@ApiModel(value = "Chapter对象") +public class Chapter extends Model { + private static final long serialVersionUID = 1L; + + @NotNull(message = "id不能为空", groups = {Update.class}) + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("章节名称") + @TableField("NAME") + private String name; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + private Integer revision; + + @ApiModelProperty("创建人") + @TableField(value = "CREATED_BY", fill = FieldFill.INSERT) + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE) + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/example/src/main/java/com/example/chapter/mapper/ChapterMapper.java b/example/src/main/java/com/example/chapter/mapper/ChapterMapper.java new file mode 100644 index 0000000..5141079 --- /dev/null +++ b/example/src/main/java/com/example/chapter/mapper/ChapterMapper.java @@ -0,0 +1,24 @@ +package com.example.chapter.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.chapter.entity.Chapter; +import com.example.chapter.param.ChapterPageParam; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import java.io.Serializable; + +/** + * Mapper 接口 + * + * @author limg + * @since 2021-02-18 + */ +@Repository +public interface ChapterMapper extends BaseMapper { + + +} diff --git a/example/src/main/java/com/example/chapter/param/ChapterPageParam.java b/example/src/main/java/com/example/chapter/param/ChapterPageParam.java new file mode 100644 index 0000000..e7e8415 --- /dev/null +++ b/example/src/main/java/com/example/chapter/param/ChapterPageParam.java @@ -0,0 +1,23 @@ +package com.example.chapter.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; + +/** + *

+ *  分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-18 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "分页参数") +public class ChapterPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/chapter/service/ChapterService.java b/example/src/main/java/com/example/chapter/service/ChapterService.java new file mode 100644 index 0000000..9e4e8d0 --- /dev/null +++ b/example/src/main/java/com/example/chapter/service/ChapterService.java @@ -0,0 +1,53 @@ +package com.example.chapter.service; + +import com.example.chapter.entity.Chapter; +import com.example.chapter.param.ChapterPageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +/** + * 服务类 + * + * @author limg + * @since 2021-02-18 + */ +public interface ChapterService extends BaseService { + + /** + * 保存 + * + * @param chapter + * @return + * @throws Exception + */ + boolean saveChapter(Chapter chapter) throws Exception; + + /** + * 修改 + * + * @param chapter + * @return + * @throws Exception + */ + boolean updateChapter(Chapter chapter) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteChapter(Long id) throws Exception; + + + /** + * 获取分页对象 + * + * @param chapterQueryParam + * @return + * @throws Exception + */ + Paging getChapterPageList(ChapterPageParam chapterPageParam) throws Exception; + +} diff --git a/example/src/main/java/com/example/chapter/service/impl/ChapterServiceImpl.java b/example/src/main/java/com/example/chapter/service/impl/ChapterServiceImpl.java new file mode 100644 index 0000000..0bb526d --- /dev/null +++ b/example/src/main/java/com/example/chapter/service/impl/ChapterServiceImpl.java @@ -0,0 +1,58 @@ +package com.example.chapter.service.impl; + +import com.example.chapter.entity.Chapter; +import com.example.chapter.mapper.ChapterMapper; +import com.example.chapter.service.ChapterService; +import com.example.chapter.param.ChapterPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 服务实现类 + * + * @author limg + * @since 2021-02-18 + */ +@Slf4j +@Service +public class ChapterServiceImpl extends BaseServiceImpl implements ChapterService { + + @Autowired + private ChapterMapper chapterMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean saveChapter(Chapter chapter) throws Exception { + return super.save(chapter); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateChapter(Chapter chapter) throws Exception { + return super.updateById(chapter); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deleteChapter(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Paging getChapterPageList(ChapterPageParam chapterPageParam) throws Exception { + Page page = new PageInfo<>(chapterPageParam, OrderItem.asc(getLambdaColumn(Chapter::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = chapterMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + +} diff --git a/example/src/main/java/com/example/paper/controller/PaperController.java b/example/src/main/java/com/example/paper/controller/PaperController.java index 8883238..760d0bb 100644 --- a/example/src/main/java/com/example/paper/controller/PaperController.java +++ b/example/src/main/java/com/example/paper/controller/PaperController.java @@ -108,6 +108,7 @@ public class PaperController extends BaseController { return ApiResult.ok(paging); } + @GetMapping("/wechat/getOpenPaper") @OperationLog(name = "获取开放试卷分页列表", type = OperationLogType.PAGE) @ApiOperation(value = "获取开放试卷分页列表", response = Paper.class) diff --git a/example/src/main/java/com/example/question/controller/QuestionController.java b/example/src/main/java/com/example/question/controller/QuestionController.java index 888bc5e..166d785 100644 --- a/example/src/main/java/com/example/question/controller/QuestionController.java +++ b/example/src/main/java/com/example/question/controller/QuestionController.java @@ -2,6 +2,7 @@ package com.example.question.controller; import com.example.question.entity.Question; import com.example.question.param.QuestionAnswerParam; +import com.example.question.param.QuestionParam; import com.example.question.service.QuestionService; import com.example.question.vo.QuestionPageVo; import io.geekidea.boot.framework.common.api.ApiResult; @@ -14,6 +15,7 @@ import io.geekidea.boot.framework.log.annotation.OperationLog; import io.geekidea.boot.framework.log.enums.OperationLogType; import lombok.extern.slf4j.Slf4j; import com.example.question.param.QuestionPageParam; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.validation.annotation.Validated; import io.swagger.annotations.Api; @@ -43,6 +45,7 @@ public class QuestionController extends BaseController { @PostMapping("/submit") @OperationLog(name = "添加题目信息", type = OperationLogType.ADD) @ApiOperation(value = "添加题目信息", response = ApiResult.class) + @CacheEvict(cacheNames = "question", allEntries = true) public ApiResult addQuestion(@Validated(Add.class) @RequestBody Question question) throws Exception { // boolean flag = questionService.saveQuestion(question); boolean flag = question.insertOrUpdate(); @@ -55,6 +58,7 @@ public class QuestionController extends BaseController { @PostMapping("/update") @OperationLog(name = "修改题目信息", type = OperationLogType.UPDATE) @ApiOperation(value = "修改题目信息", response = ApiResult.class) + @CacheEvict(cacheNames = "question", allEntries = true) public ApiResult updateQuestion(@Validated(Update.class) @RequestBody Question question) throws Exception { boolean flag = questionService.updateQuestion(question); return ApiResult.result(flag); @@ -101,6 +105,18 @@ public class QuestionController extends BaseController { return ApiResult.ok(paging); } + /** + * 题目分页列表 + */ + @PostMapping("/getList") + @OperationLog(name = "题目信息分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "题目信息分页列表", response = Question.class) + @Cacheable(cacheNames = "question", key = "#p0.toString()") + public ApiResult> getPageList(@Validated @RequestBody QuestionParam questionParam) throws Exception { + Paging paging = questionService.getPageList(questionParam); + return ApiResult.ok(paging); + } + @PostMapping("/submitAnswer") @OperationLog(name = "提交答案", type = OperationLogType.ADD) @ApiOperation(value = "提交答案", response = Question.class) diff --git a/example/src/main/java/com/example/question/entity/Question.java b/example/src/main/java/com/example/question/entity/Question.java index e51fef9..ea0a3b4 100644 --- a/example/src/main/java/com/example/question/entity/Question.java +++ b/example/src/main/java/com/example/question/entity/Question.java @@ -35,7 +35,6 @@ public class Question extends Model { @ApiModelProperty("题目编号") @TableField("SERIAL") - @NotNull(message = "题目编号不能为空") private Integer serial; @ApiModelProperty("标题") @@ -43,9 +42,12 @@ public class Question extends Model { @NotNull(message = "标题不能为空") private String subject; + @ApiModelProperty("标题-英文") + @TableField("SUBJECT_EN") + private String subjectEn; + @ApiModelProperty("所属试卷") @TableField("PAPER_ID") - @NotNull(message = "请选择所属试卷") private Integer paperId; @ApiModelProperty("图片") @@ -56,18 +58,34 @@ public class Question extends Model { @TableField("OPTION_A") private String optionA; + @ApiModelProperty("选项A-英文") + @TableField("OPTION_A_EN") + private String optionAEn; + @ApiModelProperty("选项B") @TableField("OPTION_B") private String optionB; + @ApiModelProperty("选项B-英文") + @TableField("OPTION_B_EN") + private String optionBEn; + @ApiModelProperty("选项C") @TableField("OPTION_C") private String optionC; + @ApiModelProperty("选项C-英文") + @TableField("OPTION_C_EN") + private String optionCEn; + @ApiModelProperty("选项D") @TableField("OPTION_D") private String optionD; + @ApiModelProperty("选项D-英文") + @TableField("OPTION_D_EN") + private String optionDEn; + @ApiModelProperty("正确答案") @TableField("ANSWER") @NotNull(message = "请选择正确答案") @@ -81,6 +99,10 @@ public class Question extends Model { @TableField("GOURP_ID") private String gourpId; + @ApiModelProperty("所属章节") + @TableField("CHAPTER_ID") + private Integer chapterId; + @ApiModelProperty("乐观锁") @TableField("REVISION") private Integer revision; diff --git a/example/src/main/java/com/example/question/param/QuestionPageParam.java b/example/src/main/java/com/example/question/param/QuestionPageParam.java index 0b91282..e187387 100644 --- a/example/src/main/java/com/example/question/param/QuestionPageParam.java +++ b/example/src/main/java/com/example/question/param/QuestionPageParam.java @@ -25,6 +25,11 @@ public class QuestionPageParam extends BasePageOrderParam { private static final long serialVersionUID = 1L; @ApiModelProperty("试卷id") - @NotNull(message = "请输入试卷编号") private String paperId; + + @ApiModelProperty("所属专题id") + private String groupId; + + @ApiModelProperty("所属章节id") + private String chapterId; } diff --git a/example/src/main/java/com/example/question/param/QuestionParam.java b/example/src/main/java/com/example/question/param/QuestionParam.java new file mode 100644 index 0000000..757733e --- /dev/null +++ b/example/src/main/java/com/example/question/param/QuestionParam.java @@ -0,0 +1,44 @@ +package com.example.question.param; + +import cn.hutool.core.text.StrFormatter; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "题目信息分页参数") +public class QuestionParam extends BasePageOrderParam { + + private static final long serialVersionUID = 5431374571367066733L; + + @ApiModelProperty("试卷id") + private String paperId; + + @ApiModelProperty("标题") + private String subject; + + @ApiModelProperty("专项ID") + private String groupId; + + @ApiModelProperty("章节ID") + private String chapterId; + + @Override + public String toString() { + String key = StrFormatter.format("{}-{}-{}-{}-{}", this.getSubject() == null ? "" : this.getSubject(), + this.getChapterId() == null ? "" : this.getChapterId(), + this.getGroupId() == null ? "" : this.getGroupId(), + this.getPageIndex() == null ? "1" : this.getPageIndex(), + this.getPageSize() == null ? "10" : this.getPageSize()); + System.out.printf("key:", key); + return key; + } + +} diff --git a/example/src/main/java/com/example/question/service/QuestionService.java b/example/src/main/java/com/example/question/service/QuestionService.java index 8066fda..1698b43 100644 --- a/example/src/main/java/com/example/question/service/QuestionService.java +++ b/example/src/main/java/com/example/question/service/QuestionService.java @@ -3,6 +3,7 @@ package com.example.question.service; import com.example.question.entity.Question; import com.example.question.param.QuestionAnswerParam; import com.example.question.param.QuestionPageParam; +import com.example.question.param.QuestionParam; import com.example.question.vo.QuestionPageVo; import io.geekidea.boot.framework.common.service.BaseService; import io.geekidea.boot.framework.core.pagination.Paging; @@ -55,4 +56,6 @@ public interface QuestionService extends BaseService { Paging getQuestionPageList(QuestionPageParam questionPageParam) throws Exception; Boolean sumitAnswer(QuestionAnswerParam questionAnswerParam) throws Exception; + + Paging getPageList(QuestionParam questionParam); } diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java index baa6bf0..f3a5a7a 100644 --- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java +++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java @@ -1,6 +1,7 @@ package com.example.question.service.impl; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; import com.example.history.entity.History; import com.example.history.service.HistoryService; import com.example.notes.entity.Notes; @@ -8,13 +9,13 @@ import com.example.notes.service.NotesService; import com.example.question.entity.Question; import com.example.question.mapper.QuestionMapper; import com.example.question.param.QuestionAnswerParam; +import com.example.question.param.QuestionParam; import com.example.question.service.QuestionService; import com.example.question.param.QuestionPageParam; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.example.question.vo.QuestionPageVo; import com.example.userPaper.entity.UserPaper; import com.example.userPaper.service.UserPaperService; -import io.geekidea.boot.config.constant.CommonRedisKey; import io.geekidea.boot.framework.common.exception.BusinessException; import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; import io.geekidea.boot.framework.core.pagination.PageInfo; @@ -22,7 +23,6 @@ import io.geekidea.boot.framework.core.pagination.Paging; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.geekidea.boot.framework.shiro.vo.LoginSysUserRedisVo; import io.geekidea.boot.framework.util.LoginUtil; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.RedisTemplate; @@ -87,7 +87,12 @@ public class QuestionServiceImpl extends BaseServiceImpl getQuestionPageList(QuestionPageParam questionPageParam) throws Exception { - String key = String.format("questionList-%s-%s-%d-%d", LoginUtil.getAppUserId(), questionPageParam.getPaperId(), questionPageParam.getPageIndex(), questionPageParam.getPageSize()); + String key = String.format("questionList-%s-%s-%s-%s-%d-%d", LoginUtil.getAppUserId(), + questionPageParam.getPaperId(), + questionPageParam.getGroupId(), + questionPageParam.getChapterId(), + questionPageParam.getPageIndex(), + questionPageParam.getPageSize()); IPage redisList = (IPage) redisTemplate.opsForValue().get(key); if (redisList != null) { return new Paging(redisList); @@ -143,4 +148,21 @@ public class QuestionServiceImpl extends BaseServiceImpl getPageList(QuestionParam questionParam) { + Page page = new PageInfo<>(questionParam, OrderItem.asc(getLambdaColumn(Question::getId))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if(StrUtil.isNotEmpty(questionParam.getSubject())) { + wrapper.like(Question::getSubject, questionParam.getSubject()); + } + if(StrUtil.isNotEmpty(questionParam.getChapterId())) { + wrapper.eq(Question::getChapterId, questionParam.getChapterId()); + } + if(StrUtil.isNotEmpty(questionParam.getGroupId())) { + wrapper.eq(Question::getGourpId, questionParam.getGroupId()); + } + IPage iPage = questionMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + } diff --git a/example/src/main/java/com/example/question/vo/QuestionPageVo.java b/example/src/main/java/com/example/question/vo/QuestionPageVo.java index e24fef5..a62936b 100644 --- a/example/src/main/java/com/example/question/vo/QuestionPageVo.java +++ b/example/src/main/java/com/example/question/vo/QuestionPageVo.java @@ -26,6 +26,9 @@ public class QuestionPageVo implements Serializable { @ApiModelProperty("标题") private String subject; + @ApiModelProperty("标题-英文") + private String subjectEn; + @ApiModelProperty("所属试卷") private Integer paperId; @@ -35,15 +38,27 @@ public class QuestionPageVo implements Serializable { @ApiModelProperty("选项A") private String optionA; + @ApiModelProperty("选项A-英文") + private String optionAEn; + @ApiModelProperty("选项B") private String optionB; + @ApiModelProperty("选项B-英文") + private String optionBEn; + @ApiModelProperty("选项C") private String optionC; + @ApiModelProperty("选项C-英文") + private String optionCEn; + @ApiModelProperty("选项D") private String optionD; + @ApiModelProperty("选项D-英文") + private String optionDEn; + @ApiModelProperty("正确答案") private String answer; diff --git a/example/src/main/resources/mapper/chapter/ChapterMapper.xml b/example/src/main/resources/mapper/chapter/ChapterMapper.xml new file mode 100644 index 0000000..30e9e95 --- /dev/null +++ b/example/src/main/resources/mapper/chapter/ChapterMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/example/src/main/resources/mapper/question/QuestionMapper.xml b/example/src/main/resources/mapper/question/QuestionMapper.xml index c255dc6..823fa60 100644 --- a/example/src/main/resources/mapper/question/QuestionMapper.xml +++ b/example/src/main/resources/mapper/question/QuestionMapper.xml @@ -6,10 +6,15 @@ t.ID, t.IMG_URL, t.`SUBJECT`, + t.`SUBJECT_EN`, t.OPTION_A, + t.OPTION_A_EN, t.OPTION_B, + t.OPTION_B_EN, t.OPTION_C, + t.OPTION_C_EN, t.OPTION_D, + t.OPTION_D_EN, t.SERIAL, t.PAPER_ID, t.ANSWER, @@ -25,6 +30,15 @@ p_question t LEFT JOIN ( SELECT t1.QUESTION_ID, t1.ID FROM p_favor t1 WHERE t1.USER_ID = #{userId} ) t2 ON t.ID = t2.QUESTION_ID WHERE - t.PAPER_ID = #{param.paperId} + 1 = 1 + + and t.PAPER_ID = #{param.paperId} + + + and t.GROUP_ID = #{param.groupId} + + + and t.CHAPTER_ID = #{param.chapterId} + diff --git a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java index 11cdbb1..c22823a 100644 --- a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java +++ b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java @@ -47,12 +47,12 @@ public class SpringBootPlusGenerator { generatorProperties .setMavenModuleName("example") .setParentPackage("com.example") - .setModuleName("notes") + .setModuleName("chapter") .setAuthor("limg") .setFileOverride(true); // 设置表信息 - generatorProperties.addTable("p_notes","id"); + generatorProperties.addTable("p_chapter","id"); // 设置表前缀 generatorProperties.setTablePrefix(Arrays.asList("p_")); -- Gitee From 0e88053088318efb96a3c3eff292ca5a2e1a6388 Mon Sep 17 00:00:00 2001 From: limingguang Date: Sat, 20 Feb 2021 09:37:19 +0800 Subject: [PATCH 11/36] commit code --- .../resources/config/application-prod.yml | 26 ++++++-- .../favorite/controller/FavorController.java | 3 + .../controller/QuestionController.java | 12 ++-- .../question/param/QuestionPageParam.java | 14 ++++ .../service/impl/QuestionServiceImpl.java | 25 +++---- .../system/controller/UploadController.java | 61 +++++++++++------- .../system/service/UploadService.java | 2 +- .../service/impl/UploadServiceImpl.java | 4 +- wechat/target/maven-archiver/pom.properties | 5 -- .../compile/default-compile/createdFiles.lst | 6 -- .../compile/default-compile/inputFiles.lst | 6 -- .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 wechat/target/wechat-2.1-SNAPSHOT.jar | Bin 12314 -> 0 bytes 14 files changed, 99 insertions(+), 65 deletions(-) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/UploadService.java (92%) rename system/src/main/java/io/geekidea/{springbootplus => boot}/system/service/impl/UploadServiceImpl.java (94%) delete mode 100644 wechat/target/maven-archiver/pom.properties delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst delete mode 100644 wechat/target/wechat-2.1-SNAPSHOT.jar diff --git a/config/src/main/resources/config/application-prod.yml b/config/src/main/resources/config/application-prod.yml index 0e22cd9..a740934 100644 --- a/config/src/main/resources/config/application-prod.yml +++ b/config/src/main/resources/config/application-prod.yml @@ -2,7 +2,7 @@ spring-boot-plus: # 是否启用ansi控制台输出有颜色的字体,local环境建议开启,服务器环境设置为false enable-ansi: false # 当前环境服务IP地址 - server-ip: + server-ip: 127.0.0.1 # 生产环境禁用Swagger swagger: enable: false @@ -16,14 +16,26 @@ spring-boot-plus: spring: datasource: - url: - username: - password: + url: jdbc:mysql://localhost:3306/spring_boot_pmp?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true + username: root + password: Springboot666! # Redis配置 redis: - database: - host: + database: 0 + host: localhost password: - port: + port: 6379 + +# 七牛云配置 +qiniu: + accessKey: VNddBCSpToUG5AHuQHpQSHX2X1v_CWDgbbTCk-Mw + secretKey: t7eYfFBBsyj7RNas5N2l_z8mzKvGgIsHf49EfCQk + bucket: pmp-sys + zone: huadong + domain: cdn.koronol.com +# 微信配置 +wechat: + appId: wx89e746383cc2cf6a + secret: 9f1bf70209fb0feb97d577f5f4e163f7 diff --git a/example/src/main/java/com/example/favorite/controller/FavorController.java b/example/src/main/java/com/example/favorite/controller/FavorController.java index 6157593..d51c875 100644 --- a/example/src/main/java/com/example/favorite/controller/FavorController.java +++ b/example/src/main/java/com/example/favorite/controller/FavorController.java @@ -14,6 +14,7 @@ import io.geekidea.boot.framework.log.annotation.OperationLog; import io.geekidea.boot.framework.log.enums.OperationLogType; import io.geekidea.boot.framework.core.validator.groups.Add; import io.geekidea.boot.framework.core.validator.groups.Update; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.validation.annotation.Validated; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -42,6 +43,7 @@ public class FavorController extends BaseController { @PostMapping("/add") @OperationLog(name = "添加收藏记录", type = OperationLogType.ADD) @ApiOperation(value = "添加收藏记录", response = ApiResult.class) + @CacheEvict(value = "question", allEntries = true) public ApiResult addFavor(@Validated(Add.class) @RequestBody Favor favor) throws Exception { boolean flag = favorService.saveFavor(favor); return ApiResult.result(flag); @@ -64,6 +66,7 @@ public class FavorController extends BaseController { @PostMapping("/delete/{questionId}") @OperationLog(name = "删除收藏记录", type = OperationLogType.DELETE) @ApiOperation(value = "删除收藏记录", response = ApiResult.class) + @CacheEvict(value = "question", allEntries = true) public ApiResult deleteFavor(@PathVariable String questionId) throws Exception { boolean flag = favorService.deleteFavor(questionId); return ApiResult.result(flag); diff --git a/example/src/main/java/com/example/question/controller/QuestionController.java b/example/src/main/java/com/example/question/controller/QuestionController.java index 166d785..d5f37d4 100644 --- a/example/src/main/java/com/example/question/controller/QuestionController.java +++ b/example/src/main/java/com/example/question/controller/QuestionController.java @@ -45,7 +45,7 @@ public class QuestionController extends BaseController { @PostMapping("/submit") @OperationLog(name = "添加题目信息", type = OperationLogType.ADD) @ApiOperation(value = "添加题目信息", response = ApiResult.class) - @CacheEvict(cacheNames = "question", allEntries = true) + @CacheEvict( value = "question", allEntries = true) public ApiResult addQuestion(@Validated(Add.class) @RequestBody Question question) throws Exception { // boolean flag = questionService.saveQuestion(question); boolean flag = question.insertOrUpdate(); @@ -58,7 +58,7 @@ public class QuestionController extends BaseController { @PostMapping("/update") @OperationLog(name = "修改题目信息", type = OperationLogType.UPDATE) @ApiOperation(value = "修改题目信息", response = ApiResult.class) - @CacheEvict(cacheNames = "question", allEntries = true) + @CacheEvict(value = "question", allEntries = true) public ApiResult updateQuestion(@Validated(Update.class) @RequestBody Question question) throws Exception { boolean flag = questionService.updateQuestion(question); return ApiResult.result(flag); @@ -70,6 +70,7 @@ public class QuestionController extends BaseController { @PostMapping("/delete/{id}") @OperationLog(name = "删除题目信息", type = OperationLogType.DELETE) @ApiOperation(value = "删除题目信息", response = ApiResult.class) + @CacheEvict(value = "question", allEntries = true) public ApiResult deleteQuestion(@PathVariable("id") Long id) throws Exception { boolean flag = questionService.deleteQuestion(id); return ApiResult.result(flag); @@ -95,23 +96,24 @@ public class QuestionController extends BaseController { } /** - * 题目信息分页列表 + * 题目信息分页列表-小程序端 */ @PostMapping("/getPageList") @OperationLog(name = "题目信息分页列表", type = OperationLogType.PAGE) @ApiOperation(value = "题目信息分页列表", response = Question.class) + @Cacheable(cacheNames = "question", key = "#p0.toString()") public ApiResult> getQuestionPageList(@Validated @RequestBody QuestionPageParam questionPageParam) throws Exception { Paging paging = questionService.getQuestionPageList(questionPageParam); return ApiResult.ok(paging); } /** - * 题目分页列表 + * 题目分页列表-PC端 */ @PostMapping("/getList") @OperationLog(name = "题目信息分页列表", type = OperationLogType.PAGE) @ApiOperation(value = "题目信息分页列表", response = Question.class) - @Cacheable(cacheNames = "question", key = "#p0.toString()") + @Cacheable(value = "question", key = "#p0.toString()") public ApiResult> getPageList(@Validated @RequestBody QuestionParam questionParam) throws Exception { Paging paging = questionService.getPageList(questionParam); return ApiResult.ok(paging); diff --git a/example/src/main/java/com/example/question/param/QuestionPageParam.java b/example/src/main/java/com/example/question/param/QuestionPageParam.java index e187387..1e17476 100644 --- a/example/src/main/java/com/example/question/param/QuestionPageParam.java +++ b/example/src/main/java/com/example/question/param/QuestionPageParam.java @@ -1,6 +1,8 @@ package com.example.question.param; +import cn.hutool.core.text.StrFormatter; import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; +import io.geekidea.boot.framework.util.LoginUtil; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -32,4 +34,16 @@ public class QuestionPageParam extends BasePageOrderParam { @ApiModelProperty("所属章节id") private String chapterId; + + @Override + public String toString() { + String key = StrFormatter.format("{}-{}-{}-{}-{}", LoginUtil.getAppUserId(), + this.getChapterId() == null ? "" : this.getChapterId(), + this.getGroupId() == null ? "" : this.getGroupId(), + this.getPageIndex() == null ? "1" : this.getPageIndex(), + this.getPageSize() == null ? "10" : this.getPageSize()); + System.out.printf("key:", key); + return key; + } + } diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java index f3a5a7a..96124ae 100644 --- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java +++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java @@ -24,6 +24,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.geekidea.boot.framework.util.LoginUtil; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.transaction.annotation.Transactional; @@ -86,20 +88,21 @@ public class QuestionServiceImpl extends BaseServiceImpl getQuestionPageList(QuestionPageParam questionPageParam) throws Exception { - String key = String.format("questionList-%s-%s-%s-%s-%d-%d", LoginUtil.getAppUserId(), - questionPageParam.getPaperId(), - questionPageParam.getGroupId(), - questionPageParam.getChapterId(), - questionPageParam.getPageIndex(), - questionPageParam.getPageSize()); - IPage redisList = (IPage) redisTemplate.opsForValue().get(key); - if (redisList != null) { - return new Paging(redisList); - } +// String key = String.format("questionList-%s-%s-%s-%s-%d-%d", LoginUtil.getAppUserId(), +// questionPageParam.getPaperId(), +// questionPageParam.getGroupId(), +// questionPageParam.getChapterId(), +// questionPageParam.getPageIndex(), +// questionPageParam.getPageSize()); +// IPage redisList = (IPage) redisTemplate.opsForValue().get(key); +// if (redisList != null) { +// return new Paging(redisList); +// } Page page = new PageInfo<>(questionPageParam, OrderItem.asc(getLambdaColumn(Question::getSerial))); IPage iPage = questionMapper.getQuestionPageList(page, questionPageParam, LoginUtil.getAppUserId()); - redisTemplate.opsForValue().set(key, iPage, 1, TimeUnit.DAYS); +// redisTemplate.opsForValue().set(key, iPage, 1, TimeUnit.DAYS); return new Paging(iPage); } diff --git a/system/src/main/java/io/geekidea/boot/system/controller/UploadController.java b/system/src/main/java/io/geekidea/boot/system/controller/UploadController.java index b0af8ee..dbe750e 100644 --- a/system/src/main/java/io/geekidea/boot/system/controller/UploadController.java +++ b/system/src/main/java/io/geekidea/boot/system/controller/UploadController.java @@ -21,14 +21,15 @@ import io.geekidea.boot.framework.common.api.ApiResult; import io.geekidea.boot.framework.log.annotation.Module; import io.geekidea.boot.framework.log.annotation.OperationLog; import io.geekidea.boot.framework.log.enums.OperationLogType; -import io.geekidea.boot.framework.util.UploadUtil; +import io.geekidea.boot.framework.util.UUIDUtil; +import io.geekidea.boot.system.service.UploadService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -36,8 +37,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; +import java.io.InputStream; /** * 上传控制器 @@ -56,6 +56,9 @@ public class UploadController { @Autowired private SpringBootPlusProperties springBootPlusProperties; + @Autowired + private UploadService uploadService; + /** * 上传单个文件 * @return @@ -64,34 +67,48 @@ public class UploadController { @OperationLog(name = "上传单个文件", type = OperationLogType.UPLOAD) @ApiOperation(value = "上传单个文件", response = ApiResult.class) @ApiImplicitParams({ - @ApiImplicitParam(name = "file", value = "文件", required = true,dataType = "__file"), - @ApiImplicitParam(name = "type", value = "类型 head:头像",required = true) + @ApiImplicitParam(name = "file", value = "文件", required = true,dataType = "__file") +// @ApiImplicitParam(name = "type", value = "类型 head:头像",required = false) }) - public ApiResult upload(@RequestParam("file") MultipartFile multipartFile, - @RequestParam("type") String type) throws Exception { + public ApiResult upload(@RequestParam("file") MultipartFile multipartFile) throws Exception { log.info("multipartFile = " + multipartFile); log.info("ContentType = " + multipartFile.getContentType()); log.info("OriginalFilename = " + multipartFile.getOriginalFilename()); log.info("Name = " + multipartFile.getName()); log.info("Size = " + multipartFile.getSize()); - log.info("type = " + type); +// log.info("type = " + type); - // 上传文件,返回保存的文件名称 - String saveFileName = UploadUtil.upload(springBootPlusProperties.getUploadPath(), multipartFile, originalFilename -> { - // 文件后缀 - String fileExtension = FilenameUtils.getExtension(originalFilename); - // 这里可自定义文件名称,比如按照业务类型/文件格式/日期 - String dateString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssS")) + RandomStringUtils.randomNumeric(6); - String fileName = dateString + "." + fileExtension; - return fileName; - }); + // 获取文件的名称 + String originalFileName = multipartFile.getOriginalFilename(); + // 文件后缀 + String ext = FilenameUtils.getExtension(originalFileName); + String fileName = StringUtils.isNoneEmpty(ext) ? UUIDUtil.getUuid() + '.' + ext : UUIDUtil.getUuid(); - // 上传成功之后,返回访问路径,请根据实际情况设置 + if (!multipartFile.isEmpty()) { + InputStream inputStream = multipartFile.getInputStream(); - String fileAccessPath = springBootPlusProperties.getResourceAccessUrl() + saveFileName; - log.info("fileAccessPath:{}", fileAccessPath); + String path = uploadService.uploadFile(inputStream, fileName); + System.out.print("七牛云返回的图片链接:" + path); + return ApiResult.ok(path); + } + return ApiResult.fail("上传失败"); - return ApiResult.ok(fileAccessPath); + // 上传文件,返回保存的文件名称 +// String saveFileName = UploadUtil.upload(springBootPlusProperties.getUploadPath(), multipartFile, originalFilename -> { +// // 文件后缀 +// String fileExtension = FilenameUtils.getExtension(originalFilename); +// // 这里可自定义文件名称,比如按照业务类型/文件格式/日期 +// String dateString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssS")) + RandomStringUtils.randomNumeric(6); +// String fileName = dateString + "." + fileExtension; +// return fileName; +// }); +// +// // 上传成功之后,返回访问路径,请根据实际情况设置 +// +// String fileAccessPath = springBootPlusProperties.getResourceAccessUrl() + saveFileName; +// log.info("fileAccessPath:{}", fileAccessPath); +// +// return ApiResult.ok(fileAccessPath); } } diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/UploadService.java b/system/src/main/java/io/geekidea/boot/system/service/UploadService.java similarity index 92% rename from system/src/main/java/io/geekidea/springbootplus/system/service/UploadService.java rename to system/src/main/java/io/geekidea/boot/system/service/UploadService.java index cea4e77..f14fef5 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/UploadService.java +++ b/system/src/main/java/io/geekidea/boot/system/service/UploadService.java @@ -1,4 +1,4 @@ -package io.geekidea.springbootplus.system.service; +package io.geekidea.boot.system.service; import com.qiniu.common.QiniuException; diff --git a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/UploadServiceImpl.java b/system/src/main/java/io/geekidea/boot/system/service/impl/UploadServiceImpl.java similarity index 94% rename from system/src/main/java/io/geekidea/springbootplus/system/service/impl/UploadServiceImpl.java rename to system/src/main/java/io/geekidea/boot/system/service/impl/UploadServiceImpl.java index 97d8ee8..536df7b 100644 --- a/system/src/main/java/io/geekidea/springbootplus/system/service/impl/UploadServiceImpl.java +++ b/system/src/main/java/io/geekidea/boot/system/service/impl/UploadServiceImpl.java @@ -1,4 +1,4 @@ -package io.geekidea.springbootplus.system.service.impl; +package io.geekidea.boot.system.service.impl; import com.qiniu.common.QiniuException; import com.qiniu.http.Response; @@ -6,7 +6,7 @@ import com.qiniu.storage.BucketManager; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; import com.qiniu.util.StringMap; -import io.geekidea.springbootplus.system.service.UploadService; +import io.geekidea.boot.system.service.UploadService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/wechat/target/maven-archiver/pom.properties b/wechat/target/maven-archiver/pom.properties deleted file mode 100644 index c40f4df..0000000 --- a/wechat/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Sat Feb 06 22:34:34 CST 2021 -version=2.1-SNAPSHOT -groupId=io.geekidea.boot -artifactId=wechat diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 184fcc6..0000000 --- a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,6 +0,0 @@ -com/koronol/profile/mapper/ProfileMapper.class -com/koronol/profile/param/ProfilePageParam.class -com/koronol/profile/controller/ProfileController.class -com/koronol/profile/service/impl/ProfileServiceImpl.class -com/koronol/profile/entity/Profile.class -com/koronol/profile/service/ProfileService.class diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 8a3154e..0000000 --- a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,6 +0,0 @@ -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/entity/Profile.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/ProfileService.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java diff --git a/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/wechat/target/wechat-2.1-SNAPSHOT.jar b/wechat/target/wechat-2.1-SNAPSHOT.jar deleted file mode 100644 index 4b6adf2e7e3f86c67e8237fa6fa9352609e81914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12314 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 bKhApvY1rHP6a)mp?T^pxu@`j54~F Date: Sat, 20 Feb 2021 19:18:28 +0800 Subject: [PATCH 12/36] fix bug --- .../category/controller/CategoryController.java | 2 +- .../com/example/category/entity/Category.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/example/src/main/java/com/example/category/controller/CategoryController.java b/example/src/main/java/com/example/category/controller/CategoryController.java index fae82d6..1d386d6 100644 --- a/example/src/main/java/com/example/category/controller/CategoryController.java +++ b/example/src/main/java/com/example/category/controller/CategoryController.java @@ -97,7 +97,7 @@ public class CategoryController extends BaseController { return ApiResult.ok(paging); } - @GetMapping("/getAllList") + @GetMapping("/wechat/getAllList") @OperationLog(name = "题目分类列表", type = OperationLogType.LIST) @ApiOperation(value = "题目分类列表", response = Category.class) @Cacheable(cacheNames = "category", key = "#root.method.name") diff --git a/example/src/main/java/com/example/category/entity/Category.java b/example/src/main/java/com/example/category/entity/Category.java index 48b9e25..fd4d254 100644 --- a/example/src/main/java/com/example/category/entity/Category.java +++ b/example/src/main/java/com/example/category/entity/Category.java @@ -2,8 +2,10 @@ package com.example.category.entity; import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.geekidea.boot.framework.core.validator.groups.Add; import io.geekidea.boot.framework.core.validator.groups.Update; +import java.math.BigDecimal; import java.util.Date; import io.swagger.annotations.ApiModel; @@ -11,6 +13,9 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -37,10 +42,21 @@ public class Category extends Model { @TableField("SUBJECT") private String subject; + @ApiModelProperty("封面图片") + @TableField("COVER_IMG") + private String coverImg; + @ApiModelProperty("编号") @TableField("CODE") private String code; + @ApiModelProperty("价格") + @TableField("PRICE") + @NotNull(message = "请输入价格", groups = {Add.class, Update.class}) + @Min(value = 0, message = "价格不能小于0") + @Max(value = 99999, message = "价格不能超过99999") + private BigDecimal price; + @ApiModelProperty("描述") @TableField("REMARK") private String remark; -- Gitee From a00157bc6d220f9241b57acac739b9fe1ea8720b Mon Sep 17 00:00:00 2001 From: limingguang Date: Mon, 22 Feb 2021 13:18:09 +0800 Subject: [PATCH 13/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/SpringBootPlusWebMvcConfig.java | 6 + .../main/resources/config/application-dev.yml | 8 +- .../resources/config/application-prod.yml | 3 + .../com/example/question/entity/Question.java | 4 +- .../question/param/QuestionAnswerParam.java | 2 - .../service/impl/QuestionServiceImpl.java | 26 ++-- framework/pom.xml | 8 + .../generator/SpringBootPlusGenerator.java | 8 +- pom.xml | 1 + .../com/koronol/profile/entity/Profile.java | 3 +- .../service/impl/ProfileServiceImpl.java | 2 +- .../AbstractWxPayApiController.java | 12 ++ .../wxpay/controller/WxPayController.java | 145 ++++++++++++++++++ .../com/koronol/wxpay/entity/WxPayBean.java | 36 +++++ .../wxpay/interceptor/WxPayInterceptor.java | 25 +++ .../koronol/wxpay/param/WxPayNotifyParam.java | 13 ++ .../com/koronol/wxpay/param/WxPayParam.java | 19 +++ .../java/com/koronol/wxpay/vo/PaymentVo.java | 33 ++++ .../com/koronol/profile/entity/Profile.class | Bin 9261 -> 9373 bytes .../service/impl/ProfileServiceImpl.class | Bin 13676 -> 13776 bytes 20 files changed, 330 insertions(+), 24 deletions(-) create mode 100644 wechat/src/main/java/com/koronol/wxpay/controller/AbstractWxPayApiController.java create mode 100644 wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java create mode 100644 wechat/src/main/java/com/koronol/wxpay/entity/WxPayBean.java create mode 100644 wechat/src/main/java/com/koronol/wxpay/interceptor/WxPayInterceptor.java create mode 100644 wechat/src/main/java/com/koronol/wxpay/param/WxPayNotifyParam.java create mode 100644 wechat/src/main/java/com/koronol/wxpay/param/WxPayParam.java create mode 100644 wechat/src/main/java/com/koronol/wxpay/vo/PaymentVo.java diff --git a/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java index 29e1a87..b1e2657 100644 --- a/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java @@ -18,6 +18,7 @@ package io.geekidea.boot.config; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.koronol.wxpay.interceptor.WxPayInterceptor; import io.geekidea.boot.config.properties.SpringBootPlusFilterProperties; import io.geekidea.boot.config.properties.SpringBootPlusInterceptorProperties; import io.geekidea.boot.config.properties.SpringBootPlusProperties; @@ -145,6 +146,9 @@ public class SpringBootPlusWebMvcConfig implements WebMvcConfigurer { return new DownloadInterceptor(); } + @Bean + public WxPayInterceptor wxPayInterceptor() { return new WxPayInterceptor();} + /** * 配置自动填充 * @@ -202,6 +206,8 @@ public class SpringBootPlusWebMvcConfig implements WebMvcConfigurer { .addPathPatterns(interceptorConfig.getPermission().getIncludePaths()) .excludePathPatterns(interceptorConfig.getPermission().getExcludePaths()); } + // 微信支付拦截器 + registry.addInterceptor(wxPayInterceptor()); } diff --git a/config/src/main/resources/config/application-dev.yml b/config/src/main/resources/config/application-dev.yml index 8b2d633..0fb7474 100644 --- a/config/src/main/resources/config/application-dev.yml +++ b/config/src/main/resources/config/application-dev.yml @@ -40,4 +40,10 @@ qiniu: # 微信配置 wechat: appId: wx89e746383cc2cf6a - secret: 9f1bf70209fb0feb97d577f5f4e163f7 \ No newline at end of file + secret: 9f1bf70209fb0feb97d577f5f4e163f7 + mchId: 1606561696 + partnerKey: 765d11bba1ce4c00bf343e087d25865a + apiV3Key: eb79f964741711eb87f88c8590719960 + mchSerialNo: 6223053CFC87658408133AB1DAE52F24B9BA85C1 + notifyUrl: http://l17424255.gicp.net/api + certPath: cert/apiclient_cert.p12 \ No newline at end of file diff --git a/config/src/main/resources/config/application-prod.yml b/config/src/main/resources/config/application-prod.yml index a740934..d2ee732 100644 --- a/config/src/main/resources/config/application-prod.yml +++ b/config/src/main/resources/config/application-prod.yml @@ -39,3 +39,6 @@ qiniu: wechat: appId: wx89e746383cc2cf6a secret: 9f1bf70209fb0feb97d577f5f4e163f7 + mchId: 1606561696 + apiV3Key: eb79f964741711eb87f88c8590719960 + mchSerialNo: 6223053CFC87658408133AB1DAE52F24B9BA85C1 diff --git a/example/src/main/java/com/example/question/entity/Question.java b/example/src/main/java/com/example/question/entity/Question.java index ea0a3b4..d0193b4 100644 --- a/example/src/main/java/com/example/question/entity/Question.java +++ b/example/src/main/java/com/example/question/entity/Question.java @@ -96,8 +96,8 @@ public class Question extends Model { private String answerDetail; @ApiModelProperty("所属过程组") - @TableField("GOURP_ID") - private String gourpId; + @TableField("GROUP_ID") + private String groupId; @ApiModelProperty("所属章节") @TableField("CHAPTER_ID") diff --git a/example/src/main/java/com/example/question/param/QuestionAnswerParam.java b/example/src/main/java/com/example/question/param/QuestionAnswerParam.java index f0fa5b8..9355502 100644 --- a/example/src/main/java/com/example/question/param/QuestionAnswerParam.java +++ b/example/src/main/java/com/example/question/param/QuestionAnswerParam.java @@ -24,11 +24,9 @@ public class QuestionAnswerParam implements Serializable { private static final long serialVersionUID = 5364321420976152006L; @ApiModelProperty("试卷id") - @NotNull(message = "试卷id不能为空") private String paperId; @ApiModelProperty("考试id") - @NotNull(message = "考试id不能为空") private Long recordId; @ApiModelProperty("试题id") diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java index 96124ae..03f893c 100644 --- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java +++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java @@ -121,21 +121,21 @@ public class QuestionServiceImpl extends BaseServiceImpl().eq(History::getQuestionId, question.getId())); + boolean flag = historyService.saveOrUpdate(history, new LambdaQueryWrapper().eq(History::getQuestionId, question.getId())); // 更新考试正确题数和当前进度 UserPaper userPaper = userPaperService.getById(questionAnswerParam.getRecordId()); - if (userPaper == null) { - throw new BusinessException("考试记录不存在, 请重新开始"); + if (userPaper != null) { + userPaper.setPaperId(questionAnswerParam.getPaperId()); + if (questionAnswerParam.getAnswer().equals(question.getAnswer())) { + userPaper.setCorrectCount(userPaper.getCorrectCount() + 1); + } else { + userPaper.setErrorCount(userPaper.getErrorCount() + 1); + } + userPaper.setProgress(question.getSerial()); + userPaper.setUserId(appUserId); + userPaperService.updateById(userPaper); } - userPaper.setPaperId(questionAnswerParam.getPaperId()); - if (questionAnswerParam.getAnswer().equals(question.getAnswer())) { - userPaper.setCorrectCount(userPaper.getCorrectCount() + 1); - } else { - userPaper.setErrorCount(userPaper.getErrorCount() + 1); - } - userPaper.setProgress(question.getSerial()); - userPaper.setUserId(appUserId); - Boolean flag = userPaperService.updateById(userPaper); + // 如果答错,插入错题集 if (!questionAnswerParam.getAnswer().equals(question.getAnswer())) { String key = String.format("wrongPaperList-%s", appUserId); @@ -162,7 +162,7 @@ public class QuestionServiceImpl extends BaseServiceImpl iPage = questionMapper.selectPage(page, wrapper); return new Paging(iPage); diff --git a/framework/pom.xml b/framework/pom.xml index d87c7c0..58cf561 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -100,6 +100,14 @@ + + + com.github.javen205 + IJPay-WxPay + ${ijapy.version} + + + io.geekidea.boot config diff --git a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java index c22823a..037900a 100644 --- a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java +++ b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java @@ -45,14 +45,14 @@ public class SpringBootPlusGenerator { // 设置基本信息 generatorProperties - .setMavenModuleName("example") - .setParentPackage("com.example") - .setModuleName("chapter") + .setMavenModuleName("wechat") + .setParentPackage("com.koronol") + .setModuleName("invite") .setAuthor("limg") .setFileOverride(true); // 设置表信息 - generatorProperties.addTable("p_chapter","id"); + generatorProperties.addTable("p_invite","id"); // 设置表前缀 generatorProperties.setTablePrefix(Arrays.asList("p_")); diff --git a/pom.xml b/pom.xml index 75cb3a0..ed2b346 100644 --- a/pom.xml +++ b/pom.xml @@ -79,6 +79,7 @@ 2.9.2 2.0.2 [7.4.0, 7.4.99] + 2.7.2 3.8.1 3.1.0 diff --git a/wechat/src/main/java/com/koronol/profile/entity/Profile.java b/wechat/src/main/java/com/koronol/profile/entity/Profile.java index d170e7d..b56f04d 100644 --- a/wechat/src/main/java/com/koronol/profile/entity/Profile.java +++ b/wechat/src/main/java/com/koronol/profile/entity/Profile.java @@ -2,6 +2,7 @@ package com.koronol.profile.entity; import com.baomidou.mybatisplus.annotation.*; +import java.time.LocalDate; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; @@ -65,7 +66,7 @@ public class Profile extends BaseEntity { @ApiModelProperty("会员有效期") @TableField("VALID") @JsonFormat(pattern="yyyy-MM-dd") - private Date valid; + private LocalDate valid; @ApiModelProperty("乐观锁") @TableField("REVISION") diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index 9a7fddf..9337ca4 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -188,7 +188,7 @@ public class ProfileServiceImpl extends BaseServiceImpl Integer count = historyService.count(new LambdaQueryWrapper().eq(History::getUserId, LoginUtil.getAppUserId())); ProfileInfoVo profileInfoVo = new ProfileInfoVo(); profileInfoVo.setCount(count); - profileInfoVo.setScore(score); + profileInfoVo.setScore(score == null ? 0 : score); return profileInfoVo; } diff --git a/wechat/src/main/java/com/koronol/wxpay/controller/AbstractWxPayApiController.java b/wechat/src/main/java/com/koronol/wxpay/controller/AbstractWxPayApiController.java new file mode 100644 index 0000000..30d9fa3 --- /dev/null +++ b/wechat/src/main/java/com/koronol/wxpay/controller/AbstractWxPayApiController.java @@ -0,0 +1,12 @@ +package com.koronol.wxpay.controller; + +import com.ijpay.wxpay.WxPayApiConfig; + +public abstract class AbstractWxPayApiController { + /** + * 获取微信支付配置 + * + * @return {@link WxPayApiConfig} 微信支付配置 + */ + public abstract WxPayApiConfig getApiConfig(); +} diff --git a/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java b/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java new file mode 100644 index 0000000..48d5668 --- /dev/null +++ b/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java @@ -0,0 +1,145 @@ +package com.koronol.wxpay.controller; + +import cn.hutool.core.convert.Convert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.order.entity.Order; +import com.example.order.service.OrderService; +import com.ijpay.core.enums.SignType; +import com.ijpay.core.enums.TradeType; +import com.ijpay.core.kit.IpKit; +import com.ijpay.core.kit.WxPayKit; +import com.ijpay.wxpay.WxPayApi; +import com.ijpay.wxpay.WxPayApiConfig; +import com.ijpay.wxpay.WxPayApiConfigKit; +import com.ijpay.wxpay.model.UnifiedOrderModel; +import com.koronol.wxpay.entity.WxPayBean; +import com.koronol.wxpay.param.WxPayNotifyParam; +import com.koronol.wxpay.param.WxPayParam; +import com.koronol.wxpay.vo.PaymentVo; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.common.exception.BusinessException; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.Map; + +import static io.geekidea.boot.framework.util.HttpServletRequestUtil.getRequest; + +@Slf4j +@RestController +@RequestMapping("/wechat") +@Module("wxPay") +@Api(value = "微信支付相关API", tags = {"微信支付"}) +public class WxPayController extends AbstractWxPayApiController { + + private String notifyUrl; + private String refundNotifyUrl; + + @Autowired + private OrderService orderService; + + @Autowired + WxPayBean wxPayBean; + + @Override + public WxPayApiConfig getApiConfig() { + WxPayApiConfig apiConfig; + + try { + apiConfig = WxPayApiConfigKit.getApiConfig(wxPayBean.getAppId()); + } catch (Exception e) { + apiConfig = WxPayApiConfig.builder() + .appId(wxPayBean.getAppId()) + .mchId(wxPayBean.getMchId()) + .partnerKey(wxPayBean.getPartnerKey()) + .certPath(wxPayBean.getCertPath()) + .domain(wxPayBean.getDomain()) + .build(); + } + notifyUrl = apiConfig.getDomain().concat("/wxPay/payNotify"); + refundNotifyUrl = apiConfig.getDomain().concat("/wxPay/refundNotify"); + return apiConfig; + } + + @PostMapping("/getPrePayInfo") + @OperationLog(name = "微信预支付信息", type = OperationLogType.ADD) + @ApiOperation(value = "微信预支付信息", response = ApiResult.class) + public ApiResult> createOrder(@Validated @RequestBody WxPayParam wxPayParam) throws Exception { + + String ip = IpKit.getRealIp(getRequest()); + BigDecimal multiple = new BigDecimal("100"); // 微信支付金额乘以100 + Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getOrderId, wxPayParam.getOrderId())); + if (order.getStatus().equals("2")) { + throw new BusinessException("订单已支付,请勿重复支付"); + } + + if (order.getStatus().equals("3")) { + throw new BusinessException("订单已取消"); + } + + WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); + + Map params = UnifiedOrderModel + .builder() + .appid(wxPayApiConfig.getAppId()) + .mch_id(wxPayApiConfig.getMchId()) + .nonce_str(WxPayKit.generateStr()) + .body(order.getRemark()) + .out_trade_no(order.getOrderId()) + .total_fee(Convert.toInt(order.getAmount().multiply(multiple)).toString()) + .spbill_create_ip(ip) + .notify_url(notifyUrl) + .trade_type(TradeType.JSAPI.getTradeType()) + .openid(wxPayParam.getOpenId()) + .build() + .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); + + String xmlResult = WxPayApi.pushOrder(false, params); + + log.info(xmlResult); + Map result = WxPayKit.xmlToMap(xmlResult); + + String returnCode = result.get("return_code"); + String returnMsg = result.get("return_msg"); + if (!WxPayKit.codeIsOk(returnCode)) { + throw new BusinessException(returnMsg); + } + String resultCode = result.get("result_code"); + if (!WxPayKit.codeIsOk(resultCode)) { + throw new BusinessException(returnMsg); + } + // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回 + String prepayId = result.get("prepay_id"); + Map packageParams = WxPayKit.miniAppPrepayIdCreateSign(wxPayApiConfig.getAppId(), prepayId, + wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); + String jsonStr = JSON.toJSONString(packageParams); + log.info("小程序支付的参数:" + jsonStr); + return ApiResult.ok(packageParams); + } + + @PostMapping("/payNotify") + @OperationLog(name = "微信支付异步信息", type = OperationLogType.UPDATE) + @ApiOperation(value = "微信支付异步信息", response = ApiResult.class) + public ApiResult notify(@RequestBody WxPayNotifyParam wxPayNotifyParam) throws Exception { + + return ApiResult.ok(true); + } + + @GetMapping("/queryOrder") + @OperationLog(name = "微信支付异步信息", type = OperationLogType.UPDATE) + @ApiOperation(value = "微信支付异步信息", response = ApiResult.class) + public ApiResult queryOrder(@RequestBody WxPayNotifyParam wxPayNotifyParam) throws Exception { + + return ApiResult.ok(true); + } +} diff --git a/wechat/src/main/java/com/koronol/wxpay/entity/WxPayBean.java b/wechat/src/main/java/com/koronol/wxpay/entity/WxPayBean.java new file mode 100644 index 0000000..bfb3d51 --- /dev/null +++ b/wechat/src/main/java/com/koronol/wxpay/entity/WxPayBean.java @@ -0,0 +1,36 @@ +package com.koronol.wxpay.entity; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import java.io.Serializable; + +@Configuration +@Data +public class WxPayBean implements Serializable { + + @Value("${wechat.appId}") + private String appId; + + @Value("${wechat.secret}") + private String appSecret; + + @Value("${wechat.mchId}") + private String mchId; + + @Value("${wechat.partnerKey}") + private String partnerKey; + + @Value("${wechat.certPath}") + private String certPath; + + @Value("${wechat.notifyUrl}") + private String domain; + + @Override + public String toString() { + return "WxPayBean [appId=" + appId + ", appSecret=" + appSecret + ", mchId=" + mchId + ", partnerKey=" + + partnerKey + ", certPath=" + certPath + ", domain=" + domain + "]"; + } +} diff --git a/wechat/src/main/java/com/koronol/wxpay/interceptor/WxPayInterceptor.java b/wechat/src/main/java/com/koronol/wxpay/interceptor/WxPayInterceptor.java new file mode 100644 index 0000000..2e72c46 --- /dev/null +++ b/wechat/src/main/java/com/koronol/wxpay/interceptor/WxPayInterceptor.java @@ -0,0 +1,25 @@ +package com.koronol.wxpay.interceptor; + +import com.ijpay.wxpay.WxPayApiConfigKit; +import com.koronol.wxpay.controller.AbstractWxPayApiController; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class WxPayInterceptor implements HandlerInterceptor { + @Override + public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) { + if (HandlerMethod.class.equals(handler.getClass())) { + HandlerMethod method = (HandlerMethod) handler; + Object controller = method.getBean(); + if (!(controller instanceof AbstractWxPayApiController)) { + throw new RuntimeException("控制器需要继承 AbstractWxPayApiController"); + } + WxPayApiConfigKit.setThreadLocalWxPayApiConfig(((AbstractWxPayApiController) controller).getApiConfig()); + return true; + } + return false; + } +} diff --git a/wechat/src/main/java/com/koronol/wxpay/param/WxPayNotifyParam.java b/wechat/src/main/java/com/koronol/wxpay/param/WxPayNotifyParam.java new file mode 100644 index 0000000..4c0772e --- /dev/null +++ b/wechat/src/main/java/com/koronol/wxpay/param/WxPayNotifyParam.java @@ -0,0 +1,13 @@ +package com.koronol.wxpay.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("微信支付异步通知参数") +public class WxPayNotifyParam implements Serializable { + + private static final long serialVersionUID = 4833790332276666126L; +} diff --git a/wechat/src/main/java/com/koronol/wxpay/param/WxPayParam.java b/wechat/src/main/java/com/koronol/wxpay/param/WxPayParam.java new file mode 100644 index 0000000..e639c69 --- /dev/null +++ b/wechat/src/main/java/com/koronol/wxpay/param/WxPayParam.java @@ -0,0 +1,19 @@ +package com.koronol.wxpay.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("微信支付请求参数") +public class WxPayParam implements Serializable { + private static final long serialVersionUID = -3199999494937702812L; + + @ApiModelProperty("openId") + private String openId; + + @ApiModelProperty("商户订单号") + private String orderId; +} diff --git a/wechat/src/main/java/com/koronol/wxpay/vo/PaymentVo.java b/wechat/src/main/java/com/koronol/wxpay/vo/PaymentVo.java new file mode 100644 index 0000000..1c4117b --- /dev/null +++ b/wechat/src/main/java/com/koronol/wxpay/vo/PaymentVo.java @@ -0,0 +1,33 @@ +package com.koronol.wxpay.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@Accessors(chain = true) +@ApiModel(value = "PaymentVo对象", description = "小程序预支付对象") +public class PaymentVo implements Serializable { + private static final long serialVersionUID = -8025859169297714783L; + + @ApiModelProperty("appId") + private String appId; + + @ApiModelProperty("timeStamp") + private String timeStamp; + + @ApiModelProperty("nonceStr") + private String nonceStr; + + @ApiModelProperty("统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***") + private String prepayId; + + @ApiModelProperty("该接口V3版本仅支持RSA") + private String signType; + + @ApiModelProperty("签名") + private String paySign; +} diff --git a/wechat/target/classes/com/koronol/profile/entity/Profile.class b/wechat/target/classes/com/koronol/profile/entity/Profile.class index 272d5c1c5a9be80cc5604f835e68af0d43aec833..cf53d7c3ad83bc687404533c6b8ef3036dee681a 100644 GIT binary patch literal 9373 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%0A%z|DDS{kn`&3IwuM?jEMgi4;G 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 L*Ks-^goFPB4~Yw< diff --git a/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class b/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class index 2292becb8ead55f0e01a01912a8e108ffc153e11..d24731871d49670aafd12207bf21eeab42da4121 100644 GIT binary patch delta 3847 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 Q*tAybbDUPnGWx{%AC%cG1^@s6 delta 3791 zcmbtXd3;nw68^rPO#0{;`w1?yBnQufM9U?l<#V^|uqF zFYMj)D1bid7#CMF)i!CiX92axg#${W!a}i{F%?>VHrlyFwV~CxYtJ&E_ z8oOxbxkzWK!-MQ#*ATn0yMqN*IoM&o%LscoEO2;;!$OzQo;=iLFZOoW$7Np@xjc;h zTprG1%_AK4x5fc3I`c?}1H+)@;&QO&5W8-P=20#pmUo0hE%-1i4Y$(KRvKZMALH^^ zyXwdk9>?P~PjFErQ^a^;)QTrLJlSfcRyoDxsr-k_Q9MoabQc48hQl*m4C83cvmB0b zQNppB0oXjbj=ean=vW}j@ zS}RUz9CMPwY71lwRWUV^G(CIxJ~nI!*|%= z^$+)N|1RIN1hx~&lc!YHR8CFqKMGZgV z$A+J9nc=5a`pin7i-h0syJV0EO|6_dwQ6$B*y_sZnqL_117W=Xd^L_$U9mDKk>I z+Y-J5i#7i?+`|g{kXB8mwB>cRQMkT4BQOPPO$VEj(2Djoi zt+Y{&N-@e+A)|~+mAX)ATD34LU4=B)8r z?UdYOF{3)Djs~}5kyf3I%2l1U>S9!$I!LRoMs-u&wK~|Sd=)Xc7S|DJU)*v3=kp%g zdGm_W301X|wd!G1fuu?uVpO5zPxVxXdZV)vm^prlBzX4q1GhQmK<3eD5U`qNv*JsPK5==*TLz^oMSBNY2k5=D+20_b0M{L92F>x%qJM2p*LLJtlKHi6!p!c$3$bCa)*NtC`W0 z;;-7X_ToH^H#FYVcxw;Z z_VcA}`!Oco#ygg2{mg<(DKvK<67^}u5avnw zO(S*YC#W;8iTaO?)Mw*Md?0wqg7AzVgvM8xg%7bqsQ-lN_(-IbDE>q(J{Hks62{{b ze2Nf57>CdBxx71DqZD6YCsG-~Ac5Q=U-2e1=AuP&E__mnTpW+U{<+wT!G0 zy|oY`8ehkARU*l18rAqF@&B#HcN*V|D#>l$bm9l>if^`@rzF47hIyNN4vfYyYE(|r zYQHG#DQY8;LyF9mGV38F)>n$GzYs3L7Qg1>MLH~zUkqz3c~`uCl>8`})doL{6p*Mq6Tv7_WVuD*)AHBh^ah-9TqK4wpGAhKCbAKu6-F&bTBCNBXx1-= zF~?iK7{>M}h+$j<${KKXaZ}ISJi8{Uv#5|@ho}%kP5J;WKmNp z7Bya6u9VMT@+kB|6?V&w5Rf#TioeB{gp+WLem@wa`O-Rxr0c2t`3k{1q58=Njx$e@(DJR6M@R_ls{7&uC({B)Q7b3cj7?*nE3BR)-hRj4F0a>AY~7F$o_df`({R+rWb6k?3(?g zgy%His(MVaFIgS{7{rreQ%s@j_o2jB2pTaD6`KpH5;a^Mg&fMyPC0`Cwv^wSnapA< TX0vspHmFfcjSp6Hk{$dfv)dei -- Gitee From 8ad546ea4c2649ad924143c5b231e90402c3cee1 Mon Sep 17 00:00:00 2001 From: limingguang Date: Tue, 23 Feb 2021 23:23:58 +0800 Subject: [PATCH 14/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=93=E9=A2=98?= =?UTF-8?q?=E8=B4=AD=E4=B9=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/SpringBootPlusWebMvcConfig.java | 2 +- .../boot/config/constant/CommonConstant.java | 2 +- .../resources/config/application-prod.yml | 3 + .../src/main/resources/config/application.yml | 4 +- .../controller/CategoryController.java | 34 ++++- .../category/mapper/CategoryMapper.java | 1 - .../service/impl/CategoryServiceImpl.java | 1 + .../example/category/vo/CategoryDetailVo.java | 45 ++++++ .../controller/ExampleOrderController.java | 109 --------------- .../order/controller/OrderController.java | 131 ++++++++++++++++++ .../entity/{ExampleOrder.java => Order.java} | 101 +++++++++----- .../order/mapper/ExampleOrderMapper.java | 40 ------ .../com/example/order/mapper/OrderMapper.java | 24 ++++ .../order/param/CategoryOrderParam.java | 20 +++ .../order/param/ExampleOrderPageParam.java | 47 ------- .../example/order/param/OrderPageParam.java | 23 +++ .../order/service/ExampleOrderService.java | 69 --------- .../example/order/service/OrderService.java | 53 +++++++ .../service/impl/ExampleOrderServiceImpl.java | 90 ------------ .../order/service/impl/OrderServiceImpl.java | 58 ++++++++ .../resources/mapper/invite/InviteMapper.xml | 5 + .../resources/mapper/order/OrderMapper.xml | 5 + .../mapper/question/QuestionMapper.xml | 4 + .../invite/controller/InviteController.java | 72 ++++++++++ .../com/koronol/invite/entity/Invite.java | 66 +++++++++ .../koronol/invite/mapper/InviteMapper.java | 24 ++++ .../koronol/invite/param/InvitePageParam.java | 23 +++ .../koronol/invite/service/InviteService.java | 54 ++++++++ .../service/impl/InviteServiceImpl.java | 105 ++++++++++++++ .../profile/controller/ProfileController.java | 31 +++++ .../profile/service/ProfileService.java | 2 + .../service/impl/ProfileServiceImpl.java | 23 ++- .../wxpay/controller/WxPayController.java | 111 +++++++++++++-- .../main/resources/cert/apiclient_cert.p12 | Bin 0 -> 2718 bytes .../src/main/resources/cert/apiclient_key.pem | 28 ++++ .../resources/mapper/invite/InviteMapper.xml | 5 + wechat/target/classes/cert/apiclient_cert.p12 | Bin 0 -> 4751 bytes wechat/target/classes/cert/apiclient_key.pem | 28 ++++ .../invite/controller/InviteController.class | Bin 0 -> 3951 bytes .../com/koronol/invite/entity/Invite.class | Bin 0 -> 6060 bytes .../koronol/invite/mapper/InviteMapper.class | Bin 0 -> 398 bytes .../invite/param/InvitePageParam.class | Bin 0 -> 1094 bytes .../invite/service/InviteService.class | Bin 0 -> 829 bytes .../service/impl/InviteServiceImpl.class | Bin 0 -> 7577 bytes .../controller/ProfileController.class | Bin 6123 -> 7736 bytes .../profile/service/ProfileService.class | Bin 1150 -> 1200 bytes .../service/impl/ProfileServiceImpl.class | Bin 13776 -> 14442 bytes .../AbstractWxPayApiController.class | Bin 0 -> 421 bytes .../wxpay/controller/WxPayController.class | Bin 0 -> 13073 bytes .../com/koronol/wxpay/entity/WxPayBean.class | Bin 0 -> 3966 bytes .../wxpay/interceptor/WxPayInterceptor.class | Bin 0 -> 1542 bytes .../wxpay/param/WxPayNotifyParam.class | Bin 0 -> 1054 bytes .../com/koronol/wxpay/param/WxPayParam.class | Bin 0 -> 2142 bytes .../com/koronol/wxpay/vo/PaymentVo.class | Bin 0 -> 4111 bytes .../classes/mapper/invite/InviteMapper.xml | 5 + wechat/target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 23 +++ .../compile/default-compile/inputFiles.lst | 23 +++ .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 wechat/target/wechat-2.1-SNAPSHOT.jar | Bin 0 -> 52872 bytes 61 files changed, 1085 insertions(+), 414 deletions(-) create mode 100644 example/src/main/java/com/example/category/vo/CategoryDetailVo.java delete mode 100644 example/src/main/java/com/example/order/controller/ExampleOrderController.java create mode 100644 example/src/main/java/com/example/order/controller/OrderController.java rename example/src/main/java/com/example/order/entity/{ExampleOrder.java => Order.java} (34%) delete mode 100644 example/src/main/java/com/example/order/mapper/ExampleOrderMapper.java create mode 100644 example/src/main/java/com/example/order/mapper/OrderMapper.java create mode 100644 example/src/main/java/com/example/order/param/CategoryOrderParam.java delete mode 100644 example/src/main/java/com/example/order/param/ExampleOrderPageParam.java create mode 100644 example/src/main/java/com/example/order/param/OrderPageParam.java delete mode 100644 example/src/main/java/com/example/order/service/ExampleOrderService.java create mode 100644 example/src/main/java/com/example/order/service/OrderService.java delete mode 100644 example/src/main/java/com/example/order/service/impl/ExampleOrderServiceImpl.java create mode 100644 example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java create mode 100644 example/src/main/resources/mapper/invite/InviteMapper.xml create mode 100644 example/src/main/resources/mapper/order/OrderMapper.xml create mode 100644 wechat/src/main/java/com/koronol/invite/controller/InviteController.java create mode 100644 wechat/src/main/java/com/koronol/invite/entity/Invite.java create mode 100644 wechat/src/main/java/com/koronol/invite/mapper/InviteMapper.java create mode 100644 wechat/src/main/java/com/koronol/invite/param/InvitePageParam.java create mode 100644 wechat/src/main/java/com/koronol/invite/service/InviteService.java create mode 100644 wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java create mode 100644 wechat/src/main/resources/cert/apiclient_cert.p12 create mode 100644 wechat/src/main/resources/cert/apiclient_key.pem create mode 100644 wechat/src/main/resources/mapper/invite/InviteMapper.xml create mode 100644 wechat/target/classes/cert/apiclient_cert.p12 create mode 100644 wechat/target/classes/cert/apiclient_key.pem create mode 100644 wechat/target/classes/com/koronol/invite/controller/InviteController.class create mode 100644 wechat/target/classes/com/koronol/invite/entity/Invite.class create mode 100644 wechat/target/classes/com/koronol/invite/mapper/InviteMapper.class create mode 100644 wechat/target/classes/com/koronol/invite/param/InvitePageParam.class create mode 100644 wechat/target/classes/com/koronol/invite/service/InviteService.class create mode 100644 wechat/target/classes/com/koronol/invite/service/impl/InviteServiceImpl.class create mode 100644 wechat/target/classes/com/koronol/wxpay/controller/AbstractWxPayApiController.class create mode 100644 wechat/target/classes/com/koronol/wxpay/controller/WxPayController.class create mode 100644 wechat/target/classes/com/koronol/wxpay/entity/WxPayBean.class create mode 100644 wechat/target/classes/com/koronol/wxpay/interceptor/WxPayInterceptor.class create mode 100644 wechat/target/classes/com/koronol/wxpay/param/WxPayNotifyParam.class create mode 100644 wechat/target/classes/com/koronol/wxpay/param/WxPayParam.class create mode 100644 wechat/target/classes/com/koronol/wxpay/vo/PaymentVo.class create mode 100644 wechat/target/classes/mapper/invite/InviteMapper.xml create mode 100644 wechat/target/maven-archiver/pom.properties create mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 wechat/target/wechat-2.1-SNAPSHOT.jar diff --git a/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java index b1e2657..fcaf35f 100644 --- a/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java +++ b/bootstrap/src/main/java/io/geekidea/boot/config/SpringBootPlusWebMvcConfig.java @@ -207,7 +207,7 @@ public class SpringBootPlusWebMvcConfig implements WebMvcConfigurer { .excludePathPatterns(interceptorConfig.getPermission().getExcludePaths()); } // 微信支付拦截器 - registry.addInterceptor(wxPayInterceptor()); + registry.addInterceptor(wxPayInterceptor()).addPathPatterns("/wxPay/**"); } diff --git a/config/src/main/java/io/geekidea/boot/config/constant/CommonConstant.java b/config/src/main/java/io/geekidea/boot/config/constant/CommonConstant.java index 78999d4..bc29246 100644 --- a/config/src/main/java/io/geekidea/boot/config/constant/CommonConstant.java +++ b/config/src/main/java/io/geekidea/boot/config/constant/CommonConstant.java @@ -88,7 +88,7 @@ public interface CommonConstant { /** * JWT 默认过期时间,3600L,单位秒 */ - Long JWT_DEFAULT_EXPIRE_SECOND = 3600L; + Long JWT_DEFAULT_EXPIRE_SECOND = 3600 * 24L; /** * 默认头像 diff --git a/config/src/main/resources/config/application-prod.yml b/config/src/main/resources/config/application-prod.yml index d2ee732..eadfd1d 100644 --- a/config/src/main/resources/config/application-prod.yml +++ b/config/src/main/resources/config/application-prod.yml @@ -40,5 +40,8 @@ wechat: appId: wx89e746383cc2cf6a secret: 9f1bf70209fb0feb97d577f5f4e163f7 mchId: 1606561696 + partnerKey: 765d11bba1ce4c00bf343e087d25865a apiV3Key: eb79f964741711eb87f88c8590719960 mchSerialNo: 6223053CFC87658408133AB1DAE52F24B9BA85C1 + notifyUrl: https://pmp.koronol.com/api + certPath: /data/pmp/apiclient_cert.p12 diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index 85e1b52..4e8f15d 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -40,7 +40,7 @@ spring: --- spring: profiles: - active: dev + active: prod # active: @profileActive@ # logback.xml中有详细的日志配置 @@ -188,6 +188,8 @@ spring-boot-plus: - /profile/signIn - /profile/signInByPhone - /**/wechat/** + # 微信支付异步通知 + - /wxPay/payNotify # 排除静态资源 - /static/**,/templates/** # 排除Swagger diff --git a/example/src/main/java/com/example/category/controller/CategoryController.java b/example/src/main/java/com/example/category/controller/CategoryController.java index 1d386d6..323b10b 100644 --- a/example/src/main/java/com/example/category/controller/CategoryController.java +++ b/example/src/main/java/com/example/category/controller/CategoryController.java @@ -1,11 +1,17 @@ package com.example.category.controller; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.example.category.entity.Category; import com.example.category.service.CategoryService; +import com.example.category.vo.CategoryDetailVo; +import com.example.order.entity.Order; +import com.example.order.service.OrderService; import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.util.LoginUtil; import lombok.extern.slf4j.Slf4j; import com.example.category.param.CategoryPageParam; -import io.geekidea.boot.framework.common.controller.BaseController; import io.geekidea.boot.framework.common.api.ApiResult; import io.geekidea.boot.framework.core.pagination.Paging; import io.geekidea.boot.framework.log.annotation.Module; @@ -39,6 +45,9 @@ public class CategoryController extends BaseController { @Autowired private CategoryService categoryService; + @Autowired + private OrderService orderService; + /** * 添加题目分类 */ @@ -69,7 +78,7 @@ public class CategoryController extends BaseController { @OperationLog(name = "删除题目分类", type = OperationLogType.DELETE) @ApiOperation(value = "删除题目分类", response = ApiResult.class) @CacheEvict(cacheNames = "category", allEntries = true) - public ApiResult deletePCategory(@RequestBody List ids) throws Exception { + public ApiResult deleteCategory(@RequestBody List ids) throws Exception { boolean flag = categoryService.deletePCategory(ids); return ApiResult.result(flag); } @@ -77,12 +86,25 @@ public class CategoryController extends BaseController { /** * 获取题目分类详情 */ - @GetMapping("/info/{id}") + @GetMapping("/wechat/info/{code}") @OperationLog(name = "题目分类详情", type = OperationLogType.INFO) @ApiOperation(value = "题目分类详情", response = Category.class) - public ApiResult getPCategory(@PathVariable("id") Long id) throws Exception { - Category pCategory = categoryService.getById(id); - return ApiResult.ok(pCategory); + public ApiResult getCategory(@PathVariable("code") String code) throws Exception { + Category category = categoryService.getOne(new LambdaQueryWrapper().eq(Category::getCode, code)); + CategoryDetailVo detailVo = Convert.convert(CategoryDetailVo.class, category); + + if (StrUtil.isEmpty(LoginUtil.getAppUserId())) { + detailVo.setIsBuy(false); + } else { + int count = orderService.count(new LambdaQueryWrapper() + .eq(Order::getGroupId, code) + .eq(Order::getUserId, LoginUtil.getAppUserId()) + .eq(Order::getStatus, "2") + ); + detailVo.setIsBuy(count > 0 ? true : false); + } + + return ApiResult.ok(detailVo); } /** diff --git a/example/src/main/java/com/example/category/mapper/CategoryMapper.java b/example/src/main/java/com/example/category/mapper/CategoryMapper.java index e016b35..31f5d7e 100644 --- a/example/src/main/java/com/example/category/mapper/CategoryMapper.java +++ b/example/src/main/java/com/example/category/mapper/CategoryMapper.java @@ -20,5 +20,4 @@ import java.io.Serializable; @Repository public interface CategoryMapper extends BaseMapper { - } diff --git a/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java b/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java index 93f46f5..0789be7 100644 --- a/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java +++ b/example/src/main/java/com/example/category/service/impl/CategoryServiceImpl.java @@ -11,6 +11,7 @@ import io.geekidea.boot.framework.core.pagination.Paging; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.geekidea.boot.framework.util.LoginUtil; import org.springframework.transaction.annotation.Transactional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/example/src/main/java/com/example/category/vo/CategoryDetailVo.java b/example/src/main/java/com/example/category/vo/CategoryDetailVo.java new file mode 100644 index 0000000..3bf2071 --- /dev/null +++ b/example/src/main/java/com/example/category/vo/CategoryDetailVo.java @@ -0,0 +1,45 @@ +package com.example.category.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@Accessors(chain = true) +@ApiModel(value = "CategoryDetailVo对象", description = "小程序专题详情对象") +public class CategoryDetailVo implements Serializable { + private static final long serialVersionUID = 6599710269043866693L; + + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("标题") + private String subject; + + @ApiModelProperty("封面图片") + private String coverImg; + + @ApiModelProperty("编号") + private String code; + + @ApiModelProperty("价格") + private BigDecimal price; + + @ApiModelProperty("描述") + private String remark; + + @ApiModelProperty("是否购买") + private Boolean isBuy; +} diff --git a/example/src/main/java/com/example/order/controller/ExampleOrderController.java b/example/src/main/java/com/example/order/controller/ExampleOrderController.java deleted file mode 100644 index 4bfd3d3..0000000 --- a/example/src/main/java/com/example/order/controller/ExampleOrderController.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2019-2029 geekidea(https://github.com/geekidea) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.order.controller; - -import com.example.order.entity.ExampleOrder; -import com.example.order.service.ExampleOrderService; -import lombok.extern.slf4j.Slf4j; -import com.example.order.param.ExampleOrderPageParam; -import io.geekidea.boot.framework.common.controller.BaseController; -import io.geekidea.boot.framework.common.api.ApiResult; -import io.geekidea.boot.framework.core.pagination.Paging; -import io.geekidea.boot.framework.log.annotation.Module; -import io.geekidea.boot.framework.log.annotation.OperationLog; -import io.geekidea.boot.framework.log.enums.OperationLogType; -import io.geekidea.boot.framework.core.validator.groups.Add; -import io.geekidea.boot.framework.core.validator.groups.Update; -import org.springframework.validation.annotation.Validated; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -/** - * 订单示例 控制器 - * - * @author geekidea - * @since 2020-03-27 - */ -@Slf4j -@RestController -@RequestMapping("/exampleOrder") -@Module("order") -@Api(value = "ExampleOrderAPI", tags = {"ExampleOrder"}) -public class ExampleOrderController extends BaseController { - - @Autowired - private ExampleOrderService exampleOrderService; - - /** - * 添加订单示例 - */ - @PostMapping("/add") - @OperationLog(name = "添加订单示例", type = OperationLogType.ADD) - @ApiOperation(value = "添加订单示例", response = ApiResult.class) - public ApiResult addExampleOrder(@Validated(Add.class) @RequestBody ExampleOrder exampleOrder) throws Exception { - boolean flag = exampleOrderService.saveExampleOrder(exampleOrder); - return ApiResult.result(flag); - } - - /** - * 修改订单示例 - */ - @PostMapping("/update") - @OperationLog(name = "修改订单示例", type = OperationLogType.UPDATE) - @ApiOperation(value = "修改订单示例", response = ApiResult.class) - public ApiResult updateExampleOrder(@Validated(Update.class) @RequestBody ExampleOrder exampleOrder) throws Exception { - boolean flag = exampleOrderService.updateExampleOrder(exampleOrder); - return ApiResult.result(flag); - } - - /** - * 删除订单示例 - */ - @PostMapping("/delete/{id}") - @OperationLog(name = "删除订单示例", type = OperationLogType.DELETE) - @ApiOperation(value = "删除订单示例", response = ApiResult.class) - public ApiResult deleteExampleOrder(@PathVariable("id") Long id) throws Exception { - boolean flag = exampleOrderService.deleteExampleOrder(id); - return ApiResult.result(flag); - } - - /** - * 获取订单示例详情 - */ - @GetMapping("/info/{id}") - @OperationLog(name = "订单示例详情", type = OperationLogType.INFO) - @ApiOperation(value = "订单示例详情", response = ExampleOrder.class) - public ApiResult getExampleOrder(@PathVariable("id") Long id) throws Exception { - ExampleOrder exampleOrder = exampleOrderService.getById(id); - return ApiResult.ok(exampleOrder); - } - - /** - * 订单示例分页列表 - */ - @PostMapping("/getPageList") - @OperationLog(name = "订单示例分页列表", type = OperationLogType.PAGE) - @ApiOperation(value = "订单示例分页列表", response = ExampleOrder.class) - public ApiResult> getExampleOrderPageList(@Validated @RequestBody ExampleOrderPageParam exampleOrderPageParam) throws Exception { - Paging paging = exampleOrderService.getExampleOrderPageList(exampleOrderPageParam); - return ApiResult.ok(paging); - } - -} - diff --git a/example/src/main/java/com/example/order/controller/OrderController.java b/example/src/main/java/com/example/order/controller/OrderController.java new file mode 100644 index 0000000..9036cb4 --- /dev/null +++ b/example/src/main/java/com/example/order/controller/OrderController.java @@ -0,0 +1,131 @@ +package com.example.order.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.category.entity.Category; +import com.example.category.service.CategoryService; +import com.example.order.entity.Order; +import com.example.order.param.CategoryOrderParam; +import com.example.order.service.OrderService; +import io.geekidea.boot.framework.common.exception.BusinessException; +import io.geekidea.boot.framework.util.LoginUtil; +import lombok.extern.slf4j.Slf4j; +import com.example.order.param.OrderPageParam; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.common.param.IdParam; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单表 控制器 + * + * @author limg + * @since 2021-02-20 + */ +@Slf4j +@RestController +@RequestMapping("/order") +@Module("order") +@Api(value = "订单表API", tags = {"订单表"}) +public class OrderController extends BaseController { + + @Autowired + private OrderService orderService; + + @Autowired + private CategoryService categoryService; + + /** + * 添加订单表 + */ + @PostMapping("/add") + @OperationLog(name = "添加订单表", type = OperationLogType.ADD) + @ApiOperation(value = "添加订单表", response = ApiResult.class) + public ApiResult addOrder(@Validated(Add.class) @RequestBody Order order) throws Exception { + boolean flag = orderService.saveOrder(order); + return ApiResult.result(flag); + } + + /** + * 提交专题订单 + */ + @PostMapping("/categoryOrder") + @OperationLog(name = "提交专题订单", type = OperationLogType.ADD) + @ApiOperation(value = "提交专题订单", response = ApiResult.class) + public ApiResult categoryOrder(@Validated @RequestBody CategoryOrderParam categoryOrderParam) throws Exception { + Category category = categoryService.getOne(new LambdaQueryWrapper().eq(Category::getCode, categoryOrderParam.getCode())); + + if (category == null) { + throw new BusinessException("专题不存在"); + } + + String format = DateUtil.format(new Date(),"yyyyMMddHHmmss"); + String numbers = RandomUtil.randomNumbers(5); + String orderId = format+numbers; + + Order order = new Order(); + order.setOrderId(orderId); + order.setOrderType("1"); + order.setGroupId(category.getCode()); + order.setAmount(category.getPrice()); + order.setUserId(LoginUtil.getAppUserId()); + order.setRemark(String.format("购买%s", category.getSubject())); + + boolean flag = orderService.saveOrder(order); + + if (!flag) { + throw new BusinessException("创建订单失败"); + } + + return ApiResult.ok(order); + } + + /** + * 删除订单表 + */ + @PostMapping("/delete/{id}") + @OperationLog(name = "删除订单表", type = OperationLogType.DELETE) + @ApiOperation(value = "删除订单表", response = ApiResult.class) + public ApiResult deleteOrder(@PathVariable("id") Long id) throws Exception { + boolean flag = orderService.deleteOrder(id); + return ApiResult.result(flag); + } + + /** + * 获取订单表详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "订单表详情", type = OperationLogType.INFO) + @ApiOperation(value = "订单表详情", response = Order.class) + public ApiResult getOrder(@PathVariable("id") Long id) throws Exception { + Order order = orderService.getById(id); + return ApiResult.ok(order); + } + + /** + * 订单表分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "订单表分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "订单表分页列表", response = Order.class) + public ApiResult> getOrderPageList(@Validated @RequestBody OrderPageParam orderPageParam) throws Exception { + Paging paging = orderService.getOrderPageList(orderPageParam); + return ApiResult.ok(paging); + } + +} + diff --git a/example/src/main/java/com/example/order/entity/ExampleOrder.java b/example/src/main/java/com/example/order/entity/Order.java similarity index 34% rename from example/src/main/java/com/example/order/entity/ExampleOrder.java rename to example/src/main/java/com/example/order/entity/Order.java index e6c13c2..fe6bfa2 100644 --- a/example/src/main/java/com/example/order/entity/ExampleOrder.java +++ b/example/src/main/java/com/example/order/entity/Order.java @@ -1,26 +1,13 @@ -/* - * Copyright 2019-2029 geekidea(https://github.com/geekidea) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package com.example.order.entity; -import io.geekidea.boot.framework.common.entity.BaseEntity; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import java.util.Date; import com.baomidou.mybatisplus.annotation.Version; import com.baomidou.mybatisplus.annotation.TableId; +import io.geekidea.boot.framework.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -31,44 +18,82 @@ import javax.validation.constraints.NotNull; import io.geekidea.boot.framework.core.validator.groups.Update; /** - * 订单示例 + * 订单表 * - * @author geekidea - * @since 2020-03-27 + * @author limg + * @since 2021-02-20 */ @Data @Accessors(chain = true) @EqualsAndHashCode(callSuper = true) -@ApiModel(value = "ExampleOrder对象") -public class ExampleOrder extends BaseEntity { +@TableName("p_order") +@ApiModel(value = "Order对象") +public class Order extends BaseEntity { private static final long serialVersionUID = 1L; @NotNull(message = "id不能为空", groups = {Update.class}) - @ApiModelProperty("主键") - @TableId(value = "id", type = IdType.AUTO) - private Long id; + @ApiModelProperty("编号") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("订单号") + @TableField("ORDER_ID") + private String orderId; - @NotBlank(message = "订单名称不能为空") - @ApiModelProperty("订单名称") - private String name; + @ApiModelProperty("用户编号") + @TableField("USER_ID") + private String userId; - @ApiModelProperty("订单编号") - private String orderNo; + @ApiModelProperty("订单类型 1-购买试题,2-充值会员") + @TableField("ORDER_TYPE") + private String orderType; + + @ApiModelProperty("金额") + @TableField("AMOUNT") + private BigDecimal amount; + + @ApiModelProperty("试卷编号") + @TableField("PAPER_ID") + private Integer paperId; + + @ApiModelProperty("专题编号") + @TableField("GROUP_ID") + private String groupId; + + @ApiModelProperty("支付流水号") + @TableField("TRADE_NO") + private String tradeNo; + + @ApiModelProperty("状态 1-新建,2-支付成功,3-已取消") + @TableField("STATUS") + private String status; + + @ApiModelProperty("支付时间") + @TableField("PAY_TIME") + private Date payTime; @ApiModelProperty("备注") + @TableField("REMARK") private String remark; - @ApiModelProperty("状态,0:禁用,1:启用") - private Integer state; + @ApiModelProperty("乐观锁") + @TableField("REVISION") + private Integer revision; - @ApiModelProperty("版本") - @Version - private Integer version; + @ApiModelProperty("创建人") + @TableField("CREATED_BY") + private String createdBy; @ApiModelProperty("创建时间") - private Date createTime; + @TableField("CREATED_TIME") + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField("UPDATED_BY") + private String updatedBy; - @ApiModelProperty("修改时间") - private Date updateTime; + @ApiModelProperty("更新时间") + @TableField("UPDATED_TIME") + private Date updatedTime; } diff --git a/example/src/main/java/com/example/order/mapper/ExampleOrderMapper.java b/example/src/main/java/com/example/order/mapper/ExampleOrderMapper.java deleted file mode 100644 index 3e677f4..0000000 --- a/example/src/main/java/com/example/order/mapper/ExampleOrderMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2019-2029 geekidea(https://github.com/geekidea) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.order.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.example.order.entity.ExampleOrder; -import com.example.order.param.ExampleOrderPageParam; - -import org.springframework.stereotype.Repository; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Param; -import java.io.Serializable; - -/** - * 订单示例 Mapper 接口 - * - * @author geekidea - * @since 2020-03-27 - */ -@Repository -public interface ExampleOrderMapper extends BaseMapper { - - -} diff --git a/example/src/main/java/com/example/order/mapper/OrderMapper.java b/example/src/main/java/com/example/order/mapper/OrderMapper.java new file mode 100644 index 0000000..56ddd16 --- /dev/null +++ b/example/src/main/java/com/example/order/mapper/OrderMapper.java @@ -0,0 +1,24 @@ +package com.example.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.order.entity.Order; +import com.example.order.param.OrderPageParam; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import java.io.Serializable; + +/** + * 订单表 Mapper 接口 + * + * @author limg + * @since 2021-02-20 + */ +@Repository +public interface OrderMapper extends BaseMapper { + + +} diff --git a/example/src/main/java/com/example/order/param/CategoryOrderParam.java b/example/src/main/java/com/example/order/param/CategoryOrderParam.java new file mode 100644 index 0000000..57ab168 --- /dev/null +++ b/example/src/main/java/com/example/order/param/CategoryOrderParam.java @@ -0,0 +1,20 @@ +package com.example.order.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@Accessors(chain = true) +@ApiModel(value = "提交专题订单对象") +public class CategoryOrderParam implements Serializable { + private static final long serialVersionUID = 6278016382933563028L; + + @ApiModelProperty("专题编号") + @NotNull(message = "专题编号不能为空") + private String code; +} diff --git a/example/src/main/java/com/example/order/param/ExampleOrderPageParam.java b/example/src/main/java/com/example/order/param/ExampleOrderPageParam.java deleted file mode 100644 index a30f259..0000000 --- a/example/src/main/java/com/example/order/param/ExampleOrderPageParam.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2019-2029 geekidea(https://github.com/geekidea) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.order.param; - -import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - *
- * 订单示例 分页参数对象
- * 
- * - * @author geekidea - * @date 2020-03-27 - */ -@Data -@Accessors(chain = true) -@EqualsAndHashCode(callSuper = true) -@ApiModel(value = "订单示例分页参数") -public class ExampleOrderPageParam extends BasePageOrderParam { - private static final long serialVersionUID = 6092080418269664419L; - - @ApiModelProperty("订单名称") - private String name; - - @ApiModelProperty("订单编号") - private String orderNo; - -} diff --git a/example/src/main/java/com/example/order/param/OrderPageParam.java b/example/src/main/java/com/example/order/param/OrderPageParam.java new file mode 100644 index 0000000..4f5c1c3 --- /dev/null +++ b/example/src/main/java/com/example/order/param/OrderPageParam.java @@ -0,0 +1,23 @@ +package com.example.order.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; + +/** + *
+ * 订单表 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-20 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "订单表分页参数") +public class OrderPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/order/service/ExampleOrderService.java b/example/src/main/java/com/example/order/service/ExampleOrderService.java deleted file mode 100644 index 270b9e3..0000000 --- a/example/src/main/java/com/example/order/service/ExampleOrderService.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2019-2029 geekidea(https://github.com/geekidea) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.order.service; - -import com.example.order.entity.ExampleOrder; -import com.example.order.param.ExampleOrderPageParam; -import io.geekidea.boot.framework.common.service.BaseService; -import io.geekidea.boot.framework.core.pagination.Paging; - -/** - * 订单示例 服务类 - * - * @author geekidea - * @since 2020-03-27 - */ -public interface ExampleOrderService extends BaseService { - - /** - * 保存 - * - * @param exampleOrder - * @return - * @throws Exception - */ - boolean saveExampleOrder(ExampleOrder exampleOrder) throws Exception; - - /** - * 修改 - * - * @param exampleOrder - * @return - * @throws Exception - */ - boolean updateExampleOrder(ExampleOrder exampleOrder) throws Exception; - - /** - * 删除 - * - * @param id - * @return - * @throws Exception - */ - boolean deleteExampleOrder(Long id) throws Exception; - - - /** - * 获取分页对象 - * - * @param exampleOrderQueryParam - * @return - * @throws Exception - */ - Paging getExampleOrderPageList(ExampleOrderPageParam exampleOrderPageParam) throws Exception; - -} diff --git a/example/src/main/java/com/example/order/service/OrderService.java b/example/src/main/java/com/example/order/service/OrderService.java new file mode 100644 index 0000000..d309192 --- /dev/null +++ b/example/src/main/java/com/example/order/service/OrderService.java @@ -0,0 +1,53 @@ +package com.example.order.service; + +import com.example.order.entity.Order; +import com.example.order.param.OrderPageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +/** + * 订单表 服务类 + * + * @author limg + * @since 2021-02-20 + */ +public interface OrderService extends BaseService { + + /** + * 保存 + * + * @param order + * @return + * @throws Exception + */ + boolean saveOrder(Order order) throws Exception; + + /** + * 修改 + * + * @param order + * @return + * @throws Exception + */ + boolean updateOrder(Order order) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteOrder(Long id) throws Exception; + + + /** + * 获取分页对象 + * + * @param orderQueryParam + * @return + * @throws Exception + */ + Paging getOrderPageList(OrderPageParam orderPageParam) throws Exception; + +} diff --git a/example/src/main/java/com/example/order/service/impl/ExampleOrderServiceImpl.java b/example/src/main/java/com/example/order/service/impl/ExampleOrderServiceImpl.java deleted file mode 100644 index 4ccd4d6..0000000 --- a/example/src/main/java/com/example/order/service/impl/ExampleOrderServiceImpl.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2019-2029 geekidea(https://github.com/geekidea) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.order.service.impl; - -import com.example.order.entity.ExampleOrder; -import com.example.order.mapper.ExampleOrderMapper; -import com.example.order.service.ExampleOrderService; -import com.example.order.param.ExampleOrderPageParam; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; -import io.geekidea.boot.framework.core.pagination.Paging; -import io.geekidea.boot.framework.core.pagination.PageInfo; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.commons.lang3.StringUtils; -import org.springframework.transaction.annotation.Transactional; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * 订单示例 服务实现类 - * - * @author geekidea - * @since 2020-03-27 - */ -@Slf4j -@Service -public class ExampleOrderServiceImpl extends BaseServiceImpl implements ExampleOrderService { - - @Autowired - private ExampleOrderMapper exampleOrderMapper; - - @Transactional(rollbackFor = Exception.class) - @Override - public boolean saveExampleOrder(ExampleOrder exampleOrder) throws Exception { - return super.save(exampleOrder); - } - - @Transactional(rollbackFor = Exception.class) - @Override - public boolean updateExampleOrder(ExampleOrder exampleOrder) throws Exception { - return super.updateById(exampleOrder); - } - - @Transactional(rollbackFor = Exception.class) - @Override - public boolean deleteExampleOrder(Long id) throws Exception { - return super.removeById(id); - } - - @Override - public Paging getExampleOrderPageList(ExampleOrderPageParam exampleOrderPageParam) throws Exception { - Page page = new PageInfo<>(exampleOrderPageParam, OrderItem.desc(getLambdaColumn(ExampleOrder::getCreateTime))); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - String keyword = exampleOrderPageParam.getKeyword(); - String name = exampleOrderPageParam.getName(); - String orderNo = exampleOrderPageParam.getOrderNo(); - // keyword模糊查询 - if (StringUtils.isNotBlank(keyword)) { - wrapper.like(ExampleOrder::getName, keyword).or().like(ExampleOrder::getOrderNo, keyword); - } - // name模糊查询 - if (StringUtils.isNotBlank(name)) { - wrapper.like(ExampleOrder::getName, name); - } - // 订单号模糊查询 - if (StringUtils.isNotBlank(orderNo)) { - wrapper.like(ExampleOrder::getOrderNo, orderNo); - } - IPage iPage = exampleOrderMapper.selectPage(page, wrapper); - return new Paging(iPage); - } - -} diff --git a/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java b/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..8278969 --- /dev/null +++ b/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java @@ -0,0 +1,58 @@ +package com.example.order.service.impl; + +import com.example.order.entity.Order; +import com.example.order.mapper.OrderMapper; +import com.example.order.service.OrderService; +import com.example.order.param.OrderPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 订单表 服务实现类 + * + * @author limg + * @since 2021-02-20 + */ +@Slf4j +@Service +public class OrderServiceImpl extends BaseServiceImpl implements OrderService { + + @Autowired + private OrderMapper orderMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean saveOrder(Order order) throws Exception { + return super.save(order); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateOrder(Order order) throws Exception { + return super.updateById(order); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deleteOrder(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Paging getOrderPageList(OrderPageParam orderPageParam) throws Exception { + Page page = new PageInfo<>(orderPageParam, OrderItem.desc(getLambdaColumn(Order::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = orderMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + +} diff --git a/example/src/main/resources/mapper/invite/InviteMapper.xml b/example/src/main/resources/mapper/invite/InviteMapper.xml new file mode 100644 index 0000000..0bfa682 --- /dev/null +++ b/example/src/main/resources/mapper/invite/InviteMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/example/src/main/resources/mapper/order/OrderMapper.xml b/example/src/main/resources/mapper/order/OrderMapper.xml new file mode 100644 index 0000000..048e4e7 --- /dev/null +++ b/example/src/main/resources/mapper/order/OrderMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/example/src/main/resources/mapper/question/QuestionMapper.xml b/example/src/main/resources/mapper/question/QuestionMapper.xml index 823fa60..f66de2d 100644 --- a/example/src/main/resources/mapper/question/QuestionMapper.xml +++ b/example/src/main/resources/mapper/question/QuestionMapper.xml @@ -39,6 +39,10 @@ and t.CHAPTER_ID = #{param.chapterId} + and t.GROUP_ID is NULL + + + and t.ID = 1 diff --git a/wechat/src/main/java/com/koronol/invite/controller/InviteController.java b/wechat/src/main/java/com/koronol/invite/controller/InviteController.java new file mode 100644 index 0000000..af1e483 --- /dev/null +++ b/wechat/src/main/java/com/koronol/invite/controller/InviteController.java @@ -0,0 +1,72 @@ +package com.koronol.invite.controller; + +import com.koronol.invite.entity.Invite; +import com.koronol.invite.service.InviteService; +import lombok.extern.slf4j.Slf4j; +import com.koronol.invite.param.InvitePageParam; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.common.param.IdParam; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 邀请表 控制器 + * + * @author limg + * @since 2021-02-20 + */ +@Slf4j +@RestController +@RequestMapping("/invite") +@Module("invite") +@Api(value = "邀请表API", tags = {"邀请表"}) +public class InviteController extends BaseController { + + @Autowired + private InviteService inviteService; + + /** + * 添加邀请表 + */ + @PostMapping("/submit") + @OperationLog(name = "添加邀请表", type = OperationLogType.ADD) + @ApiOperation(value = "添加邀请表", response = ApiResult.class) + public ApiResult addInvite(@Validated(Add.class) @RequestBody Invite invite) throws Exception { + boolean flag = inviteService.submit(invite); + return ApiResult.result(flag); + } + + /** + * 获取邀请表详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "邀请表详情", type = OperationLogType.INFO) + @ApiOperation(value = "邀请表详情", response = Invite.class) + public ApiResult getInvite(@PathVariable("id") Long id) throws Exception { + Invite invite = inviteService.getById(id); + return ApiResult.ok(invite); + } + + /** + * 邀请表分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "邀请表分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "邀请表分页列表", response = Invite.class) + public ApiResult> getInvitePageList(@Validated @RequestBody InvitePageParam invitePageParam) throws Exception { + Paging paging = inviteService.getInvitePageList(invitePageParam); + return ApiResult.ok(paging); + } + +} + diff --git a/wechat/src/main/java/com/koronol/invite/entity/Invite.java b/wechat/src/main/java/com/koronol/invite/entity/Invite.java new file mode 100644 index 0000000..ddd078e --- /dev/null +++ b/wechat/src/main/java/com/koronol/invite/entity/Invite.java @@ -0,0 +1,66 @@ +package com.koronol.invite.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.util.Date; + +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import io.geekidea.boot.framework.core.validator.groups.Update; + +/** + * 邀请表 + * + * @author limg + * @since 2021-02-20 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("p_invite") +@ApiModel(value = "Invite对象") +public class Invite extends BaseEntity { + private static final long serialVersionUID = 1L; + + @NotNull(message = "id不能为空", groups = {Update.class}) + @ApiModelProperty("ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("发起人") + @TableField("USER_A") + @NotNull(message = "用户不存在") + private Integer userA; + + @ApiModelProperty("助力人") + @TableField("USER_B") + @NotNull(message = "您还未登录") + private Integer userB; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + private Integer revision; + + @ApiModelProperty("创建人") + @TableField("CREATED_BY") + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE) + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/wechat/src/main/java/com/koronol/invite/mapper/InviteMapper.java b/wechat/src/main/java/com/koronol/invite/mapper/InviteMapper.java new file mode 100644 index 0000000..78eaf45 --- /dev/null +++ b/wechat/src/main/java/com/koronol/invite/mapper/InviteMapper.java @@ -0,0 +1,24 @@ +package com.koronol.invite.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.koronol.invite.entity.Invite; +import com.koronol.invite.param.InvitePageParam; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import java.io.Serializable; + +/** + * 邀请表 Mapper 接口 + * + * @author limg + * @since 2021-02-20 + */ +@Repository +public interface InviteMapper extends BaseMapper { + + +} diff --git a/wechat/src/main/java/com/koronol/invite/param/InvitePageParam.java b/wechat/src/main/java/com/koronol/invite/param/InvitePageParam.java new file mode 100644 index 0000000..8a41bfc --- /dev/null +++ b/wechat/src/main/java/com/koronol/invite/param/InvitePageParam.java @@ -0,0 +1,23 @@ +package com.koronol.invite.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; + +/** + *
+ * 邀请表 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-20 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "邀请表分页参数") +public class InvitePageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/wechat/src/main/java/com/koronol/invite/service/InviteService.java b/wechat/src/main/java/com/koronol/invite/service/InviteService.java new file mode 100644 index 0000000..7d70c17 --- /dev/null +++ b/wechat/src/main/java/com/koronol/invite/service/InviteService.java @@ -0,0 +1,54 @@ +package com.koronol.invite.service; + +import com.koronol.invite.entity.Invite; +import com.koronol.invite.param.InvitePageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +/** + * 邀请表 服务类 + * + * @author limg + * @since 2021-02-20 + */ +public interface InviteService extends BaseService { + + /** + * 保存 + * + * @param invite + * @return + * @throws Exception + */ + boolean saveInvite(Invite invite) throws Exception; + + /** + * 修改 + * + * @param invite + * @return + * @throws Exception + */ + boolean updateInvite(Invite invite) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteInvite(Long id) throws Exception; + + + /** + * 获取分页对象 + * + * @param invitePageParam + * @return + * @throws Exception + */ + Paging getInvitePageList(InvitePageParam invitePageParam) throws Exception; + + boolean submit(Invite invite) throws Exception; +} diff --git a/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java b/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java new file mode 100644 index 0000000..10b77b7 --- /dev/null +++ b/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java @@ -0,0 +1,105 @@ +package com.koronol.invite.service.impl; + +import com.koronol.invite.entity.Invite; +import com.koronol.invite.mapper.InviteMapper; +import com.koronol.invite.service.InviteService; +import com.koronol.invite.param.InvitePageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.koronol.profile.entity.Profile; +import com.koronol.profile.service.ProfileService; +import io.geekidea.boot.framework.common.exception.BusinessException; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDate; + +/** + * 邀请表 服务实现类 + * + * @author limg + * @since 2021-02-20 + */ +@Slf4j +@Service +public class InviteServiceImpl extends BaseServiceImpl implements InviteService { + + @Autowired + private InviteMapper inviteMapper; + + @Autowired + private ProfileService profileService; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean saveInvite(Invite invite) throws Exception { + return super.save(invite); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateInvite(Invite invite) throws Exception { + return super.updateById(invite); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deleteInvite(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Paging getInvitePageList(InvitePageParam invitePageParam) throws Exception { + Page page = new PageInfo<>(invitePageParam, OrderItem.desc(getLambdaColumn(Invite::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = inviteMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean submit(Invite invite) throws Exception { + Profile profile = profileService.getById(invite.getUserA()); + Profile profile1 = profileService.getById(invite.getUserB()); + if (invite.getUserA() == invite.getUserB()) { + throw new BusinessException(403, "不能给自己助力"); + } + if (profile == null) { + throw new BusinessException(404, "用户不存在"); + } + if (profile1 == null) { + throw new BusinessException(404, "您还未注册"); + } + Invite invite1 = inviteMapper.selectOne(new LambdaQueryWrapper() + .eq(Invite::getUserA, invite.getUserA()) + .eq(Invite::getUserB, invite.getUserB())); + if (invite1 != null) { + throw new BusinessException(400, "您已助力,请勿重复助力"); + } + inviteMapper.insert(invite); + profile.setIsVip("1"); // 设置为会员 + // 如果会员已过期,则设置从今天开始+3天 + if(profile.getValid() == null || LocalDate.now().isAfter(profile.getValid())) { + profile.setValid(LocalDate.now().plusDays(3)); + } else { + profile.setValid(profile.getValid().plusDays(3));// 邀请新用户赠送3天会员 + } + profile1.setIsVip("1"); + if(profile1.getValid() == null || LocalDate.now().isAfter(profile1.getValid())) { + profile1.setValid(LocalDate.now().plusDays(3)); + } else { + profile1.setValid(profile1.getValid().plusDays(3));// 被邀请的新用户也赠送3天会员 + } + profileService.updateProfile(profile1); + boolean flag = profileService.updateProfile(profile); + return flag; + } + +} diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java index 8cf0907..a3d499c 100644 --- a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java @@ -1,12 +1,17 @@ package com.koronol.profile.controller; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.http.HttpUtil; +import com.example.order.entity.Order; +import com.example.order.service.OrderService; import com.koronol.profile.entity.Profile; import com.koronol.profile.param.PhoneLoginParam; import com.koronol.profile.param.ProfileQueryParam; import com.koronol.profile.service.ProfileService; import com.koronol.profile.vo.ProfileInfoVo; import com.koronol.profile.vo.ProfileTokenVo; +import io.geekidea.boot.framework.util.LoginUtil; import lombok.extern.slf4j.Slf4j; import com.koronol.profile.param.ProfilePageParam; import io.geekidea.boot.framework.common.controller.BaseController; @@ -24,7 +29,9 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.nio.charset.Charset; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -44,6 +51,9 @@ public class ProfileController extends BaseController { @Autowired private ProfileService profileService; + @Autowired + private OrderService orderService; + /** * 添加用户信息 */ @@ -55,6 +65,27 @@ public class ProfileController extends BaseController { return ApiResult.result(flag); } + @PostMapping("/recharge") + @OperationLog(name = "会员充值", type = OperationLogType.UPDATE) + @ApiOperation(value = "会员充值", response = ApiResult.class) + public ApiResult recharge() throws Exception { + String format = DateUtil.format(new Date(),"yyyyMMddHHmmss"); + String numbers = RandomUtil.randomNumbers(5); + String orderId = format+numbers; + + Order order = new Order(); + order.setOrderId(orderId); + order.setOrderType("2"); + order.setAmount(new BigDecimal(0.01)); + order.setUserId(LoginUtil.getAppUserId()); + order.setRemark("会员充值"); + + orderService.saveOrder(order); + order.getId(); + + return ApiResult.ok(order); + } + /** * 修改用户信息 */ diff --git a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java index d41255b..f37f4ac 100644 --- a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java +++ b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java @@ -70,4 +70,6 @@ public interface ProfileService extends BaseService { ProfileTokenVo signInByPhone(PhoneLoginParam phoneLoginParam) throws Exception; ProfileInfoVo getProfileInfo(Long id) throws Exception; + + boolean renew(String userId) throws Exception; } diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index 9337ca4..fa3ea4f 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -50,6 +50,7 @@ import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.spec.AlgorithmParameterSpec; import java.time.Duration; +import java.time.LocalDate; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -133,8 +134,12 @@ public class ProfileServiceImpl extends BaseServiceImpl profile = new Profile(); } profile.setOpenId(openId); - profile.setAvatarUrl(profileQueryParam.getAvatarUrl()); - profile.setNickName(profileQueryParam.getNickName()); + if (profileQueryParam.getAvatarUrl() != null) { + profile.setAvatarUrl(profileQueryParam.getAvatarUrl()); + } + if (profileQueryParam.getNickName() != null) { + profile.setNickName(profileQueryParam.getNickName()); + } ProfileTokenVo profileTokenVo = getProfileTokenVo(profile); return profileTokenVo; @@ -193,6 +198,20 @@ public class ProfileServiceImpl extends BaseServiceImpl return profileInfoVo; } + @Override + public boolean renew(String userId) throws Exception { + Profile profile = profileMapper.selectById(userId); + profile.setIsVip("1"); // 设置为会员 + // 如果会员已过期,则设置从今天开始 +60天 + if(profile.getValid() == null || LocalDate.now().isAfter(profile.getValid())) { + profile.setValid(LocalDate.now().plusDays(60)); + } else { + profile.setValid(profile.getValid().plusDays(60));// 邀请新用户赠送3天会员 + } + + return profileMapper.updateById(profile) > 0 ? true : false; + } + private ProfileTokenVo getProfileTokenVo(Profile profile) throws Exception { // 获取数据库中保存的盐值 String newSalt = SaltUtil.getSalt("666", jwtProperties); diff --git a/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java b/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java index 48d5668..9a850a8 100644 --- a/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java +++ b/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java @@ -7,12 +7,16 @@ import com.example.order.entity.Order; import com.example.order.service.OrderService; import com.ijpay.core.enums.SignType; import com.ijpay.core.enums.TradeType; +import com.ijpay.core.kit.HttpKit; import com.ijpay.core.kit.IpKit; import com.ijpay.core.kit.WxPayKit; import com.ijpay.wxpay.WxPayApi; import com.ijpay.wxpay.WxPayApiConfig; import com.ijpay.wxpay.WxPayApiConfigKit; +import com.ijpay.wxpay.model.OrderQueryModel; import com.ijpay.wxpay.model.UnifiedOrderModel; +import com.koronol.profile.entity.Profile; +import com.koronol.profile.service.ProfileService; import com.koronol.wxpay.entity.WxPayBean; import com.koronol.wxpay.param.WxPayNotifyParam; import com.koronol.wxpay.param.WxPayParam; @@ -27,17 +31,21 @@ 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.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; import java.util.Map; import static io.geekidea.boot.framework.util.HttpServletRequestUtil.getRequest; @Slf4j @RestController -@RequestMapping("/wechat") +@RequestMapping("/wxPay") @Module("wxPay") @Api(value = "微信支付相关API", tags = {"微信支付"}) public class WxPayController extends AbstractWxPayApiController { @@ -48,6 +56,9 @@ public class WxPayController extends AbstractWxPayApiController { @Autowired private OrderService orderService; + @Autowired + private ProfileService profileService; + @Autowired WxPayBean wxPayBean; @@ -130,16 +141,98 @@ public class WxPayController extends AbstractWxPayApiController { @PostMapping("/payNotify") @OperationLog(name = "微信支付异步信息", type = OperationLogType.UPDATE) @ApiOperation(value = "微信支付异步信息", response = ApiResult.class) - public ApiResult notify(@RequestBody WxPayNotifyParam wxPayNotifyParam) throws Exception { - - return ApiResult.ok(true); + public String notify(HttpServletRequest request) throws Exception { + String xmlMsg = HttpKit.readData(request); + log.info("支付通知=" + xmlMsg); + Map params = WxPayKit.xmlToMap(xmlMsg); + + String returnCode = params.get("return_code"); + + // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态 + // 注意此处签名方式需与统一下单的签名类型一致 + if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.HMACSHA256)) { + if (WxPayKit.codeIsOk(returnCode)) { + // 更新订单信息 + Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getOrderId, params.get("out_trade_no"))); + // 发送通知等 + Map xml = new HashMap(2); + xml.put("return_code", "SUCCESS"); + xml.put("return_msg", "OK"); + + if (order == null) { + return null; + } + // 如果订单已经支付成功则直接返回成功 + if (order.getStatus().equals("2")) { + return WxPayKit.toXml(xml); + } + order.setStatus("2"); // 订单状态设置为成功 + order.setTradeNo(params.get("transaction_id")); // 微信支付订单号 + order.setPayTime(new Date()); + if (order.getOrderType().equals("2")) { + boolean flag = profileService.renew(order.getUserId()); + } + orderService.updateOrder(order); + return WxPayKit.toXml(xml); + } + } + return null; } @GetMapping("/queryOrder") - @OperationLog(name = "微信支付异步信息", type = OperationLogType.UPDATE) - @ApiOperation(value = "微信支付异步信息", response = ApiResult.class) - public ApiResult queryOrder(@RequestBody WxPayNotifyParam wxPayNotifyParam) throws Exception { - - return ApiResult.ok(true); + @OperationLog(name = "查询订单", type = OperationLogType.UPDATE) + @ApiOperation(value = "查询订单", response = ApiResult.class) + @Transactional + public ApiResult> queryOrder(@RequestParam(value = "transactionId", required = false) String transactionId, @RequestParam(value = "outTradeNo", required = false) String outTradeNo) throws Exception { + try { + WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); + + Map params = OrderQueryModel.builder() + .appid(wxPayApiConfig.getAppId()) + .mch_id(wxPayApiConfig.getMchId()) + .transaction_id(transactionId) + .out_trade_no(outTradeNo) + .nonce_str(WxPayKit.generateStr()) + .build() + .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); + log.info("请求参数:{}", WxPayKit.toXml(params)); + String query = WxPayApi.orderQuery(params); + Map result = WxPayKit.xmlToMap(query); + String returnCode = result.get("return_code"); + String resultCode = result.get("result_code"); + String tradeState = result.get("trade_state"); + + // 交易成功判断条件: return_code、result_code和trade_state都为SUCCESS + if (WxPayKit.codeIsOk(returnCode) && WxPayKit.codeIsOk(resultCode) && WxPayKit.codeIsOk(tradeState)) { + String orderId = result.get("out_trade_no"); + Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getOrderId, orderId)); + // 如果订单已被回调更新成功,则不重复更新 + if (order != null && !order.getStatus().equals("2")) { + order.setPayTime(Convert.toDate(result.get("time_end"))); + order.setStatus("2"); + order.setTradeNo(result.get("transaction_id")); + orderService.updateOrder(order); + // 如果是重置订单,则更新用户信息 + if (order.getOrderType().equals("2")) { + profileService.renew(order.getUserId()); + } + } + // 返回成功信息 + Map success = new HashMap<>(); + success.put("tradeState", "SUCCESS"); + success.put("orderId", orderId); + success.put("payTime", result.get("time_end")); + return ApiResult.ok(success); + } + log.info("查询结果: {}", query); + Map fail = new HashMap<>(); + fail.put("tradeState", "FAIL"); + fail.put("orderId", result.get("out_trade_no")); + fail.put("returnMsg", result.get("return_msg")); + return ApiResult.ok(fail); + } catch (Exception e) { + e.printStackTrace(); + throw new BusinessException(e.getMessage()); + } } } diff --git a/wechat/src/main/resources/cert/apiclient_cert.p12 b/wechat/src/main/resources/cert/apiclient_cert.p12 new file mode 100644 index 0000000000000000000000000000000000000000..b336c74618cd5aa99613e2639e7c8edb2829205b GIT binary patch literal 2718 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 + + + + diff --git a/wechat/target/classes/cert/apiclient_cert.p12 b/wechat/target/classes/cert/apiclient_cert.p12 new file mode 100644 index 0000000000000000000000000000000000000000..4063fd92f47aae259e0c502b778d156cd8b4f6f4 GIT binary patch literal 4751 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 P`nMs5mr0uP8FKj_Gh&i@ literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/invite/entity/Invite.class b/wechat/target/classes/com/koronol/invite/entity/Invite.class new file mode 100644 index 0000000000000000000000000000000000000000..53c99b5cc072036bb9b472abdaf4ddd91e292193 GIT binary patch literal 6060 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 BABq3~ literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/invite/mapper/InviteMapper.class b/wechat/target/classes/com/koronol/invite/mapper/InviteMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..0e3ea240d9a7dabbeb95e1d89321b8c74ec09e86 GIT binary patch literal 398 zcmb7A!Ab)`49!&CwN*in{(u+3T)eFadJu#ap#|@=YaG(H{e-^-`}jcG?+yZkE)hs&2(%qs8*8 z^k|1hCyu`BBeoIb6oaTSy;Tdf+b8 zo^1!)16Laf3eM+!Ub6JUk(-Y0oRgHP#YF{|wFHCF2X^KyXiM)BRu~fnk~Db2IeCek zBn+AAV&h;((68*jyb4Zt%`3*WFT~C=cg3>yXBe`PT8RSby9|ScVr7kQaNFa)Yqz76kr7W@+#}qf!indl+L~~p znc`z=NNGLCmB|x>siL|FsN0o@JB>xY9_yq@5v{}hI~td+bspB+eNxj4L>P#$~NF2t_W;?{9@0o z%S9TlM;)3QdJELx;nwqm_j?E1@AhB5INbiY|7z>U>)kxM(9O{I2X~>!Q25_L=W!ON z@)*{~Ih<#>L8@FK8gf-|yQWlRKcRhyO%*h3M+JIcuJq$3>{~pfb-7|GSQSCMH%!p4 zX6Zi$qsXFzY>vDXI$_eC^wQZw5t}R{YnJxFKEx@#bY|jUANuH?ZzrH11LV<+F+`^> zo+7J@jsDawnH2tBY8;hPdr9dt$~LH`TrRzZncgXXgYgEYu~YsEV{x+d3F+7^mG@xA zxAcx?IzcfIs~c~_BoqXQ(-N=6OvOm#n;Yts`uU}^!H z;baqShT(R?5rav%nt|y>B``Ayj74M2%#QsF$Vz}rf*q$lY5of_@kLyUr7~Qm=#>yx Fe*>AV-EjZ_ literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/invite/service/InviteService.class b/wechat/target/classes/com/koronol/invite/service/InviteService.class new file mode 100644 index 0000000000000000000000000000000000000000..fc41d983c83a309493bb5adc985e85baf86d51e8 GIT binary patch literal 829 zcmcIi%TB^T6upB$1yOnU_yQByI2&DIT$pHL(nJz=Zp=`wlYw@oX{SZk{*?hNC zQUp;%H!hm?p5AlLeZ9UtzW~4q96Hc)V9$Yl2Gv-kc&$@qk-<^h^-RFWCNkRiTuot) z+A90V^Q3O)mPnTm9)?yK9XoKqpq7L~VdpZnA^NxoTWxnFQo((pC3lUMQ;mj1n@jeD zL|4U@!QD##P(&h_*=M=EEbew(Ww=Bft04+LFvjwG!f|4vG51V_JQPxCkyXiwrpT8; zrLQDmNkrW~{jb~E@3TCoipp^^2oyCRe45hDV1%CSu5U32sIwTORC&lRM2!9X`;W%e zzDXhvuar--Xy&V!DI90}V$fc33?F_=`3&ld4d=BpI9+XO literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/invite/service/impl/InviteServiceImpl.class b/wechat/target/classes/com/koronol/invite/service/impl/InviteServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..4036d15670ae0bdd519b0e97bb22575a0ce36098 GIT binary patch literal 7577 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 PFHjv5gD8U-m=*^B?duDH diff --git a/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class b/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class index d24731871d49670aafd12207bf21eeab42da4121..2ad564cff9073e6efce5ebf18a138ab4bff57be6 100644 GIT binary patch delta 4737 zcmbtYc|era7C*l`GkhN(7aT@Vun<8_1q@0hBYU}*W|m=@MJd9lC;)nl1KT%WHYndu{rD_ZtSZxBc;ex%b?2&pr2?-&yABOS3<( zi#)q;+hZa!P}Mu)BFhZj&5&(|9u{&!BIxJHQsg&^tW)hBM!0>$u3Mn5st8M zq$4R9U}2ymL1ft&WHyVFa1;jHvf3<;wo&5X7!0v-tc^d|IL<+2D26#0juAFSIv9n~ z4vxnO4#r@tg%fRzGt845$;EgZCx-;a76%h7oNDeZwJ_0Ig>N;!!>jI)(2%UZ;d^7i5A?IPE?iSpNsE8f_&fGOirjCk?r!jqkgf3# z`~=B$mnNsV*9TG}8b9L~jbE`{<2OU?Gt_=VS+I#NB&i|X&`?!dGi7$T$x@;fl!A1f zReoN1VRd=UjKb2!`l^~4!{=62SBC4g@==5Gs{jq}AN$cN!SF0>x0J0_B7U%xqg9g9 zZcXRIa@VP3NZPPbrG+Dgk0?Cl#1W-~PARXfq)x3;R3}KbyGv&$L41^ zN>w4PI;*rB((;N_I!%_fa<8SjXw?;uYq?ME?-WoOL6vE#Zdx5;Za-AZK9vROMF4t5 zwCb+1wd$dAw8}M9Pt^;8Bed#GZR#-9$5MT@>Zkf>m8bHxDp38kI$RYpS5y)0DK0M7 zvPSN-6we%~252=<4brMu9c8J(S{EuC3aUu&t;v^w43J4vfE4Cs?pj$4+VZ=Y$LJc}8&Bz;J*4BJ^9 z<#lz{O9QHRLRGS#s4!%3Uw4n)t9f@unIF@e zhh)8{tQl&i$KUBsZywmAA9^_r;p%Wj4a254hU*Dy+l`)F#mxHJn%cq<-qfM1AG?8FS3S33UikpnhZL>(Ik@L5m)hOfzE3+1?;stY-Tb0BZ4;33cA z2RR!1MTW};j^+RbWTTjU$R=qP-%Rgx2@OVt17 z_B=PHKPKC0+W#_rhwSuBec>#V#c=?n-l|Fe#-WAIO z$Ruq{$$M1tK8?>5|2~;x$p@C~w&cU#WUxo<$q2@=B2)G<*TVy0 zzI3Oao2mB}g0PGrEGG!J5`+~5VI}QbMG$Ty2&-w~9fV>HzZmW$2zN1;?~xDr4fhwW zzGMCUBe8S5* zQ6yPDB^*J9b9Nj-QhVhy<2=i#4MF6^0YtBM0KaVmaIyTEzbl#BcQeyWX<9UL5kH^P z(eD`ZFGxiaX>q-LNz$R+Gvq7zt0d9-sq(da!?#t2l*+dhPo@_`8;ZhS@Ve1MksYj}ol?L$8^nAZ!YZ3UuT7VW)#AiBjxw>W)*TruzshgaRUmz3 zA1NQtX3KsyMZcF=gGB9@(GoD`f{!phoA~DwlD_?v4n%&xW3~_MB7h%(Sk}=xKhKDi zn7s~8 zUWA$oTBSlUH!c5K@%v1_^Ld>*2Fr7jBD@L~z0h{n1Ig%}6G@HZ(mf>WUS~W}MeCGQCR>vY%#nr5c>sS-ZSOo^bGE+Q@BoT>l zSW$Gp9n2MNUxntMx=DmpQF#?Kzhiv7;xr_a=jTOZy~Y;cRfR}FCuZ{b(i1_XvQ|xN z>m&YOC7b2p?3W6$y}H?Bs)gyuaUen#Ix}ArJ1QjTAPwmZr1>)Vg7-1ZSd$l(`Qy~F z1n~m5YCz8(7e-~la>?->yH*a(4=waoo&8*;A0#Xq^}HJ?HN_N&Gd`7QUA@o^0=y)f7cw~ z-?ef7CQ#MGa^2+6lC5(6c1A2#e6d&7P%llqR~FWw3%YVY_Jx)Bn-nmBZqcB$NJjgU zEr(GvKZ&8GEpkJ%%!@tCI^IY_S!dpNJ~Gjbf(nPkAEh{y%X7(d1ZuXbRn?M-T&@em dho1Z&qF(5Y!_WtP+g7Kvt&(G#7vMs(`A;Td2nYZG delta 4101 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 KKy167-uVWu&TZxZ literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/wxpay/controller/WxPayController.class b/wechat/target/classes/com/koronol/wxpay/controller/WxPayController.class new file mode 100644 index 0000000000000000000000000000000000000000..16ccb6b152f396b58924515148e9d51d7259313b GIT binary patch literal 13073 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 literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/wxpay/interceptor/WxPayInterceptor.class b/wechat/target/classes/com/koronol/wxpay/interceptor/WxPayInterceptor.class new file mode 100644 index 0000000000000000000000000000000000000000..e9d614cc80cb215ecd4209096a7684aded8d3106 GIT binary patch literal 1542 zcmb7ENmCO+6#hEfU>F30sJH?y1QiBxK?$NjX=xdkB9xZiI!T)hOlIOtBY4xBUc6&@ z77tv!1WT%1PFDFpaQO)yw0u1i3j&2H57Wz=*YADrdtdjL-|yZ7IEB$Tns7uzx0;h` z=!qkQqZ*EBINpHXI5hOd5rYv&KTc>E&~Q@2DTdgvX`6C{A)M^F%@7%P@`9l`ZQA0- zOerheNuIUHl1Mu_Zr$dtsrFT4L>5htp+B8-O2)L~I<{jOvvXzs$S`dw+?*&&$2IQE z-Qtg~t{PGdTgtAu!tJ~YolmBx_(MKtc*1>X3279iEE`v7$OMK7@nA-HGF8{jD?7F) z0zbpzcEPxrof0{j>bXaimV_)id4|5U;}#6B?3#ArzROEu)^VqeS&=mY42f4I?c8fSD2;;fEy7-AUQD1=q+jM1zo zU7nME{?W2IzJ}J_tE^7U*wQSCOLIy-rel-9zCK@Ad0JVSfBoa-enRX8nwFv6O*AZF%ZK*pN5m?KzeVGn$YOYrj)$RAcAMu`V0^*Ktb;EYhp1iG<{JRm_#ce%-01{O(Zt2QXU@6jeBU|WoUcFMZvr@vkvI&TjUp3= zhHMPEDDqJZGjw~FE4W>`__a-mf6iF6jglOG0kza~6}T%jWC=Dc*JBW-hW zslk`c26uVgyuCETm#3vK?k>-$z$g(~_nO?Ms#K;h#}~M1bEj%vFV9&Oe>6Kw?MlVA z=ZV3Pe$8@emZHxq^HaPLbU_+0#46mmqHyW6#=Tl=3L0sW2wlr-+CBl36Z2)!cZE}B z=*?vRU};6Ezj#qL-HLTpsHs!!1DsQRG4$VPI=-k|CE*E@W8871&wUb{=1LcYG`&S$ zty-?hf4`XH4KYRP+C*Y3sNcXaxV`yu>(jHHN3XU%JlX!Zvh!l?`-9bQPuI2|uIxPC zNFad@hRpxUo4^2iNxk;2Gg(@Uc11~nAVl33gPjrg)vraGHp&3$MrQy~#K`WarPH8x zj;WUD?xcuGmXS4b@4#LMDP44{LQq*Z-HBELdXOZK;UIeHR>hJ4BV^P0+;bTEdj1Qv zRTz=={AXxW!@0MJ1g^eLNfERI54DOzV1hvkeFU8%%0on^;V{+35sAirpfieo=t`WB z{32P6-VMd72(&!}eXWFD0)t=`0mBg-4Ph>XFuFb#wD~U-Jw(w6^B4vLl;ao*QAPrv fhD_=ke{H2DVq_O29b}!rNwNp1_!OPf9?tv%BG1_o literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/wxpay/param/WxPayParam.class b/wechat/target/classes/com/koronol/wxpay/param/WxPayParam.class new file mode 100644 index 0000000000000000000000000000000000000000..fb7a28a412b343ece5f0b6ba54fce266fd9cf6c9 GIT binary patch literal 2142 zcma)7%~M-d6#w1iz2qf?PoX6h6eTnJRlICD_O3&Vl0?Nb1`oWTbAwWE&~?@l9Q&LE?(D{mklSaS8vk8 z1#`+?GV-$yV>|9DCR_ck8gjw{rTGVtt}!MG%eFTBM?j^ z7X*|M#-QD#X&KX{l|{q3s1t$&YG+xX&N6xSm5Q4)iK%-sYpejxefh?$zB(&K!ig*!?u=h|Ya&^z@~AYafQ=NZ_HBuS<`QpI+Eg4u#>XW+Pe6OD zXBMv*S$81$A$wx)W!%3aQ?{Ek9DzDnPiyf@^SrBPuTJTOGC3S5 z4u^o2)vYlJi(*bM<~)8$_BgZ7&W%rv5f=E;I#}_%U2?L< zIa79}u}bg>IYH+R$U;>~GDFL1;->V35)=D-m7hz8Kb=iUq=Ll8&s z99k*2@lz4NA^wvQo{#Wc$NhQ!cND1%NR|#>yod;uq>^hFebU?oceQ5=;$AuEQLdq~ zGJ<22W1a!J@iI?B(#dtN^Y;kc-RIm`)0rKp;T+uW+)~pyi5}lM!}Y%oS#~T&m|gsLDp_7bsst4Q`}pv#%R1`gYCKdiQZ|??i2a>9 z?_t=jIENGE2Df1zC)vFKZ$|MdbwM(42Cq@#4-9+xIwciT9G`wlA-uu(orr|BztIrJ zn@?~kj8pv6#1pi8VuW90`M!JxPIH%htFm+nFK_^!*AR6Vo=Q;O{P9WpVg96_O7Be5 zz@RczrmLfAAV;#arqnvZeVd4UB=uTGkr#2rztJRxyy~b;O}`h_&mF`m3}BEsRhBwL zDZro1lcYpaa}0;^HYKG@!vvJ4R4AlD2$l{Zp3NlA) literal 0 HcmV?d00001 diff --git a/wechat/target/classes/com/koronol/wxpay/vo/PaymentVo.class b/wechat/target/classes/com/koronol/wxpay/vo/PaymentVo.class new file mode 100644 index 0000000000000000000000000000000000000000..ec0052bc59fd08574b5e7c703c9c35975af9e320 GIT binary patch literal 4111 zcmb7G-*X#R75=WQ)vn}~te7~7(gd91f-Tz>(D0*jTyWEry4Z<{Qd{@t6e320WKFgzvDK61i3X=QR& zemXN=E;{+?0fE%v`Fz=#vnQOAb3A7c<@0XYDs$bEK+lNdW=f~5>1n%|vFe`8P{A2> zr|jHV(Jk1;@&eb_Ga(S(&z%XhjW~Jx;QZWiyLiN6VPyH-Nmkur?K$=* z!{r%=mFgUsbmua&Zqd!Vxy-32_>{~^H#24}%-L*+%K{nGc6mrOVrzF#P%BI_j?}By z%HhFU0p)0{Rzo?G+fbX1NndqeMyd9kz1W^w5F345|U(DN`g>#moi@1m64@{CQ*#AI!|eDSt=lhskeb2Uhy6^)ZjZSH7M+5; zI0SZ7t}U+p=3M3a;=g`%mWOZU#!HH5;qDPvvG`-UFOOwGJ0w4e1N6Ey) z_^OF7;cgT6OO%ypK$?Bh3`%p4G~dJ{0^6JKynE-J+?148vbKwEPh*27eu8rXW?yHm z&V$@qUuU(_YE-SY8da;!QLL}iuQvyx$HaGVHy=|^Kq*{ct2f2Fb=^|-K;NK&3ttog*U@!#}5ZuxnyfrYGLJJ5EHwSMI45mN>g0<%0 zoq@p=c0h2XIe2$qFb_mPu-+Wp85sO!e8mqQU{6CVvYzgJ3!!v#xN6omMe&})kUB#G2Z9&UH@%QLb3$H@ zs%xPz8`8$E-RezWf)>8g`)3#zp|xD;{S%DQzVs5J-jE=6u#YAi?*9u~Q{nfpNHMdKlqNZm_t1VB@syT|G?3z1ouqiyNa>Pf_#{1LG>{V6C`pNIEEScc zm`{qPVhyCWY%57^Su@otNv2OCY9J-EagvhRL@F*x37-^CC90(G74E-<-|y@1m6udq zYEr$02QbX4bzlt-@~)BB=il))&b9Db{2NAy!mR6C7$wqZui_w41UX#5AtD_`zDCA~ z4EzkU_&QM(KZlLOL@_L}FXKe5SZ1S-5SjP~uj_}1;`k?S!vs+R-(aRA=+KQ@Na#5F z0k-Kl#y>-RfE@}(|1ZeA`Qr4?vAhgIe1ayWAWIY4P#SfLwOVO37DSdt$oHyRCiDQ~ zqKv+j9M~5g^yITEIWR-<7|Gtt(EFFLIN=munS=KL8--x& zAjF4UtUeCOi4JI0LX{I&bO~fWr?lHiXopf_;8qG$^nh`(ND* zXTABcq*R47thxLiIC=x^$KJ-r+P5yDLyC((?b{UQ>F;RYu5eu99SZZnceJMzZj*SY q!byp5qgleP;J23g#5n5fAcSe}RLpo^PD$qDFe`pJoxp4fx&HtaSRn)e literal 0 HcmV?d00001 diff --git a/wechat/target/classes/mapper/invite/InviteMapper.xml b/wechat/target/classes/mapper/invite/InviteMapper.xml new file mode 100644 index 0000000..3aa9590 --- /dev/null +++ b/wechat/target/classes/mapper/invite/InviteMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/wechat/target/maven-archiver/pom.properties b/wechat/target/maven-archiver/pom.properties new file mode 100644 index 0000000..d685f20 --- /dev/null +++ b/wechat/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Tue Feb 23 23:21:58 CST 2021 +version=2.1-SNAPSHOT +groupId=io.geekidea.boot +artifactId=wechat diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..d3cf5e2 --- /dev/null +++ b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,23 @@ +com/koronol/wxpay/controller/WxPayController.class +com/koronol/wxpay/controller/AbstractWxPayApiController.class +com/koronol/invite/entity/Invite.class +com/koronol/wxpay/entity/WxPayBean.class +com/koronol/profile/controller/ProfileController.class +com/koronol/invite/service/InviteService.class +com/koronol/profile/service/impl/ProfileServiceImpl.class +com/koronol/profile/entity/Profile.class +com/koronol/invite/service/impl/InviteServiceImpl.class +com/koronol/profile/param/ProfilePageParam.class +com/koronol/invite/controller/InviteController.class +com/koronol/profile/vo/ProfileInfoVo.class +com/koronol/wxpay/vo/PaymentVo.class +com/koronol/profile/param/ProfileQueryParam.class +com/koronol/wxpay/param/WxPayNotifyParam.class +com/koronol/profile/param/PhoneLoginParam.class +com/koronol/wxpay/interceptor/WxPayInterceptor.class +com/koronol/wxpay/param/WxPayParam.class +com/koronol/profile/mapper/ProfileMapper.class +com/koronol/invite/param/InvitePageParam.class +com/koronol/profile/vo/ProfileTokenVo.class +com/koronol/invite/mapper/InviteMapper.class +com/koronol/profile/service/ProfileService.class diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..9fbee88 --- /dev/null +++ b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,23 @@ +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/interceptor/WxPayInterceptor.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/controller/InviteController.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/param/WxPayNotifyParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/entity/Invite.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/service/InviteService.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/vo/PaymentVo.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/vo/ProfileInfoVo.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/param/WxPayParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/controller/AbstractWxPayApiController.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/entity/Profile.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/PhoneLoginParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/ProfileService.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/entity/WxPayBean.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/param/InvitePageParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/mapper/InviteMapper.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java diff --git a/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/wechat/target/wechat-2.1-SNAPSHOT.jar b/wechat/target/wechat-2.1-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..4236a27dbe0539c639632cb47c6be39e2f3a43de GIT binary patch literal 52872 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 jU+j&B{}0v?Rw|D;sPY`HY literal 0 HcmV?d00001 -- Gitee From fcac12a78940f66a39543a56e9c1f7c3ec2dd015 Mon Sep 17 00:00:00 2001 From: limingguang Date: Thu, 25 Feb 2021 23:01:32 +0800 Subject: [PATCH 15/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=88=91=E7=9A=84?= =?UTF-8?q?=E6=94=B6=E8=97=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/config/application.yml | 2 +- .../favorite/controller/FavorController.java | 45 ++++++++++++++--- .../com/example/favorite/entity/Favor.java | 6 +-- .../example/favorite/mapper/FavorMapper.java | 7 +++ .../favorite/param/FavorPageParam.java | 4 ++ .../favorite/service/FavorService.java | 15 ++++++ .../service/impl/FavorServiceImpl.java | 46 +++++++++++++++++- .../com/example/history/entity/History.java | 6 +-- .../notes/controller/NotesController.java | 7 ++- .../java/com/example/notes/entity/Notes.java | 6 +-- .../com/example/notes/mapper/NotesMapper.java | 2 +- .../notes/service/impl/NotesServiceImpl.java | 2 +- .../java/com/example/notes/vo/WrongVo.java | 8 +-- .../service/impl/QuestionServiceImpl.java | 4 +- .../example/question/vo/QuestionPageVo.java | 6 +++ .../resources/mapper/favorite/FavorMapper.xml | 41 ++++++++++++++++ .../resources/mapper/notes/NotesMapper.xml | 18 ++++--- .../mapper/question/QuestionMapper.xml | 1 + wechat/target/maven-archiver/pom.properties | 5 -- .../compile/default-compile/createdFiles.lst | 23 --------- .../compile/default-compile/inputFiles.lst | 23 --------- .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 wechat/target/wechat-2.1-SNAPSHOT.jar | Bin 52872 -> 0 bytes 24 files changed, 187 insertions(+), 90 deletions(-) delete mode 100644 wechat/target/maven-archiver/pom.properties delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst delete mode 100644 wechat/target/wechat-2.1-SNAPSHOT.jar diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index 4e8f15d..722fff9 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -40,7 +40,7 @@ spring: --- spring: profiles: - active: prod + active: dev # active: @profileActive@ # logback.xml中有详细的日志配置 diff --git a/example/src/main/java/com/example/favorite/controller/FavorController.java b/example/src/main/java/com/example/favorite/controller/FavorController.java index d51c875..f243787 100644 --- a/example/src/main/java/com/example/favorite/controller/FavorController.java +++ b/example/src/main/java/com/example/favorite/controller/FavorController.java @@ -2,6 +2,10 @@ package com.example.favorite.controller; import com.example.favorite.entity.Favor; import com.example.favorite.service.FavorService; +import com.example.history.entity.History; +import com.example.notes.vo.WrongVo; +import com.example.question.param.QuestionPageParam; +import com.example.question.vo.QuestionPageVo; import io.geekidea.boot.framework.util.LoginUtil; import lombok.extern.slf4j.Slf4j; import com.example.favorite.param.FavorPageParam; @@ -15,12 +19,15 @@ import io.geekidea.boot.framework.log.enums.OperationLogType; import io.geekidea.boot.framework.core.validator.groups.Add; import io.geekidea.boot.framework.core.validator.groups.Update; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.validation.annotation.Validated; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 收藏记录 控制器 * @@ -43,7 +50,7 @@ public class FavorController extends BaseController { @PostMapping("/add") @OperationLog(name = "添加收藏记录", type = OperationLogType.ADD) @ApiOperation(value = "添加收藏记录", response = ApiResult.class) - @CacheEvict(value = "question", allEntries = true) + @CacheEvict(cacheNames = {"favorite", "question"}, allEntries = true) public ApiResult addFavor(@Validated(Add.class) @RequestBody Favor favor) throws Exception { boolean flag = favorService.saveFavor(favor); return ApiResult.result(flag); @@ -66,12 +73,24 @@ public class FavorController extends BaseController { @PostMapping("/delete/{questionId}") @OperationLog(name = "删除收藏记录", type = OperationLogType.DELETE) @ApiOperation(value = "删除收藏记录", response = ApiResult.class) - @CacheEvict(value = "question", allEntries = true) + @CacheEvict(cacheNames = {"favorite", "question"}, allEntries = true) public ApiResult deleteFavor(@PathVariable String questionId) throws Exception { boolean flag = favorService.deleteFavor(questionId); return ApiResult.result(flag); } + /** + * 删除收藏记录 + */ + @PostMapping("/remove/{id}") + @OperationLog(name = "根据id删除收藏记录", type = OperationLogType.DELETE) + @ApiOperation(value = "根据id删除收藏记录", response = ApiResult.class) + @CacheEvict(cacheNames = {"favorite", "question"}, allEntries = true) + public ApiResult removeFavor(@PathVariable String id) throws Exception { + boolean flag = favorService.removeById(id); + return ApiResult.result(flag); + } + /** * 获取收藏记录详情 */ @@ -84,13 +103,25 @@ public class FavorController extends BaseController { } /** - * 收藏记录分页列表 + * 收藏试题汇总列表 + */ + @GetMapping("/getFavoList") + @OperationLog(name = "收藏试题汇总列表", type = OperationLogType.LIST) + @ApiOperation(value = "收藏试题汇总列表", response = History.class) + public ApiResult> getFavoList() throws Exception { + List list = favorService.getFavoList(); + return ApiResult.ok(list); + } + + /** + * 收藏列表 */ @PostMapping("/getPageList") - @OperationLog(name = "收藏记录分页列表", type = OperationLogType.PAGE) - @ApiOperation(value = "收藏记录分页列表", response = Favor.class) - public ApiResult> getFavorPageList(@Validated @RequestBody FavorPageParam favorPageParam) throws Exception { - Paging paging = favorService.getFavorPageList(favorPageParam); + @OperationLog(name = "收藏列表", type = OperationLogType.PAGE) + @ApiOperation(value = "收藏列表", response = QuestionPageVo.class) + @Cacheable(value = "favorite", key = "#p0.toString()") + public ApiResult> getFavoQuestionList(@Validated @RequestBody QuestionPageParam questionPageParam) throws Exception { + Paging paging = favorService.getQuestionPageList(questionPageParam); return ApiResult.ok(paging); } diff --git a/example/src/main/java/com/example/favorite/entity/Favor.java b/example/src/main/java/com/example/favorite/entity/Favor.java index 85eec3b..8569526 100644 --- a/example/src/main/java/com/example/favorite/entity/Favor.java +++ b/example/src/main/java/com/example/favorite/entity/Favor.java @@ -38,9 +38,9 @@ public class Favor extends BaseEntity { @TableField("USER_ID") private Integer userId; - @ApiModelProperty("试卷编号") - @TableField("PAPER_ID") - private Integer paperId; + @ApiModelProperty("章节编号") + @TableField("CHAPTER_ID") + private Integer chapterId; @ApiModelProperty("试题编号") @TableField("QUESTION_ID") diff --git a/example/src/main/java/com/example/favorite/mapper/FavorMapper.java b/example/src/main/java/com/example/favorite/mapper/FavorMapper.java index e7c6eee..399bc62 100644 --- a/example/src/main/java/com/example/favorite/mapper/FavorMapper.java +++ b/example/src/main/java/com/example/favorite/mapper/FavorMapper.java @@ -1,15 +1,19 @@ package com.example.favorite.mapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.favorite.entity.Favor; import com.example.favorite.param.FavorPageParam; +import com.example.notes.vo.WrongVo; +import com.example.question.vo.QuestionPageVo; import org.springframework.stereotype.Repository; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import java.io.Serializable; +import java.util.List; /** * 收藏记录 Mapper 接口 @@ -21,4 +25,7 @@ import java.io.Serializable; public interface FavorMapper extends BaseMapper { + List selectFavoriteList(String appUserId); + + IPage getQuestionPageList(Page page, @Param("appUserId") String appUserId, @Param("chapterId") String chapterId); } diff --git a/example/src/main/java/com/example/favorite/param/FavorPageParam.java b/example/src/main/java/com/example/favorite/param/FavorPageParam.java index f85a220..ecc400d 100644 --- a/example/src/main/java/com/example/favorite/param/FavorPageParam.java +++ b/example/src/main/java/com/example/favorite/param/FavorPageParam.java @@ -1,6 +1,7 @@ package com.example.favorite.param; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -20,4 +21,7 @@ import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; @ApiModel(value = "收藏记录分页参数") public class FavorPageParam extends BasePageOrderParam { private static final long serialVersionUID = 1L; + + @ApiModelProperty("章节编号") + private Integer chapterId; } diff --git a/example/src/main/java/com/example/favorite/service/FavorService.java b/example/src/main/java/com/example/favorite/service/FavorService.java index cab3f77..d99df0b 100644 --- a/example/src/main/java/com/example/favorite/service/FavorService.java +++ b/example/src/main/java/com/example/favorite/service/FavorService.java @@ -2,9 +2,14 @@ package com.example.favorite.service; import com.example.favorite.entity.Favor; import com.example.favorite.param.FavorPageParam; +import com.example.notes.vo.WrongVo; +import com.example.question.param.QuestionPageParam; +import com.example.question.vo.QuestionPageVo; import io.geekidea.boot.framework.common.service.BaseService; import io.geekidea.boot.framework.core.pagination.Paging; +import java.util.List; + /** * 收藏记录 服务类 * @@ -50,4 +55,14 @@ public interface FavorService extends BaseService { */ Paging getFavorPageList(FavorPageParam favorPageParam) throws Exception; + List getFavoList() throws Exception; + + /** + * 获取分页对象 + * + * @param questionPageParam + * @return + * @throws Exception + */ + Paging getQuestionPageList(QuestionPageParam questionPageParam) throws Exception; } diff --git a/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java b/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java index 7022ca2..76afedf 100644 --- a/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java +++ b/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java @@ -6,6 +6,9 @@ import com.example.favorite.mapper.FavorMapper; import com.example.favorite.service.FavorService; import com.example.favorite.param.FavorPageParam; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.notes.vo.WrongVo; +import com.example.question.param.QuestionPageParam; +import com.example.question.vo.QuestionPageVo; import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; import io.geekidea.boot.framework.core.pagination.Paging; import io.geekidea.boot.framework.core.pagination.PageInfo; @@ -15,11 +18,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.geekidea.boot.framework.util.LoginUtil; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.transaction.annotation.Transactional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; +import java.util.concurrent.TimeUnit; + /** * 收藏记录 服务实现类 * @@ -33,10 +41,19 @@ public class FavorServiceImpl extends BaseServiceImpl implem @Autowired private FavorMapper favorMapper; + @Lazy + @Autowired + private RedisTemplate redisTemplate; + @Transactional(rollbackFor = Exception.class) @Override public boolean saveFavor(Favor favor) throws Exception { - favor.setUserId(Convert.toInt(LoginUtil.getAppUserId())); + String appUserId = LoginUtil.getAppUserId(); + String key = String.format("favoriteList-%s", appUserId); + + favor.setUserId(Convert.toInt(appUserId)); + // 清空缓存 + redisTemplate.delete(key); return super.save(favor); } @@ -50,8 +67,12 @@ public class FavorServiceImpl extends BaseServiceImpl implem @Transactional(rollbackFor = Exception.class) @Override public boolean deleteFavor(String questionId) throws Exception { + String appUserId = LoginUtil.getAppUserId(); + String key = String.format("favoriteList-%s", appUserId); + // 清空缓存 + redisTemplate.delete(key); return super.remove(new LambdaQueryWrapper() - .eq(Favor::getUserId, LoginUtil.getAppUserId()) + .eq(Favor::getUserId, appUserId) .eq(Favor::getQuestionId, questionId) ); } @@ -64,4 +85,25 @@ public class FavorServiceImpl extends BaseServiceImpl implem return new Paging(iPage); } + @Override + public List getFavoList() throws Exception { + String appUserId = LoginUtil.getAppUserId(); + String key = String.format("favoriteList-%s", appUserId); + List redisList = (List) redisTemplate.opsForValue().get(key); + if (redisList != null) { + return redisList; + } + List list = favorMapper.selectFavoriteList(appUserId); + redisTemplate.opsForValue().set(key, list, 3, TimeUnit.DAYS); + + return list; + } + + @Override + public Paging getQuestionPageList(QuestionPageParam questionPageParam) throws Exception { + Page page = new PageInfo<>(questionPageParam, OrderItem.asc(getLambdaColumn(Favor::getId))); + IPage iPage = favorMapper.getQuestionPageList(page, LoginUtil.getAppUserId(), questionPageParam.getChapterId()); + return new Paging<>(iPage); + } + } diff --git a/example/src/main/java/com/example/history/entity/History.java b/example/src/main/java/com/example/history/entity/History.java index 5284367..a1d49dd 100644 --- a/example/src/main/java/com/example/history/entity/History.java +++ b/example/src/main/java/com/example/history/entity/History.java @@ -37,9 +37,9 @@ public class History extends BaseEntity { @TableField("USER_ID") private Integer userId; - @ApiModelProperty("试卷编号") - @TableField("PAPER_ID") - private Integer paperId; + @ApiModelProperty("章节编号") + @TableField("CHAPTER_ID") + private Integer chapterId; @ApiModelProperty("试题编号") @TableField("QUESTION_ID") diff --git a/example/src/main/java/com/example/notes/controller/NotesController.java b/example/src/main/java/com/example/notes/controller/NotesController.java index 783e487..535bed6 100644 --- a/example/src/main/java/com/example/notes/controller/NotesController.java +++ b/example/src/main/java/com/example/notes/controller/NotesController.java @@ -2,7 +2,6 @@ package com.example.notes.controller; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.example.history.entity.History; import com.example.notes.entity.Notes; import com.example.notes.service.NotesService; import com.example.notes.vo.WrongVo; @@ -83,7 +82,7 @@ public class NotesController extends BaseController { String key = String.format("wrongPaperList-%s", appUserId); if (StrUtil.isNotBlank(id)) { - flag = notesService.removeById(id); + flag = notesService.remove(new LambdaQueryWrapper().eq(Notes::getUserId, appUserId).eq(Notes::getQuestionId, id)); } else { flag = notesService.remove(new LambdaQueryWrapper().eq(Notes::getUserId, appUserId)); } @@ -118,7 +117,7 @@ public class NotesController extends BaseController { */ @GetMapping("/getWrongList") @OperationLog(name = "错题试卷列表", type = OperationLogType.LIST) - @ApiOperation(value = "错题试卷列表", response = History.class) + @ApiOperation(value = "错题试卷列表", response = WrongVo.class) public ApiResult> getWrongList() throws Exception { List list = notesService.getHistoryWrongList(); return ApiResult.ok(list); @@ -129,7 +128,7 @@ public class NotesController extends BaseController { */ @PostMapping("/getWrongQuestionList") @OperationLog(name = "错题列表", type = OperationLogType.PAGE) - @ApiOperation(value = "错题列表", response = History.class) + @ApiOperation(value = "错题列表", response = QuestionPageVo.class) public ApiResult> getWrongQuestionList(@Validated @RequestBody QuestionPageParam questionPageParam) throws Exception { List list = notesService.getQuestionPageList(questionPageParam); return ApiResult.ok(list); diff --git a/example/src/main/java/com/example/notes/entity/Notes.java b/example/src/main/java/com/example/notes/entity/Notes.java index d9c9d49..f966801 100644 --- a/example/src/main/java/com/example/notes/entity/Notes.java +++ b/example/src/main/java/com/example/notes/entity/Notes.java @@ -37,9 +37,9 @@ public class Notes extends BaseEntity { @TableField("USER_ID") private Integer userId; - @ApiModelProperty("试卷编号") - @TableField("PAPER_ID") - private Integer paperId; + @ApiModelProperty("章节编号") + @TableField("CHAPTER_ID") + private Integer chapterId; @ApiModelProperty("试题编号") @TableField("QUESTION_ID") diff --git a/example/src/main/java/com/example/notes/mapper/NotesMapper.java b/example/src/main/java/com/example/notes/mapper/NotesMapper.java index d9cbda6..afd7819 100644 --- a/example/src/main/java/com/example/notes/mapper/NotesMapper.java +++ b/example/src/main/java/com/example/notes/mapper/NotesMapper.java @@ -23,5 +23,5 @@ public interface NotesMapper extends BaseMapper { List selectWrongPaperList(String appUserId); - List selectWrongQuestionPageList(@Param("appUserId") String appUserId, @Param("paperId") String paperId); + List selectWrongQuestionPageList(@Param("appUserId") String appUserId, @Param("chapterId") String chapterId); } diff --git a/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java b/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java index 116a757..b7c3b0b 100644 --- a/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java +++ b/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java @@ -70,7 +70,7 @@ public class NotesServiceImpl extends BaseServiceImpl implem @Override public List getQuestionPageList(QuestionPageParam questionPageParam) throws Exception { - List list = notesMapper.selectWrongQuestionPageList(LoginUtil.getAppUserId(), questionPageParam.getPaperId()); + List list = notesMapper.selectWrongQuestionPageList(LoginUtil.getAppUserId(), questionPageParam.getChapterId()); return list; } diff --git a/example/src/main/java/com/example/notes/vo/WrongVo.java b/example/src/main/java/com/example/notes/vo/WrongVo.java index 32ea5a5..201fb64 100644 --- a/example/src/main/java/com/example/notes/vo/WrongVo.java +++ b/example/src/main/java/com/example/notes/vo/WrongVo.java @@ -13,11 +13,11 @@ import java.io.Serializable; public class WrongVo implements Serializable { private static final long serialVersionUID = -5160036959137826314L; - @ApiModelProperty("试卷编号") - private Integer paperId; + @ApiModelProperty("章节编号") + private Integer id; - @ApiModelProperty("试卷名称") - private String paperName; + @ApiModelProperty("章节名称") + private String name; @ApiModelProperty("错题数") private Integer count; diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java index 03f893c..234c308 100644 --- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java +++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java @@ -116,7 +116,7 @@ public class QuestionServiceImpl extends BaseServiceImpl + + + diff --git a/example/src/main/resources/mapper/notes/NotesMapper.xml b/example/src/main/resources/mapper/notes/NotesMapper.xml index 11fc743..a8a1274 100644 --- a/example/src/main/resources/mapper/notes/NotesMapper.xml +++ b/example/src/main/resources/mapper/notes/NotesMapper.xml @@ -4,23 +4,25 @@ diff --git a/example/src/main/resources/mapper/question/QuestionMapper.xml b/example/src/main/resources/mapper/question/QuestionMapper.xml index f66de2d..8433dd3 100644 --- a/example/src/main/resources/mapper/question/QuestionMapper.xml +++ b/example/src/main/resources/mapper/question/QuestionMapper.xml @@ -17,6 +17,7 @@ t.OPTION_D_EN, t.SERIAL, t.PAPER_ID, + t.CHAPTER_ID, t.ANSWER, t.ANSWER_DETAIL, CASE diff --git a/wechat/target/maven-archiver/pom.properties b/wechat/target/maven-archiver/pom.properties deleted file mode 100644 index d685f20..0000000 --- a/wechat/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Tue Feb 23 23:21:58 CST 2021 -version=2.1-SNAPSHOT -groupId=io.geekidea.boot -artifactId=wechat diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index d3cf5e2..0000000 --- a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,23 +0,0 @@ -com/koronol/wxpay/controller/WxPayController.class -com/koronol/wxpay/controller/AbstractWxPayApiController.class -com/koronol/invite/entity/Invite.class -com/koronol/wxpay/entity/WxPayBean.class -com/koronol/profile/controller/ProfileController.class -com/koronol/invite/service/InviteService.class -com/koronol/profile/service/impl/ProfileServiceImpl.class -com/koronol/profile/entity/Profile.class -com/koronol/invite/service/impl/InviteServiceImpl.class -com/koronol/profile/param/ProfilePageParam.class -com/koronol/invite/controller/InviteController.class -com/koronol/profile/vo/ProfileInfoVo.class -com/koronol/wxpay/vo/PaymentVo.class -com/koronol/profile/param/ProfileQueryParam.class -com/koronol/wxpay/param/WxPayNotifyParam.class -com/koronol/profile/param/PhoneLoginParam.class -com/koronol/wxpay/interceptor/WxPayInterceptor.class -com/koronol/wxpay/param/WxPayParam.class -com/koronol/profile/mapper/ProfileMapper.class -com/koronol/invite/param/InvitePageParam.class -com/koronol/profile/vo/ProfileTokenVo.class -com/koronol/invite/mapper/InviteMapper.class -com/koronol/profile/service/ProfileService.class diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 9fbee88..0000000 --- a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,23 +0,0 @@ -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/interceptor/WxPayInterceptor.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/controller/InviteController.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/param/WxPayNotifyParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/entity/Invite.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/service/InviteService.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/vo/PaymentVo.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/vo/ProfileInfoVo.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/param/WxPayParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/controller/AbstractWxPayApiController.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/entity/Profile.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/PhoneLoginParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/ProfileService.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/entity/WxPayBean.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/param/InvitePageParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/mapper/InviteMapper.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java diff --git a/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/wechat/target/wechat-2.1-SNAPSHOT.jar b/wechat/target/wechat-2.1-SNAPSHOT.jar deleted file mode 100644 index 4236a27dbe0539c639632cb47c6be39e2f3a43de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52872 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 jU+j&B{}0v?Rw|D;sPY`HY -- Gitee From ec44bb4c9d69fcec7b1ae3c05685a9c6285b2882 Mon Sep 17 00:00:00 2001 From: limingguang Date: Sat, 27 Feb 2021 13:16:09 +0800 Subject: [PATCH 16/36] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E5=85=85=E5=80=BC=E4=BB=B7=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../examDate/controller/DateController.java | 100 ++++++++++++++++++ .../com/example/examDate/entity/ExamDate.java | 63 +++++++++++ .../example/examDate/mapper/DateMapper.java | 23 ++++ .../example/examDate/param/DatePageParam.java | 23 ++++ .../example/examDate/service/DateService.java | 58 ++++++++++ .../service/impl/DateServiceImpl.java | 88 +++++++++++++++ .../example/examDate/vo/ExamDateGoodVo.java | 32 ++++++ .../order/controller/OrderController.java | 12 +++ .../java/com/example/order/entity/Order.java | 15 ++- .../com/example/order/mapper/OrderMapper.java | 3 + .../example/order/param/OrderPageParam.java | 18 ++++ .../example/order/service/OrderService.java | 4 +- .../order/service/impl/OrderServiceImpl.java | 9 ++ .../com/example/order/vo/OrderPageVo.java | 51 +++++++++ .../service/impl/QuestionServiceImpl.java | 18 +++- .../resources/mapper/examDate/DateMapper.xml | 17 +++ .../mapper/order/ExampleOrderMapper.xml | 21 ---- .../resources/mapper/order/OrderMapper.xml | 20 +++- .../generator/SpringBootPlusGenerator.java | 10 +- .../profile/controller/ProfileController.java | 13 +-- .../controller/ProfileController.class | Bin 7736 -> 8242 bytes 21 files changed, 553 insertions(+), 45 deletions(-) create mode 100644 example/src/main/java/com/example/examDate/controller/DateController.java create mode 100644 example/src/main/java/com/example/examDate/entity/ExamDate.java create mode 100644 example/src/main/java/com/example/examDate/mapper/DateMapper.java create mode 100644 example/src/main/java/com/example/examDate/param/DatePageParam.java create mode 100644 example/src/main/java/com/example/examDate/service/DateService.java create mode 100644 example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java create mode 100644 example/src/main/java/com/example/examDate/vo/ExamDateGoodVo.java create mode 100644 example/src/main/java/com/example/order/vo/OrderPageVo.java create mode 100644 example/src/main/resources/mapper/examDate/DateMapper.xml delete mode 100644 example/src/main/resources/mapper/order/ExampleOrderMapper.xml diff --git a/example/src/main/java/com/example/examDate/controller/DateController.java b/example/src/main/java/com/example/examDate/controller/DateController.java new file mode 100644 index 0000000..81ba1e3 --- /dev/null +++ b/example/src/main/java/com/example/examDate/controller/DateController.java @@ -0,0 +1,100 @@ +package com.example.examDate.controller; + +import com.example.examDate.entity.ExamDate; +import com.example.examDate.service.DateService; +import com.example.examDate.vo.ExamDateGoodVo; +import lombok.extern.slf4j.Slf4j; +import com.example.examDate.param.DatePageParam; +import io.geekidea.boot.framework.common.controller.BaseController; +import io.geekidea.boot.framework.common.api.ApiResult; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.log.annotation.Module; +import io.geekidea.boot.framework.log.annotation.OperationLog; +import io.geekidea.boot.framework.log.enums.OperationLogType; +import io.geekidea.boot.framework.core.validator.groups.Add; +import io.geekidea.boot.framework.core.validator.groups.Update; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.validation.annotation.Validated; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 考试日期设置 控制器 + * + * @author limg + * @since 2021-02-27 + */ +@Slf4j +@RestController +@RequestMapping("/date") +@Module("examDate") +@Api(value = "考试日期设置API", tags = {"考试日期设置"}) +public class DateController extends BaseController { + + @Autowired + private DateService dateService; + + /** + * 添加考试日期设置 + */ + @PostMapping("/add") + @OperationLog(name = "添加考试日期设置", type = OperationLogType.ADD) + @ApiOperation(value = "添加考试日期设置", response = ApiResult.class) + @CacheEvict(value = "dateGood", allEntries = true) + public ApiResult addDate(@Validated(Add.class) @RequestBody ExamDate date) throws Exception { + boolean flag = dateService.saveDate(date); + return ApiResult.result(flag); + } + + /** + * 修改考试日期设置 + */ + @PostMapping("/update") + @OperationLog(name = "修改考试日期设置", type = OperationLogType.UPDATE) + @ApiOperation(value = "修改考试日期设置", response = ApiResult.class) + @CacheEvict(value = "dateGood", allEntries = true) + public ApiResult updateDate(@Validated(Update.class) @RequestBody ExamDate date) throws Exception { + boolean flag = dateService.updateDate(date); + return ApiResult.result(flag); + } + + /** + * 删除考试日期设置 + */ + @PostMapping("/delete/{id}") + @OperationLog(name = "删除考试日期设置", type = OperationLogType.DELETE) + @ApiOperation(value = "删除考试日期设置", response = ApiResult.class) + @CacheEvict(value = "dateGood", allEntries = true) + public ApiResult deleteDate(@PathVariable("id") Long id) throws Exception { + boolean flag = dateService.deleteDate(id); + return ApiResult.result(flag); + } + + /** + * 考试日期设置分页列表 + */ + @PostMapping("/getPageList") + @OperationLog(name = "考试日期设置分页列表", type = OperationLogType.PAGE) + @ApiOperation(value = "考试日期设置分页列表", response = ExamDate.class) + public ApiResult> getDatePageList(@Validated @RequestBody DatePageParam datePageParam) throws Exception { + Paging paging = dateService.getDatePageList(datePageParam); + return ApiResult.ok(paging); + } + + /** + * 考试日期商品信息 + */ + @GetMapping("/wechat/getExamDateInfo") + @OperationLog(name = "考试日期商品信息", type = OperationLogType.INFO) + @ApiOperation(value = "考试日期商品信息", response = ExamDateGoodVo.class) + @Cacheable(value = "dateGood", key = "#root.methodName") + public ApiResult getExamDateInfo() throws Exception { + ExamDateGoodVo examDateGoodVo = dateService.calcOrderAmount(); + return ApiResult.ok(examDateGoodVo); + } + +} + diff --git a/example/src/main/java/com/example/examDate/entity/ExamDate.java b/example/src/main/java/com/example/examDate/entity/ExamDate.java new file mode 100644 index 0000000..b56dd36 --- /dev/null +++ b/example/src/main/java/com/example/examDate/entity/ExamDate.java @@ -0,0 +1,63 @@ +package com.example.examDate.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.geekidea.boot.framework.common.entity.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import io.geekidea.boot.framework.core.validator.groups.Update; + +import java.time.LocalDate; +import java.util.Date; + +/** + * 考试日期设置 + * + * @author limg + * @since 2021-02-27 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@TableName("sys_date") +@ApiModel(value = "examDate对象") +public class ExamDate extends BaseEntity { + private static final long serialVersionUID = 1L; + + @NotNull(message = "id不能为空", groups = {Update.class}) + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("考试时间") + @TableField("EXAM_DATE") + private LocalDate examDate; + + @ApiModelProperty("备注") + @TableField("REMARK") + private String remark; + + @ApiModelProperty("乐观锁") + @TableField("REVISION") + private Integer revision; + + @ApiModelProperty("创建人") + @TableField(value = "CREATED_BY", fill = FieldFill.INSERT) + private String createdBy; + + @ApiModelProperty("创建时间") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("更新人") + @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE) + private String updatedBy; + + @ApiModelProperty("更新时间") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) + private Date updatedTime; + +} diff --git a/example/src/main/java/com/example/examDate/mapper/DateMapper.java b/example/src/main/java/com/example/examDate/mapper/DateMapper.java new file mode 100644 index 0000000..f1d2476 --- /dev/null +++ b/example/src/main/java/com/example/examDate/mapper/DateMapper.java @@ -0,0 +1,23 @@ +package com.example.examDate.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.examDate.entity.ExamDate; + +import org.springframework.stereotype.Repository; + +/** + * 考试日期设置 Mapper 接口 + * + * @author limg + * @since 2021-02-27 + */ +@Repository +public interface DateMapper extends BaseMapper { + + + /** + * 查询距离当天最早的一次考试 + * @return + */ + ExamDate selectEarliestOne(); +} diff --git a/example/src/main/java/com/example/examDate/param/DatePageParam.java b/example/src/main/java/com/example/examDate/param/DatePageParam.java new file mode 100644 index 0000000..e88c1cf --- /dev/null +++ b/example/src/main/java/com/example/examDate/param/DatePageParam.java @@ -0,0 +1,23 @@ +package com.example.examDate.param; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; + +/** + *
+ * 考试日期设置 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-02-27 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "考试日期设置分页参数") +public class DatePageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/examDate/service/DateService.java b/example/src/main/java/com/example/examDate/service/DateService.java new file mode 100644 index 0000000..00052f4 --- /dev/null +++ b/example/src/main/java/com/example/examDate/service/DateService.java @@ -0,0 +1,58 @@ +package com.example.examDate.service; + +import com.example.examDate.entity.ExamDate; +import com.example.examDate.param.DatePageParam; +import com.example.examDate.vo.ExamDateGoodVo; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +import java.math.BigDecimal; + +/** + * 考试日期设置 服务类 + * + * @author limg + * @since 2021-02-27 + */ +public interface DateService extends BaseService { + + /** + * 保存 + * + * @param date + * @return + * @throws Exception + */ + boolean saveDate(ExamDate date) throws Exception; + + /** + * 修改 + * + * @param date + * @return + * @throws Exception + */ + boolean updateDate(ExamDate date) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteDate(Long id) throws Exception; + + + /** + * 获取分页对象 + * + * @param datePageParam + * @return + * @throws Exception + */ + Paging getDatePageList(DatePageParam datePageParam) throws Exception; + + ExamDateGoodVo calcOrderAmount() throws Exception; + +} diff --git a/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java b/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java new file mode 100644 index 0000000..ce77082 --- /dev/null +++ b/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java @@ -0,0 +1,88 @@ +package com.example.examDate.service.impl; + +import cn.hutool.core.convert.Convert; +import com.example.examDate.entity.ExamDate; +import com.example.examDate.mapper.DateMapper; +import com.example.examDate.service.DateService; +import com.example.examDate.param.DatePageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.examDate.vo.ExamDateGoodVo; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.Period; + +/** + * 考试日期设置 服务实现类 + * + * @author limg + * @since 2021-02-27 + */ +@Slf4j +@Service +public class DateServiceImpl extends BaseServiceImpl implements DateService { + + @Autowired + private DateMapper dateMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean saveDate(ExamDate date) throws Exception { + return super.save(date); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateDate(ExamDate date) throws Exception { + return super.updateById(date); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deleteDate(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Paging getDatePageList(DatePageParam datePageParam) throws Exception { + Page page = new PageInfo<>(datePageParam, OrderItem.desc(getLambdaColumn(ExamDate::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = dateMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + + @Override + public ExamDateGoodVo calcOrderAmount() throws Exception { + BigDecimal total = new BigDecimal(90); // 总金额最高90元 + ExamDate examDate = dateMapper.selectEarliestOne(); + + // 如果没有查询到考试日期,则按照最低金额10元计算 + if (examDate == null) { + ExamDateGoodVo examDateGoodVo = new ExamDateGoodVo(); + examDateGoodVo.setExamDate(null); + examDateGoodVo.setAmount(new BigDecimal(10)); + examDateGoodVo.setPrice(new BigDecimal(0.11)); + return examDateGoodVo; + } + ExamDateGoodVo examDateGoodVo = Convert.convert(ExamDateGoodVo.class, examDate); + // 计算考试日期距离当天的天数差 + long days = examDate.getExamDate().toEpochDay() - LocalDate.now().toEpochDay(); + // 最少需要支付10 + long minDays = Math.max(90 - days, 10); + BigDecimal amount = new BigDecimal(minDays); + examDateGoodVo.setAmount(amount); + examDateGoodVo.setPrice(amount.divide(total,2, BigDecimal.ROUND_HALF_UP)); + return examDateGoodVo; + } + +} diff --git a/example/src/main/java/com/example/examDate/vo/ExamDateGoodVo.java b/example/src/main/java/com/example/examDate/vo/ExamDateGoodVo.java new file mode 100644 index 0000000..b302fc4 --- /dev/null +++ b/example/src/main/java/com/example/examDate/vo/ExamDateGoodVo.java @@ -0,0 +1,32 @@ +package com.example.examDate.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; + +@Data +@Accessors(chain = true) +@ApiModel(value = "ExamDateGoodVo对象", description = "小程序获取考试信息对象") +public class ExamDateGoodVo implements Serializable { + private static final long serialVersionUID = 8101678988453788458L; + + @ApiModelProperty("编号") + private Integer id; + + @ApiModelProperty("考试时间") + private LocalDate examDate; + + @ApiModelProperty("总金额") + private BigDecimal amount; + + @ApiModelProperty("平均每日价格") + private BigDecimal price; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/example/src/main/java/com/example/order/controller/OrderController.java b/example/src/main/java/com/example/order/controller/OrderController.java index 9036cb4..fc43dfc 100644 --- a/example/src/main/java/com/example/order/controller/OrderController.java +++ b/example/src/main/java/com/example/order/controller/OrderController.java @@ -8,6 +8,7 @@ import com.example.category.service.CategoryService; import com.example.order.entity.Order; import com.example.order.param.CategoryOrderParam; import com.example.order.service.OrderService; +import com.example.order.vo.OrderPageVo; import io.geekidea.boot.framework.common.exception.BusinessException; import io.geekidea.boot.framework.util.LoginUtil; import lombok.extern.slf4j.Slf4j; @@ -127,5 +128,16 @@ public class OrderController extends BaseController { return ApiResult.ok(paging); } + /** + * 订单表分页列表 + */ + @PostMapping("/getList") + @OperationLog(name = "用户订单列表", type = OperationLogType.PAGE) + @ApiOperation(value = "用户订单列表", response = Order.class) + public ApiResult> getWechatOrderPageList(@Validated @RequestBody OrderPageParam orderPageParam) throws Exception { + Paging paging = orderService.getOrderList(orderPageParam); + return ApiResult.ok(paging); + } + } diff --git a/example/src/main/java/com/example/order/entity/Order.java b/example/src/main/java/com/example/order/entity/Order.java index fe6bfa2..1ff8567 100644 --- a/example/src/main/java/com/example/order/entity/Order.java +++ b/example/src/main/java/com/example/order/entity/Order.java @@ -1,13 +1,12 @@ package com.example.order.entity; import java.math.BigDecimal; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.IdType; + +import com.baomidou.mybatisplus.annotation.*; + import java.util.Date; -import com.baomidou.mybatisplus.annotation.Version; -import com.baomidou.mybatisplus.annotation.TableId; + import io.geekidea.boot.framework.common.entity.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -85,15 +84,15 @@ public class Order extends BaseEntity { private String createdBy; @ApiModelProperty("创建时间") - @TableField("CREATED_TIME") + @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT) private Date createdTime; @ApiModelProperty("更新人") - @TableField("UPDATED_BY") + @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE) private String updatedBy; @ApiModelProperty("更新时间") - @TableField("UPDATED_TIME") + @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE) private Date updatedTime; } diff --git a/example/src/main/java/com/example/order/mapper/OrderMapper.java b/example/src/main/java/com/example/order/mapper/OrderMapper.java index 56ddd16..11a0b44 100644 --- a/example/src/main/java/com/example/order/mapper/OrderMapper.java +++ b/example/src/main/java/com/example/order/mapper/OrderMapper.java @@ -1,9 +1,11 @@ package com.example.order.mapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.order.entity.Order; import com.example.order.param.OrderPageParam; +import com.example.order.vo.OrderPageVo; import org.springframework.stereotype.Repository; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -21,4 +23,5 @@ import java.io.Serializable; public interface OrderMapper extends BaseMapper { + IPage selectUserOrder(Page page, @Param("userId") String userId); } diff --git a/example/src/main/java/com/example/order/param/OrderPageParam.java b/example/src/main/java/com/example/order/param/OrderPageParam.java index 4f5c1c3..5ef20e1 100644 --- a/example/src/main/java/com/example/order/param/OrderPageParam.java +++ b/example/src/main/java/com/example/order/param/OrderPageParam.java @@ -1,11 +1,14 @@ package com.example.order.param; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; +import java.time.LocalDate; + /** *
  * 订单表 分页参数对象
@@ -20,4 +23,19 @@ import io.geekidea.boot.framework.core.pagination.BasePageOrderParam;
 @ApiModel(value = "订单表分页参数")
 public class OrderPageParam extends BasePageOrderParam {
     private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("订单开始日期")
+    private LocalDate startDate;
+
+    @ApiModelProperty("订单开始日期")
+    private LocalDate endDate;
+
+    @ApiModelProperty("订单类型")
+    private Integer orderType;
+
+    @ApiModelProperty("订单状态")
+    private Integer status;
+
+    @ApiModelProperty("用户昵称")
+    private String nickName;
 }
diff --git a/example/src/main/java/com/example/order/service/OrderService.java b/example/src/main/java/com/example/order/service/OrderService.java
index d309192..53746d9 100644
--- a/example/src/main/java/com/example/order/service/OrderService.java
+++ b/example/src/main/java/com/example/order/service/OrderService.java
@@ -2,6 +2,7 @@ package com.example.order.service;
 
 import com.example.order.entity.Order;
 import com.example.order.param.OrderPageParam;
+import com.example.order.vo.OrderPageVo;
 import io.geekidea.boot.framework.common.service.BaseService;
 import io.geekidea.boot.framework.core.pagination.Paging;
 
@@ -44,10 +45,11 @@ public interface OrderService extends BaseService {
     /**
      * 获取分页对象
      *
-     * @param orderQueryParam
+     * @param orderPageParam
      * @return
      * @throws Exception
      */
     Paging getOrderPageList(OrderPageParam orderPageParam) throws Exception;
 
+    Paging getOrderList(OrderPageParam orderPageParam) throws Exception;
 }
diff --git a/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java b/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java
index 8278969..52c8ef5 100644
--- a/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java
+++ b/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java
@@ -5,12 +5,14 @@ import com.example.order.mapper.OrderMapper;
 import com.example.order.service.OrderService;
 import com.example.order.param.OrderPageParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.order.vo.OrderPageVo;
 import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl;
 import io.geekidea.boot.framework.core.pagination.Paging;
 import io.geekidea.boot.framework.core.pagination.PageInfo;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.geekidea.boot.framework.util.LoginUtil;
 import org.springframework.transaction.annotation.Transactional;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -55,4 +57,11 @@ public class OrderServiceImpl extends BaseServiceImpl implem
         return new Paging(iPage);
     }
 
+    @Override
+    public Paging getOrderList(OrderPageParam orderPageParam) throws Exception {
+        Page page = new PageInfo<>(orderPageParam, OrderItem.desc(getLambdaColumn(Order::getCreatedTime)));
+        IPage iPage = orderMapper.selectUserOrder(page, LoginUtil.getAppUserId());
+        return new Paging(iPage);
+    }
+
 }
diff --git a/example/src/main/java/com/example/order/vo/OrderPageVo.java b/example/src/main/java/com/example/order/vo/OrderPageVo.java
new file mode 100644
index 0000000..f3e33ab
--- /dev/null
+++ b/example/src/main/java/com/example/order/vo/OrderPageVo.java
@@ -0,0 +1,51 @@
+package com.example.order.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "OrderPageVo对象", description = "小程序订单列表对象")
+public class OrderPageVo implements Serializable {
+    private static final long serialVersionUID = -8270719309957728936L;
+
+    @ApiModelProperty("ID")
+    private Integer id;
+
+    @ApiModelProperty("订单号")
+    private String orderId;
+
+    @ApiModelProperty("用户编号")
+    private String userId;
+
+    @ApiModelProperty("金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty("专题编号")
+    private String code;
+
+    @ApiModelProperty("支付流水号")
+    private String tradeNo;
+
+    @ApiModelProperty("状态 1-新建,2-支付成功,3-已取消")
+    private String status;
+
+    @ApiModelProperty("订单创建时间")
+    private Date createdTime;
+
+    @ApiModelProperty("专题名称")
+    private String subject;
+
+    @ApiModelProperty("封面")
+    private String coverImg;
+
+    @ApiModelProperty("描述")
+    private String remark;
+}
diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
index 234c308..38afb6f 100644
--- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
+++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
@@ -6,6 +6,8 @@ import com.example.history.entity.History;
 import com.example.history.service.HistoryService;
 import com.example.notes.entity.Notes;
 import com.example.notes.service.NotesService;
+import com.example.order.entity.Order;
+import com.example.order.service.OrderService;
 import com.example.question.entity.Question;
 import com.example.question.mapper.QuestionMapper;
 import com.example.question.param.QuestionAnswerParam;
@@ -24,8 +26,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.geekidea.boot.framework.util.LoginUtil;
-import org.springframework.cache.annotation.CacheConfig;
-import org.springframework.cache.annotation.Cacheable;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.transaction.annotation.Transactional;
@@ -33,7 +33,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.util.concurrent.TimeUnit;
 
 /**
  * 题目信息 服务实现类
@@ -60,6 +59,10 @@ public class QuestionServiceImpl extends BaseServiceImpl(redisList);
 //        }
+        if (questionPageParam.getGroupId() != null) {
+            int count = orderService.count(new LambdaQueryWrapper()
+                    .eq(Order::getUserId, LoginUtil.getAppUserId())
+                    .eq(Order::getGroupId, questionPageParam.getGroupId())
+                    .eq(Order::getStatus, 2));
+            if (count < 1) {
+                throw new BusinessException(401, "您还未购买该专题");
+            }
+        }
         Page page = new PageInfo<>(questionPageParam, OrderItem.asc(getLambdaColumn(Question::getSerial)));
         IPage iPage = questionMapper.getQuestionPageList(page, questionPageParam, LoginUtil.getAppUserId());
 //        redisTemplate.opsForValue().set(key, iPage, 1, TimeUnit.DAYS);
diff --git a/example/src/main/resources/mapper/examDate/DateMapper.xml b/example/src/main/resources/mapper/examDate/DateMapper.xml
new file mode 100644
index 0000000..ddfce8b
--- /dev/null
+++ b/example/src/main/resources/mapper/examDate/DateMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+    
+
diff --git a/example/src/main/resources/mapper/order/ExampleOrderMapper.xml b/example/src/main/resources/mapper/order/ExampleOrderMapper.xml
deleted file mode 100644
index 4c73218..0000000
--- a/example/src/main/resources/mapper/order/ExampleOrderMapper.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
diff --git a/example/src/main/resources/mapper/order/OrderMapper.xml b/example/src/main/resources/mapper/order/OrderMapper.xml
index 048e4e7..232549a 100644
--- a/example/src/main/resources/mapper/order/OrderMapper.xml
+++ b/example/src/main/resources/mapper/order/OrderMapper.xml
@@ -1,5 +1,23 @@
 
 
 
-
+    
 
diff --git a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java
index 037900a..2aba9b7 100644
--- a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java
+++ b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java
@@ -45,16 +45,16 @@ public class SpringBootPlusGenerator {
 
         // 设置基本信息
         generatorProperties
-                .setMavenModuleName("wechat")
-                .setParentPackage("com.koronol")
-                .setModuleName("invite")
+                .setMavenModuleName("example")
+                .setParentPackage("com.example")
+                .setModuleName("examDate")
                 .setAuthor("limg")
                 .setFileOverride(true);
 
         // 设置表信息
-        generatorProperties.addTable("p_invite","id");
+        generatorProperties.addTable("sys_date","id");
         // 设置表前缀
-        generatorProperties.setTablePrefix(Arrays.asList("p_"));
+        generatorProperties.setTablePrefix(Arrays.asList("sys_"));
 
         // 数据源配置
         generatorProperties.getDataSourceConfig()
diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java
index a3d499c..266502f 100644
--- a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java
+++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java
@@ -2,7 +2,8 @@ package com.koronol.profile.controller;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.RandomUtil;
-import cn.hutool.http.HttpUtil;
+import com.example.examDate.service.DateService;
+import com.example.examDate.vo.ExamDateGoodVo;
 import com.example.order.entity.Order;
 import com.example.order.service.OrderService;
 import com.koronol.profile.entity.Profile;
@@ -22,7 +23,6 @@ import io.geekidea.boot.framework.log.annotation.OperationLog;
 import io.geekidea.boot.framework.log.enums.OperationLogType;
 import io.geekidea.boot.framework.core.validator.groups.Add;
 import io.geekidea.boot.framework.core.validator.groups.Update;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -30,10 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
-import java.nio.charset.Charset;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * 用户信息 控制器
@@ -54,6 +51,9 @@ public class ProfileController extends BaseController {
     @Autowired
     private OrderService orderService;
 
+    @Autowired
+    private DateService dateService;
+
     /**
      * 添加用户信息
      */
@@ -72,11 +72,12 @@ public class ProfileController extends BaseController {
         String format = DateUtil.format(new Date(),"yyyyMMddHHmmss");
         String numbers = RandomUtil.randomNumbers(5);
         String orderId = format+numbers;
+        ExamDateGoodVo examDateGoodVo = dateService.calcOrderAmount();
 
         Order order = new Order();
         order.setOrderId(orderId);
         order.setOrderType("2");
-        order.setAmount(new BigDecimal(0.01));
+        order.setAmount(examDateGoodVo != null ? examDateGoodVo.getAmount() : new BigDecimal(10));
         order.setUserId(LoginUtil.getAppUserId());
         order.setRemark("会员充值");
 
diff --git a/wechat/target/classes/com/koronol/profile/controller/ProfileController.class b/wechat/target/classes/com/koronol/profile/controller/ProfileController.class
index 55bfffcb21eeb8fdcc3bf441b44c43f997a2aec9..ada3701657556e8793ecd329d99bb1ecfa89914d 100644
GIT binary patch
delta 2704
zcmb`Id3+N^6vuzFO}g!7plJ)e1cVO)X#vBH6bj`M3Pmc#B7(<~#k`v5$FVA@i}3sLdF`veumTPxldf^T-S=|S?*KkTP@GxKKV&G%hN!>Aqk+P-7E
zb^{o~5*6fNYa;sKej6UZg9;wP!!jOGV8zx1Y*VluI}`-5Q^unT6l@hDBt*Tq)nG#-
zcFAZ`U>AFKJeGjR#kgC+6L?a_Qwq}Xw9q`GU=N-Zv#EO%P%b9V2^-Jb@B;RU<%{C^
zmjuYmLcAixej#2J;x!>&m+^*zH}RIZ`L>LAHtcC0Xe(9y?qYX!ZH3FtkW=XLd7bVh
zs<+DH*2f97?W{5OonjH(!Ui+;Zt#Gl#N~DrM}>Bh&sSRFV{k+_Q0sF}Y;$sC;IOrS
z*AB&g)wN)nS~XLh=W!FBjQ3=`Pcb3qgGup66ElWl7)O7cD&qr=12`z-LynK|aiFLD
zl;lGkXX6tYpK=_=XAJ3qywvn8j?eK0$CvnuV=#uu_?qJze9O=+aKze8{6eXAB
z+4aXgYGs+T*k4^yS;o*iYAQ~MBqc3Sr*sN7CGTdMBkG;j>5HT~$)$Q+)2mC})nmQB
zMU{TC(2Z$01Jh|eNvw-pI1@AIW@zZk8L^lbf3*lt_
zNcU~@U>rnfhM@z=$s`Mq0&NO<5&i)3W(4_@PaaK15lYD$FZr{G`0L1n)kH4>KiVJ<
z$FT!0p~js}-lbp}&Y_t^*2*!5W^rWmT+F49g>KHoc{rb9eF53XgLItC#mi7-X!B$k
z|1OzcWh9OxA-vgkPog~;?h`U~VU$djnVBj#GF4$_s@%vFqvkd$CO4~f#i&#f^Zv(*
zSzvN_+HrVVRZQ2m72^$8OeK7JO&`fh)AG7Bz#?)e={YpY+e5J47_e1XNNI^(-qlfp
zR%62Y4cJ9y(EM5pEf>vMOCKuxDjF6Wl!P{e;Pft|5|sKjqNjvu{TiT`UTf^dgtg>f
zv6tW?vKQ{kxskS98sT0h81%MWZgQ_MxGy%jR|xDedRw-~)~Iyp3xlvr0}H#PX{{Q>
z2<}RvTor?|4lC(#5!_X{lqfGFGd!ZXyoEc0y*h&3@@;a3iMt!e?W5f*Mzq%w=lU3atfL*n5AAAP69s!i6zpqF?0^yN>rCp6F{wA<`WV!`
z!_->)+TKXmn_^(!fE&Zu(W!5WP~S}Fj2gMcq`tKs^=&%!a=l2}1Umt@M}CrekR9=t
zn9`>Kjv%td&l1yH(fC=)rr_N{Ith1%AGhExTDJh)je7)44Sj{)OUGz(A2#ddyX7C{
C2Gha-

delta 2183
zcmbW2dsI|a6oev8Mnw34U(lRr9Yws6j^>?d%?wtvoHM3f)S!>SOXWxC!`Oa_ebMNMo_F{k6
z-&?ljb1jzja{|);DilnOH5MPti1t~Exf3$U_7-Z)EmE~
z5nk5KHr;I3%`3Xup_^B|yk_z`JN3*ryu7)tt2^+gG0ZUD3Ji3cZmS_K-&L7sRk%k5
z4#n+E$S7o#qJR-z-d1$6%gZ~8cX`j+o;)OJx1y3gUfx%Hz+UTca#rGp>{EQieuHdl
zZd`VX;$sdN7=?;Yw2@}j^-HTz6!NL!Gd}n7h2l&0E571@;-GGh=L9c@6kqd=;#-s#rs}wIiiS@tfjz4l9O}ZyCO-faTk3SbNf@xjlKM
zf%1O&?s2)2DR9$Y$B5<9XTxBm*m2SyXZr*o!e`1@q>#4A+MSU;^u$m+5_yu?N}eF;
zKABUbH#n8iGAgoE=3u{$HDxC#A(1oe_(8$|$)R{{okp?DOO#n-I9;O0%5#r+N@RxS
zJkw?@ka^?8TRI)1nem(@PbM@ok+Me4<{ZwIaj71cH!z9GGBb6UA-*Z0ISo`WRlEk%
zI8W9u68kUNvyb#G*1pUfe#Oh0vR9%%E!N*Lh#d66~6`U`YTNa#14HwAKA_bftMZgQg
z0@gYL&cGj1u+~w~kgBsYDdbaSBRgwyQdfQlgItWsYRA)aLMO|0lEwP}o8`(Vlyzas
z`Y>e(vc6ZEkIeGLp)5CuM7jqNnO1jJy5FXB+Xe1Wt`N$VF(_Mv-w}5aR}1B0
zSw_D)wA_nW5`}wd6uGYnV=tr3ukXD-%)P9KJJBf!UAFqVFK0yvJF<+2#87*+P_2z|
zj+I;+qV})ix+vJ!N5Q@!jD4e{_Dx~x)iJ5paB~dmoDj7?^7gG4>^ov$ujQ5yc691n
z|E0c7;+z^;7pA^Fg4(jFm)b>ggxK+{cfJ%N{9su}{}Oz;?F
Date: Sat, 27 Feb 2021 16:28:08 +0800
Subject: [PATCH 17/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=A2=E5=8D=95?=
 =?UTF-8?q?=E7=AE=A1=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../order/controller/OrderController.java     |  5 +-
 .../com/example/order/mapper/OrderMapper.java |  3 ++
 .../example/order/service/OrderService.java   |  3 +-
 .../order/service/impl/OrderServiceImpl.java  | 10 ++--
 .../java/com/example/order/vo/OrderVo.java    | 50 +++++++++++++++++++
 .../resources/mapper/order/OrderMapper.xml    | 34 +++++++++++++
 6 files changed, 97 insertions(+), 8 deletions(-)
 create mode 100644 example/src/main/java/com/example/order/vo/OrderVo.java

diff --git a/example/src/main/java/com/example/order/controller/OrderController.java b/example/src/main/java/com/example/order/controller/OrderController.java
index fc43dfc..bf2f8be 100644
--- a/example/src/main/java/com/example/order/controller/OrderController.java
+++ b/example/src/main/java/com/example/order/controller/OrderController.java
@@ -9,6 +9,7 @@ import com.example.order.entity.Order;
 import com.example.order.param.CategoryOrderParam;
 import com.example.order.service.OrderService;
 import com.example.order.vo.OrderPageVo;
+import com.example.order.vo.OrderVo;
 import io.geekidea.boot.framework.common.exception.BusinessException;
 import io.geekidea.boot.framework.util.LoginUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -123,8 +124,8 @@ public class OrderController extends BaseController {
     @PostMapping("/getPageList")
     @OperationLog(name = "订单表分页列表", type = OperationLogType.PAGE)
     @ApiOperation(value = "订单表分页列表", response = Order.class)
-    public ApiResult> getOrderPageList(@Validated @RequestBody OrderPageParam orderPageParam) throws Exception {
-        Paging paging = orderService.getOrderPageList(orderPageParam);
+    public ApiResult> getOrderPageList(@Validated @RequestBody OrderPageParam orderPageParam) throws Exception {
+        Paging paging = orderService.getOrderPageList(orderPageParam);
         return ApiResult.ok(paging);
     }
 
diff --git a/example/src/main/java/com/example/order/mapper/OrderMapper.java b/example/src/main/java/com/example/order/mapper/OrderMapper.java
index 11a0b44..48b13fa 100644
--- a/example/src/main/java/com/example/order/mapper/OrderMapper.java
+++ b/example/src/main/java/com/example/order/mapper/OrderMapper.java
@@ -6,6 +6,7 @@ import com.example.order.entity.Order;
 import com.example.order.param.OrderPageParam;
 
 import com.example.order.vo.OrderPageVo;
+import com.example.order.vo.OrderVo;
 import org.springframework.stereotype.Repository;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -24,4 +25,6 @@ public interface OrderMapper extends BaseMapper {
 
 
     IPage selectUserOrder(Page page, @Param("userId") String userId);
+
+    IPage selectOrderPage(Page page, @Param("param") OrderPageParam orderPageParam);
 }
diff --git a/example/src/main/java/com/example/order/service/OrderService.java b/example/src/main/java/com/example/order/service/OrderService.java
index 53746d9..4a38631 100644
--- a/example/src/main/java/com/example/order/service/OrderService.java
+++ b/example/src/main/java/com/example/order/service/OrderService.java
@@ -3,6 +3,7 @@ package com.example.order.service;
 import com.example.order.entity.Order;
 import com.example.order.param.OrderPageParam;
 import com.example.order.vo.OrderPageVo;
+import com.example.order.vo.OrderVo;
 import io.geekidea.boot.framework.common.service.BaseService;
 import io.geekidea.boot.framework.core.pagination.Paging;
 
@@ -49,7 +50,7 @@ public interface OrderService extends BaseService {
      * @return
      * @throws Exception
      */
-    Paging getOrderPageList(OrderPageParam orderPageParam) throws Exception;
+    Paging getOrderPageList(OrderPageParam orderPageParam) throws Exception;
 
     Paging getOrderList(OrderPageParam orderPageParam) throws Exception;
 }
diff --git a/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java b/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java
index 52c8ef5..823619c 100644
--- a/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java
+++ b/example/src/main/java/com/example/order/service/impl/OrderServiceImpl.java
@@ -6,6 +6,7 @@ import com.example.order.service.OrderService;
 import com.example.order.param.OrderPageParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.example.order.vo.OrderPageVo;
+import com.example.order.vo.OrderVo;
 import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl;
 import io.geekidea.boot.framework.core.pagination.Paging;
 import io.geekidea.boot.framework.core.pagination.PageInfo;
@@ -50,11 +51,10 @@ public class OrderServiceImpl extends BaseServiceImpl implem
     }
 
     @Override
-    public Paging getOrderPageList(OrderPageParam orderPageParam) throws Exception {
-        Page page = new PageInfo<>(orderPageParam, OrderItem.desc(getLambdaColumn(Order::getCreatedTime)));
-        LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
-        IPage iPage = orderMapper.selectPage(page, wrapper);
-        return new Paging(iPage);
+    public Paging getOrderPageList(OrderPageParam orderPageParam) throws Exception {
+        Page page = new PageInfo<>(orderPageParam, OrderItem.desc(getLambdaColumn(Order::getCreatedTime)));
+        IPage iPage = orderMapper.selectOrderPage(page, orderPageParam);
+        return new Paging(iPage);
     }
 
     @Override
diff --git a/example/src/main/java/com/example/order/vo/OrderVo.java b/example/src/main/java/com/example/order/vo/OrderVo.java
new file mode 100644
index 0000000..4cc61d9
--- /dev/null
+++ b/example/src/main/java/com/example/order/vo/OrderVo.java
@@ -0,0 +1,50 @@
+package com.example.order.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "OrderVo对象", description = "订单列表对象")
+public class OrderVo implements Serializable {
+    private static final long serialVersionUID = -7797671947919534428L;
+
+    @ApiModelProperty("ID")
+    private Integer id;
+
+    @ApiModelProperty("订单号")
+    private String orderId;
+
+    @ApiModelProperty("用户编号")
+    private String userId;
+
+    @ApiModelProperty("用户昵称")
+    private String nickName;
+
+    @ApiModelProperty("用户头像")
+    private String avatarUrl;
+
+    @ApiModelProperty("金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty("支付流水号")
+    private String tradeNo;
+
+    @ApiModelProperty("订单类型")
+    private String orderType;
+
+    @ApiModelProperty("状态 1-新建,2-支付成功,3-已取消")
+    private String status;
+
+    @ApiModelProperty("订单创建时间")
+    private Date createdTime;
+
+    @ApiModelProperty("订单备注")
+    private String remark;
+}
diff --git a/example/src/main/resources/mapper/order/OrderMapper.xml b/example/src/main/resources/mapper/order/OrderMapper.xml
index 232549a..c4c3630 100644
--- a/example/src/main/resources/mapper/order/OrderMapper.xml
+++ b/example/src/main/resources/mapper/order/OrderMapper.xml
@@ -20,4 +20,38 @@
         WHERE
             t.USER_ID = #{userId}
     
+    
 
-- 
Gitee


From 329ae8fb7602b2eb232b2625688a7f214ac98e66 Mon Sep 17 00:00:00 2001
From: limingguang 
Date: Sat, 27 Feb 2021 21:18:56 +0800
Subject: [PATCH 18/36] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=86=E7=B1=BB?=
 =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../controller/QuestionController.java        | 14 ++++++++
 .../question/mapper/QuestionMapper.java       |  3 ++
 .../question/param/QuestionCategoryParam.java | 35 +++++++++++++++++++
 .../question/service/QuestionService.java     |  4 +++
 .../service/impl/QuestionServiceImpl.java     |  9 +++++
 .../question/vo/QuestionCategoryPageVo.java   | 21 +++++++++++
 .../mapper/question/QuestionMapper.xml        | 10 ++++++
 7 files changed, 96 insertions(+)
 create mode 100644 example/src/main/java/com/example/question/param/QuestionCategoryParam.java
 create mode 100644 example/src/main/java/com/example/question/vo/QuestionCategoryPageVo.java

diff --git a/example/src/main/java/com/example/question/controller/QuestionController.java b/example/src/main/java/com/example/question/controller/QuestionController.java
index d5f37d4..ac49a0c 100644
--- a/example/src/main/java/com/example/question/controller/QuestionController.java
+++ b/example/src/main/java/com/example/question/controller/QuestionController.java
@@ -2,8 +2,10 @@ package com.example.question.controller;
 
 import com.example.question.entity.Question;
 import com.example.question.param.QuestionAnswerParam;
+import com.example.question.param.QuestionCategoryParam;
 import com.example.question.param.QuestionParam;
 import com.example.question.service.QuestionService;
+import com.example.question.vo.QuestionCategoryPageVo;
 import com.example.question.vo.QuestionPageVo;
 import io.geekidea.boot.framework.common.api.ApiResult;
 import io.geekidea.boot.framework.common.controller.BaseController;
@@ -107,6 +109,18 @@ public class QuestionController extends BaseController {
         return ApiResult.ok(paging);
     }
 
+    /**
+     * 专题详情页题目分页列表-小程序端
+     */
+    @PostMapping("/wechat/getPageList")
+    @OperationLog(name = "题目信息分页列表", type = OperationLogType.PAGE)
+    @ApiOperation(value = "题目信息分页列表", response = Question.class)
+    @Cacheable(cacheNames = "question", key = "#p0.toString()")
+    public ApiResult> getCategoryQuestionPageList(@Validated @RequestBody QuestionCategoryParam questionCategoryParam) throws Exception {
+        Paging paging = questionService.getCategoryQuestionPageList(questionCategoryParam);
+        return ApiResult.ok(paging);
+    }
+
     /**
      * 题目分页列表-PC端
      */
diff --git a/example/src/main/java/com/example/question/mapper/QuestionMapper.java b/example/src/main/java/com/example/question/mapper/QuestionMapper.java
index 61bf37c..6029249 100644
--- a/example/src/main/java/com/example/question/mapper/QuestionMapper.java
+++ b/example/src/main/java/com/example/question/mapper/QuestionMapper.java
@@ -6,6 +6,7 @@ import com.example.paper.vo.PaperQueryVo;
 import com.example.question.entity.Question;
 import com.example.question.param.QuestionPageParam;
 
+import com.example.question.vo.QuestionCategoryPageVo;
 import com.example.question.vo.QuestionPageVo;
 import org.springframework.stereotype.Repository;
 
@@ -31,4 +32,6 @@ public interface QuestionMapper extends BaseMapper {
      * @return
      */
     IPage getQuestionPageList(@Param("page") Page page, @Param("param") QuestionPageParam paperPageParam, @Param("userId") String userId);
+
+    IPage getQuestionCategoryPageList(@Param("page") Page page, @Param("groupId") String groupId);
 }
diff --git a/example/src/main/java/com/example/question/param/QuestionCategoryParam.java b/example/src/main/java/com/example/question/param/QuestionCategoryParam.java
new file mode 100644
index 0000000..ed71170
--- /dev/null
+++ b/example/src/main/java/com/example/question/param/QuestionCategoryParam.java
@@ -0,0 +1,35 @@
+package com.example.question.param;
+
+import cn.hutool.core.text.StrFormatter;
+import io.geekidea.boot.framework.core.pagination.BasePageOrderParam;
+import io.geekidea.boot.framework.util.LoginUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "题目信息分页参数")
+public class QuestionCategoryParam extends BasePageOrderParam {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("所属专题id")
+    @NotNull(message = "专题编号不能为空")
+    private String groupId;
+
+    @Override
+    public String toString() {
+        String key = StrFormatter.format("{}-{}-{}",
+                this.getGroupId() == null ? "" : this.getGroupId(),
+                this.getPageIndex() == null ? "1" : this.getPageIndex(),
+                this.getPageSize() == null ? "10" : this.getPageSize());
+        return key;
+    }
+
+}
diff --git a/example/src/main/java/com/example/question/service/QuestionService.java b/example/src/main/java/com/example/question/service/QuestionService.java
index 1698b43..74294c3 100644
--- a/example/src/main/java/com/example/question/service/QuestionService.java
+++ b/example/src/main/java/com/example/question/service/QuestionService.java
@@ -2,8 +2,10 @@ package com.example.question.service;
 
 import com.example.question.entity.Question;
 import com.example.question.param.QuestionAnswerParam;
+import com.example.question.param.QuestionCategoryParam;
 import com.example.question.param.QuestionPageParam;
 import com.example.question.param.QuestionParam;
+import com.example.question.vo.QuestionCategoryPageVo;
 import com.example.question.vo.QuestionPageVo;
 import io.geekidea.boot.framework.common.service.BaseService;
 import io.geekidea.boot.framework.core.pagination.Paging;
@@ -58,4 +60,6 @@ public interface QuestionService extends BaseService {
     Boolean sumitAnswer(QuestionAnswerParam questionAnswerParam) throws Exception;
 
     Paging getPageList(QuestionParam questionParam);
+
+    Paging getCategoryQuestionPageList(QuestionCategoryParam questionCategoryParam) throws Exception;
 }
diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
index 38afb6f..c166516 100644
--- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
+++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
@@ -11,10 +11,12 @@ import com.example.order.service.OrderService;
 import com.example.question.entity.Question;
 import com.example.question.mapper.QuestionMapper;
 import com.example.question.param.QuestionAnswerParam;
+import com.example.question.param.QuestionCategoryParam;
 import com.example.question.param.QuestionParam;
 import com.example.question.service.QuestionService;
 import com.example.question.param.QuestionPageParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.question.vo.QuestionCategoryPageVo;
 import com.example.question.vo.QuestionPageVo;
 import com.example.userPaper.entity.UserPaper;
 import com.example.userPaper.service.UserPaperService;
@@ -118,6 +120,13 @@ public class QuestionServiceImpl extends BaseServiceImpl(iPage);
     }
 
+    @Override
+    public Paging getCategoryQuestionPageList(QuestionCategoryParam questionCategoryParam) throws Exception {
+        Page page = new PageInfo<>(questionCategoryParam, OrderItem.asc(getLambdaColumn(Question::getSerial)));
+        IPage iPage = questionMapper.getQuestionCategoryPageList(page, questionCategoryParam.getGroupId());
+        return new Paging(iPage);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean sumitAnswer(QuestionAnswerParam questionAnswerParam) throws Exception {
diff --git a/example/src/main/java/com/example/question/vo/QuestionCategoryPageVo.java b/example/src/main/java/com/example/question/vo/QuestionCategoryPageVo.java
new file mode 100644
index 0000000..9dc3ae2
--- /dev/null
+++ b/example/src/main/java/com/example/question/vo/QuestionCategoryPageVo.java
@@ -0,0 +1,21 @@
+package com.example.question.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "QuestionPageVo对象", description = "小程序试题列表对象")
+public class QuestionCategoryPageVo implements Serializable {
+    private static final long serialVersionUID = 2035660340076641198L;
+
+    @ApiModelProperty("编号")
+    private Integer id;
+
+    @ApiModelProperty("标题")
+    private String subject;
+}
diff --git a/example/src/main/resources/mapper/question/QuestionMapper.xml b/example/src/main/resources/mapper/question/QuestionMapper.xml
index 8433dd3..4801ea5 100644
--- a/example/src/main/resources/mapper/question/QuestionMapper.xml
+++ b/example/src/main/resources/mapper/question/QuestionMapper.xml
@@ -46,4 +46,14 @@
                 and t.ID = 1
             
     
+
+    
 
-- 
Gitee


From ccba6f713012d021f7c127c046e57d1a9556b9a2 Mon Sep 17 00:00:00 2001
From: limingguang 
Date: Wed, 3 Mar 2021 20:11:55 +0800
Subject: [PATCH 19/36] =?UTF-8?q?=E6=9A=82=E6=97=B6=E5=8F=96=E6=B6=88?=
 =?UTF-8?q?=E4=B8=93=E9=A2=98=E8=B4=AD=E4=B9=B0=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../chapter/service/ChapterService.java       |  2 +-
 .../examDate/controller/DateController.java   |  8 +++---
 .../service/impl/QuestionServiceImpl.java     | 28 ++++++-------------
 3 files changed, 14 insertions(+), 24 deletions(-)

diff --git a/example/src/main/java/com/example/chapter/service/ChapterService.java b/example/src/main/java/com/example/chapter/service/ChapterService.java
index 9e4e8d0..8ccfb31 100644
--- a/example/src/main/java/com/example/chapter/service/ChapterService.java
+++ b/example/src/main/java/com/example/chapter/service/ChapterService.java
@@ -44,7 +44,7 @@ public interface ChapterService extends BaseService {
     /**
      * 获取分页对象
      *
-     * @param chapterQueryParam
+     * @param chapterPageParam
      * @return
      * @throws Exception
      */
diff --git a/example/src/main/java/com/example/examDate/controller/DateController.java b/example/src/main/java/com/example/examDate/controller/DateController.java
index 81ba1e3..2240400 100644
--- a/example/src/main/java/com/example/examDate/controller/DateController.java
+++ b/example/src/main/java/com/example/examDate/controller/DateController.java
@@ -43,7 +43,7 @@ public class DateController extends BaseController {
     @PostMapping("/add")
     @OperationLog(name = "添加考试日期设置", type = OperationLogType.ADD)
     @ApiOperation(value = "添加考试日期设置", response = ApiResult.class)
-    @CacheEvict(value = "dateGood", allEntries = true)
+    @CacheEvict(value = "userRank", allEntries = true)
     public ApiResult addDate(@Validated(Add.class) @RequestBody ExamDate date) throws Exception {
         boolean flag = dateService.saveDate(date);
         return ApiResult.result(flag);
@@ -55,7 +55,7 @@ public class DateController extends BaseController {
     @PostMapping("/update")
     @OperationLog(name = "修改考试日期设置", type = OperationLogType.UPDATE)
     @ApiOperation(value = "修改考试日期设置", response = ApiResult.class)
-    @CacheEvict(value = "dateGood", allEntries = true)
+    @CacheEvict(value = "userRank", allEntries = true)
     public ApiResult updateDate(@Validated(Update.class) @RequestBody ExamDate date) throws Exception {
         boolean flag = dateService.updateDate(date);
         return ApiResult.result(flag);
@@ -67,7 +67,7 @@ public class DateController extends BaseController {
     @PostMapping("/delete/{id}")
     @OperationLog(name = "删除考试日期设置", type = OperationLogType.DELETE)
     @ApiOperation(value = "删除考试日期设置", response = ApiResult.class)
-    @CacheEvict(value = "dateGood", allEntries = true)
+    @CacheEvict(value = "userRank", allEntries = true)
     public ApiResult deleteDate(@PathVariable("id") Long id) throws Exception {
         boolean flag = dateService.deleteDate(id);
         return ApiResult.result(flag);
@@ -90,7 +90,7 @@ public class DateController extends BaseController {
     @GetMapping("/wechat/getExamDateInfo")
     @OperationLog(name = "考试日期商品信息", type = OperationLogType.INFO)
     @ApiOperation(value = "考试日期商品信息", response = ExamDateGoodVo.class)
-    @Cacheable(value = "dateGood", key = "#root.methodName")
+    @Cacheable(value = "userRank", key = "#root.methodName")
     public ApiResult getExamDateInfo() throws Exception {
         ExamDateGoodVo examDateGoodVo = dateService.calcOrderAmount();
         return ApiResult.ok(examDateGoodVo);
diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
index c166516..07a353d 100644
--- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
+++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java
@@ -95,28 +95,18 @@ public class QuestionServiceImpl extends BaseServiceImpl getQuestionPageList(QuestionPageParam questionPageParam) throws Exception {
-//        String key = String.format("questionList-%s-%s-%s-%s-%d-%d", LoginUtil.getAppUserId(),
-//                questionPageParam.getPaperId(),
-//                questionPageParam.getGroupId(),
-//                questionPageParam.getChapterId(),
-//                questionPageParam.getPageIndex(),
-//                questionPageParam.getPageSize());
-//        IPage redisList = (IPage) redisTemplate.opsForValue().get(key);
-//        if (redisList != null) {
-//            return new Paging(redisList);
+        // 暂时取消是否购买的判断
+//        if (questionPageParam.getGroupId() != null) {
+//            int count = orderService.count(new LambdaQueryWrapper()
+//                    .eq(Order::getUserId, LoginUtil.getAppUserId())
+//                    .eq(Order::getGroupId, questionPageParam.getGroupId())
+//                    .eq(Order::getStatus, 2));
+//            if (count < 1) {
+//                throw new BusinessException(401, "您还未购买该专题");
+//            }
 //        }
-        if (questionPageParam.getGroupId() != null) {
-            int count = orderService.count(new LambdaQueryWrapper()
-                    .eq(Order::getUserId, LoginUtil.getAppUserId())
-                    .eq(Order::getGroupId, questionPageParam.getGroupId())
-                    .eq(Order::getStatus, 2));
-            if (count < 1) {
-                throw new BusinessException(401, "您还未购买该专题");
-            }
-        }
         Page page = new PageInfo<>(questionPageParam, OrderItem.asc(getLambdaColumn(Question::getSerial)));
         IPage iPage = questionMapper.getQuestionPageList(page, questionPageParam, LoginUtil.getAppUserId());
-//        redisTemplate.opsForValue().set(key, iPage, 1, TimeUnit.DAYS);
         return new Paging(iPage);
     }
 
-- 
Gitee


From 8fddc1b837f30aa445e88f7ab728de9ebf6d7073 Mon Sep 17 00:00:00 2001
From: limingguang 
Date: Mon, 15 Mar 2021 08:53:37 +0800
Subject: [PATCH 20/36] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E5=BE=AE?=
 =?UTF-8?q?=E4=BF=A1=E7=BE=A4=E4=BA=8C=E7=BB=B4=E7=A0=81=202=E3=80=81?=
 =?UTF-8?q?=E9=82=80=E8=AF=B7=E4=BC=9A=E5=91=98=E8=B5=A0=E9=80=817?=
 =?UTF-8?q?=E5=A4=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../group/controller/GroupController.java     | 106 ++++++++++++++++++
 .../java/com/example/group/entity/Group.java  |  68 +++++++++++
 .../com/example/group/mapper/GroupMapper.java |  24 ++++
 .../example/group/param/GroupPageParam.java   |  23 ++++
 .../example/group/service/GroupService.java   |  53 +++++++++
 .../group/service/impl/GroupServiceImpl.java  |  58 ++++++++++
 .../resources/mapper/group/GroupMapper.xml    |   5 +
 .../generator/SpringBootPlusGenerator.java    |   6 +-
 .../service/impl/InviteServiceImpl.java       |  10 +-
 9 files changed, 345 insertions(+), 8 deletions(-)
 create mode 100644 example/src/main/java/com/example/group/controller/GroupController.java
 create mode 100644 example/src/main/java/com/example/group/entity/Group.java
 create mode 100644 example/src/main/java/com/example/group/mapper/GroupMapper.java
 create mode 100644 example/src/main/java/com/example/group/param/GroupPageParam.java
 create mode 100644 example/src/main/java/com/example/group/service/GroupService.java
 create mode 100644 example/src/main/java/com/example/group/service/impl/GroupServiceImpl.java
 create mode 100644 example/src/main/resources/mapper/group/GroupMapper.xml

diff --git a/example/src/main/java/com/example/group/controller/GroupController.java b/example/src/main/java/com/example/group/controller/GroupController.java
new file mode 100644
index 0000000..c5c43cb
--- /dev/null
+++ b/example/src/main/java/com/example/group/controller/GroupController.java
@@ -0,0 +1,106 @@
+package com.example.group.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.group.entity.Group;
+import com.example.group.service.GroupService;
+import lombok.extern.slf4j.Slf4j;
+import com.example.group.param.GroupPageParam;
+import io.geekidea.boot.framework.common.controller.BaseController;
+import io.geekidea.boot.framework.common.api.ApiResult;
+import io.geekidea.boot.framework.core.pagination.Paging;
+import io.geekidea.boot.framework.common.param.IdParam;
+import io.geekidea.boot.framework.log.annotation.Module;
+import io.geekidea.boot.framework.log.annotation.OperationLog;
+import io.geekidea.boot.framework.log.enums.OperationLogType;
+import io.geekidea.boot.framework.core.validator.groups.Add;
+import io.geekidea.boot.framework.core.validator.groups.Update;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 微信群 控制器
+ *
+ * @author limg
+ * @since 2021-03-14
+ */
+@Slf4j
+@RestController
+@RequestMapping("/group")
+@Module("group")
+@Api(value = "微信群API", tags = {"微信群"})
+public class GroupController extends BaseController {
+
+    @Autowired
+    private GroupService groupService;
+
+    /**
+     * 添加微信群
+     */
+    @PostMapping("/add")
+    @OperationLog(name = "添加微信群", type = OperationLogType.ADD)
+    @ApiOperation(value = "添加微信群", response = ApiResult.class)
+    public ApiResult addGroup(@Validated(Add.class) @RequestBody Group group) throws Exception {
+        boolean flag = groupService.saveGroup(group);
+        return ApiResult.result(flag);
+    }
+
+    /**
+     * 修改微信群
+     */
+    @PostMapping("/update")
+    @OperationLog(name = "修改微信群", type = OperationLogType.UPDATE)
+    @ApiOperation(value = "修改微信群", response = ApiResult.class)
+    public ApiResult updateGroup(@Validated(Update.class) @RequestBody Group group) throws Exception {
+        boolean flag = groupService.updateGroup(group);
+        return ApiResult.result(flag);
+    }
+
+    /**
+     * 删除微信群
+     */
+    @PostMapping("/delete/{id}")
+    @OperationLog(name = "删除微信群", type = OperationLogType.DELETE)
+    @ApiOperation(value = "删除微信群", response = ApiResult.class)
+    public ApiResult deleteGroup(@PathVariable("id") Long id) throws Exception {
+        boolean flag = groupService.deleteGroup(id);
+        return ApiResult.result(flag);
+    }
+
+    /**
+     * 获取微信群详情
+     */
+    @GetMapping("/info/{id}")
+    @OperationLog(name = "微信群详情", type = OperationLogType.INFO)
+    @ApiOperation(value = "微信群详情", response = Group.class)
+    public ApiResult getGroup(@PathVariable("id") Long id) throws Exception {
+        Group group = groupService.getById(id);
+        return ApiResult.ok(group);
+    }
+
+    /**
+     * 获取当前正在答疑的群
+     */
+    @GetMapping("/wechat/getGroup")
+    @OperationLog(name = "获取微信群", type = OperationLogType.INFO)
+    @ApiOperation(value = "获取微信群", response = Group.class)
+    public ApiResult getCurrentGroup() throws Exception {
+        Group group = groupService.getOne(new LambdaQueryWrapper().eq(Group::getStatus, 1));
+        return ApiResult.ok(group);
+    }
+
+    /**
+     * 微信群分页列表
+     */
+    @PostMapping("/getPageList")
+    @OperationLog(name = "微信群分页列表", type = OperationLogType.PAGE)
+    @ApiOperation(value = "微信群分页列表", response = Group.class)
+    public ApiResult> getGroupPageList(@Validated @RequestBody GroupPageParam groupPageParam) throws Exception {
+        Paging paging = groupService.getGroupPageList(groupPageParam);
+        return ApiResult.ok(paging);
+    }
+
+}
+
diff --git a/example/src/main/java/com/example/group/entity/Group.java b/example/src/main/java/com/example/group/entity/Group.java
new file mode 100644
index 0000000..77587d3
--- /dev/null
+++ b/example/src/main/java/com/example/group/entity/Group.java
@@ -0,0 +1,68 @@
+package com.example.group.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.util.Date;
+
+import io.geekidea.boot.framework.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import io.geekidea.boot.framework.core.validator.groups.Update;
+
+/**
+ * 微信群
+ *
+ * @author limg
+ * @since 2021-03-14
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@TableName("p_group")
+@ApiModel(value = "Group对象")
+public class Group extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    @NotNull(message = "id不能为空", groups = {Update.class})
+    @ApiModelProperty("ID")
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("群名称")
+    @TableField("NAME")
+    private String name;
+
+    @ApiModelProperty("群二维码")
+    @TableField("GROUP_QRCODE")
+    private String qrCode;
+
+    @ApiModelProperty("状态")
+    @TableField("STATUS")
+    private Integer status;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("REVISION")
+    private Integer revision;
+
+    @ApiModelProperty("创建人")
+    @TableField(value = "CREATED_BY", fill = FieldFill.INSERT)
+    private String createdBy;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "CREATED_TIME", fill = FieldFill.INSERT)
+    private Date createdTime;
+
+    @ApiModelProperty("更新人")
+    @TableField(value = "UPDATED_BY", fill = FieldFill.UPDATE)
+    private String updatedBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField(value = "UPDATED_TIME", fill = FieldFill.UPDATE)
+    private Date updatedTime;
+
+}
diff --git a/example/src/main/java/com/example/group/mapper/GroupMapper.java b/example/src/main/java/com/example/group/mapper/GroupMapper.java
new file mode 100644
index 0000000..b9fff4f
--- /dev/null
+++ b/example/src/main/java/com/example/group/mapper/GroupMapper.java
@@ -0,0 +1,24 @@
+package com.example.group.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.example.group.entity.Group;
+import com.example.group.param.GroupPageParam;
+
+import org.springframework.stereotype.Repository;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import java.io.Serializable;
+
+/**
+ * 微信群 Mapper 接口
+ *
+ * @author limg
+ * @since 2021-03-14
+ */
+@Repository
+public interface GroupMapper extends BaseMapper {
+
+
+}
diff --git a/example/src/main/java/com/example/group/param/GroupPageParam.java b/example/src/main/java/com/example/group/param/GroupPageParam.java
new file mode 100644
index 0000000..26a9bc8
--- /dev/null
+++ b/example/src/main/java/com/example/group/param/GroupPageParam.java
@@ -0,0 +1,23 @@
+package com.example.group.param;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import io.geekidea.boot.framework.core.pagination.BasePageOrderParam;
+
+/**
+ * 
+ * 微信群 分页参数对象
+ * 
+ * + * @author limg + * @date 2021-03-14 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "微信群分页参数") +public class GroupPageParam extends BasePageOrderParam { + private static final long serialVersionUID = 1L; +} diff --git a/example/src/main/java/com/example/group/service/GroupService.java b/example/src/main/java/com/example/group/service/GroupService.java new file mode 100644 index 0000000..50846e0 --- /dev/null +++ b/example/src/main/java/com/example/group/service/GroupService.java @@ -0,0 +1,53 @@ +package com.example.group.service; + +import com.example.group.entity.Group; +import com.example.group.param.GroupPageParam; +import io.geekidea.boot.framework.common.service.BaseService; +import io.geekidea.boot.framework.core.pagination.Paging; + +/** + * 微信群 服务类 + * + * @author limg + * @since 2021-03-14 + */ +public interface GroupService extends BaseService { + + /** + * 保存 + * + * @param group + * @return + * @throws Exception + */ + boolean saveGroup(Group group) throws Exception; + + /** + * 修改 + * + * @param group + * @return + * @throws Exception + */ + boolean updateGroup(Group group) throws Exception; + + /** + * 删除 + * + * @param id + * @return + * @throws Exception + */ + boolean deleteGroup(Long id) throws Exception; + + + /** + * 获取分页对象 + * + * @param groupQueryParam + * @return + * @throws Exception + */ + Paging getGroupPageList(GroupPageParam groupPageParam) throws Exception; + +} diff --git a/example/src/main/java/com/example/group/service/impl/GroupServiceImpl.java b/example/src/main/java/com/example/group/service/impl/GroupServiceImpl.java new file mode 100644 index 0000000..c3c2f20 --- /dev/null +++ b/example/src/main/java/com/example/group/service/impl/GroupServiceImpl.java @@ -0,0 +1,58 @@ +package com.example.group.service.impl; + +import com.example.group.entity.Group; +import com.example.group.mapper.GroupMapper; +import com.example.group.service.GroupService; +import com.example.group.param.GroupPageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; +import io.geekidea.boot.framework.core.pagination.Paging; +import io.geekidea.boot.framework.core.pagination.PageInfo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 微信群 服务实现类 + * + * @author limg + * @since 2021-03-14 + */ +@Slf4j +@Service +public class GroupServiceImpl extends BaseServiceImpl implements GroupService { + + @Autowired + private GroupMapper groupMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean saveGroup(Group group) throws Exception { + return super.save(group); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateGroup(Group group) throws Exception { + return super.updateById(group); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean deleteGroup(Long id) throws Exception { + return super.removeById(id); + } + + @Override + public Paging getGroupPageList(GroupPageParam groupPageParam) throws Exception { + Page page = new PageInfo<>(groupPageParam, OrderItem.desc(getLambdaColumn(Group::getCreatedTime))); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + IPage iPage = groupMapper.selectPage(page, wrapper); + return new Paging(iPage); + } + +} diff --git a/example/src/main/resources/mapper/group/GroupMapper.xml b/example/src/main/resources/mapper/group/GroupMapper.xml new file mode 100644 index 0000000..8bfdd25 --- /dev/null +++ b/example/src/main/resources/mapper/group/GroupMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java index 2aba9b7..ec31e2e 100644 --- a/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java +++ b/generator/src/main/java/io/geekidea/boot/generator/SpringBootPlusGenerator.java @@ -47,14 +47,14 @@ public class SpringBootPlusGenerator { generatorProperties .setMavenModuleName("example") .setParentPackage("com.example") - .setModuleName("examDate") + .setModuleName("group") .setAuthor("limg") .setFileOverride(true); // 设置表信息 - generatorProperties.addTable("sys_date","id"); + generatorProperties.addTable("p_group","id"); // 设置表前缀 - generatorProperties.setTablePrefix(Arrays.asList("sys_")); + generatorProperties.setTablePrefix(Arrays.asList("p_")); // 数据源配置 generatorProperties.getDataSourceConfig() diff --git a/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java b/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java index 10b77b7..18e9eef 100644 --- a/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java +++ b/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java @@ -85,17 +85,17 @@ public class InviteServiceImpl extends BaseServiceImpl imp } inviteMapper.insert(invite); profile.setIsVip("1"); // 设置为会员 - // 如果会员已过期,则设置从今天开始+3天 + // 如果会员已过期,则设置从今天开始+7天 if(profile.getValid() == null || LocalDate.now().isAfter(profile.getValid())) { - profile.setValid(LocalDate.now().plusDays(3)); + profile.setValid(LocalDate.now().plusDays(7)); } else { - profile.setValid(profile.getValid().plusDays(3));// 邀请新用户赠送3天会员 + profile.setValid(profile.getValid().plusDays(7));// 邀请新用户赠送7天会员 } profile1.setIsVip("1"); if(profile1.getValid() == null || LocalDate.now().isAfter(profile1.getValid())) { - profile1.setValid(LocalDate.now().plusDays(3)); + profile1.setValid(LocalDate.now().plusDays(7)); } else { - profile1.setValid(profile1.getValid().plusDays(3));// 被邀请的新用户也赠送3天会员 + profile1.setValid(profile1.getValid().plusDays(7));// 被邀请的新用户也赠送7天会员 } profileService.updateProfile(profile1); boolean flag = profileService.updateProfile(profile); -- Gitee From a03b91365bc539e6df8e006cce0ac6e1cafea6c1 Mon Sep 17 00:00:00 2001 From: limingguang Date: Fri, 19 Mar 2021 13:34:03 +0800 Subject: [PATCH 21/36] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=8C=85=E7=89=88=E6=9C=AC=EF=BC=8C=E8=A7=A3=E5=86=B3=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=BC=8F=E6=B4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/config/application.yml | 2 +- pom.xml | 4 ++-- .../service/impl/InviteServiceImpl.class | Bin 7577 -> 7577 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index 722fff9..4e8f15d 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -40,7 +40,7 @@ spring: --- spring: profiles: - active: dev + active: prod # active: @profileActive@ # logback.xml中有详细的日志配置 diff --git a/pom.xml b/pom.xml index ed2b346..885f696 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 3.6 2.8.0 1.8 - 1.2.67 + 1.2.69 5.1.47 0.9.9 1.18 @@ -72,7 +72,7 @@ 4.12 0.5.4 1.3.1.Final - 1.5.1 + 1.7.1 3.10.1 28.2-jre 1.26 diff --git a/wechat/target/classes/com/koronol/invite/service/impl/InviteServiceImpl.class b/wechat/target/classes/com/koronol/invite/service/impl/InviteServiceImpl.class index 4036d15670ae0bdd519b0e97bb22575a0ce36098..d4f75fb5a4dfe6ba97544edb38226174af1105e6 100644 GIT binary patch delta 12 UcmbPfJ=1!^UPktf`)pF delta 12 UcmbPfJ=1!^UPk7P`) Date: Fri, 19 Mar 2021 22:15:57 +0800 Subject: [PATCH 22/36] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E9=A2=98?= =?UTF-8?q?=E9=9B=86=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/pom.xml | 12 +++++++ .../notes/controller/NotesController.java | 10 +++--- .../com/example/notes/mapper/NotesMapper.java | 6 +++- .../example/notes/service/NotesService.java | 2 +- .../notes/service/impl/NotesServiceImpl.java | 14 ++++++--- .../service/impl/QuestionServiceImpl.java | 21 ++++++++----- .../resources/mapper/notes/NotesMapper.xml | 31 +++++++++++++++++-- pom.xml | 2 +- 8 files changed, 76 insertions(+), 22 deletions(-) diff --git a/config/pom.xml b/config/pom.xml index 8b5698e..9703224 100644 --- a/config/pom.xml +++ b/config/pom.xml @@ -19,6 +19,18 @@ 4.0.0 + + + com.zaxxer + HikariCP + 3.4.5 + compile + + + mysql + mysql-connector-java + + io.geekidea.boot diff --git a/example/src/main/java/com/example/notes/controller/NotesController.java b/example/src/main/java/com/example/notes/controller/NotesController.java index 535bed6..2b7f6a1 100644 --- a/example/src/main/java/com/example/notes/controller/NotesController.java +++ b/example/src/main/java/com/example/notes/controller/NotesController.java @@ -79,14 +79,16 @@ public class NotesController extends BaseController { public ApiResult deleteNotes(@RequestParam("id") String id) throws Exception { boolean flag = false; String appUserId = LoginUtil.getAppUserId(); - String key = String.format("wrongPaperList-%s", appUserId); + String key1 = String.format("wrongPaperList-%s-1", appUserId); + String key2 = String.format("wrongPaperList-%s-2", appUserId); if (StrUtil.isNotBlank(id)) { flag = notesService.remove(new LambdaQueryWrapper().eq(Notes::getUserId, appUserId).eq(Notes::getQuestionId, id)); } else { flag = notesService.remove(new LambdaQueryWrapper().eq(Notes::getUserId, appUserId)); } - redisTemplate.delete(key); + redisTemplate.delete(key1); + redisTemplate.delete(key2); return ApiResult.result(flag); } @@ -118,8 +120,8 @@ public class NotesController extends BaseController { @GetMapping("/getWrongList") @OperationLog(name = "错题试卷列表", type = OperationLogType.LIST) @ApiOperation(value = "错题试卷列表", response = WrongVo.class) - public ApiResult> getWrongList() throws Exception { - List list = notesService.getHistoryWrongList(); + public ApiResult> getWrongList(@RequestParam(value = "type", required = false) String type) throws Exception { + List list = notesService.getHistoryWrongList(type); return ApiResult.ok(list); } diff --git a/example/src/main/java/com/example/notes/mapper/NotesMapper.java b/example/src/main/java/com/example/notes/mapper/NotesMapper.java index afd7819..d50c096 100644 --- a/example/src/main/java/com/example/notes/mapper/NotesMapper.java +++ b/example/src/main/java/com/example/notes/mapper/NotesMapper.java @@ -21,7 +21,11 @@ import java.util.List; @Repository public interface NotesMapper extends BaseMapper { + // 根据试卷汇总错题集 List selectWrongPaperList(String appUserId); - List selectWrongQuestionPageList(@Param("appUserId") String appUserId, @Param("chapterId") String chapterId); + // 根据章节汇总错题集 + List selectWrongChapterList(String appUserId); + + List selectWrongQuestionPageList(@Param("appUserId") String appUserId, @Param("chapterId") String chapterId, @Param("paperId") String paperId); } diff --git a/example/src/main/java/com/example/notes/service/NotesService.java b/example/src/main/java/com/example/notes/service/NotesService.java index 81d4704..23fd3be 100644 --- a/example/src/main/java/com/example/notes/service/NotesService.java +++ b/example/src/main/java/com/example/notes/service/NotesService.java @@ -63,6 +63,6 @@ public interface NotesService extends BaseService { */ List getQuestionPageList(QuestionPageParam questionPageParam) throws Exception; - List getHistoryWrongList() throws Exception; + List getHistoryWrongList(String type) throws Exception; } diff --git a/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java b/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java index b7c3b0b..47ad760 100644 --- a/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java +++ b/example/src/main/java/com/example/notes/service/impl/NotesServiceImpl.java @@ -70,19 +70,25 @@ public class NotesServiceImpl extends BaseServiceImpl implem @Override public List getQuestionPageList(QuestionPageParam questionPageParam) throws Exception { - List list = notesMapper.selectWrongQuestionPageList(LoginUtil.getAppUserId(), questionPageParam.getChapterId()); + List list = notesMapper.selectWrongQuestionPageList(LoginUtil.getAppUserId(), questionPageParam.getChapterId(), questionPageParam.getPaperId()); return list; } @Override - public List getHistoryWrongList() throws Exception { + public List getHistoryWrongList(String type) throws Exception { String appUserId = LoginUtil.getAppUserId(); - String key = String.format("wrongPaperList-%s", appUserId); + String key = String.format("wrongPaperList-%s-%s", appUserId, type); List redisList = (List) redisTemplate.opsForValue().get(key); if (redisList != null) { return redisList; } - List list = notesMapper.selectWrongPaperList(appUserId); + List list; + // 按照章节分类 + if ("2".equals(type)) { + list = notesMapper.selectWrongChapterList(appUserId); + } else { + list = notesMapper.selectWrongPaperList(appUserId); + } redisTemplate.opsForValue().set(key, list, 3, TimeUnit.DAYS); return list; diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java index 07a353d..8213d67 100644 --- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java +++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java @@ -149,14 +149,19 @@ public class QuestionServiceImpl extends BaseServiceImpl().eq(Notes::getUserId, appUserId).eq(Notes::getQuestionId, question.getId())); + if (count == 0) { + String key1 = String.format("wrongPaperList-%s-1", appUserId); + String key2 = String.format("wrongPaperList-%s-2", appUserId); + Notes notes = new Notes(); + notes.setChapterId(Convert.toInt(question.getChapterId())); + notes.setQuestionId(question.getId()); + notes.setUserAnswer(questionAnswerParam.getAnswer()); + notes.setUserId(Convert.toInt(appUserId)); + notesService.saveNotes(notes); + redisTemplate.delete(key1); + redisTemplate.delete(key2); + } } return flag; diff --git a/example/src/main/resources/mapper/notes/NotesMapper.xml b/example/src/main/resources/mapper/notes/NotesMapper.xml index a8a1274..8aacac8 100644 --- a/example/src/main/resources/mapper/notes/NotesMapper.xml +++ b/example/src/main/resources/mapper/notes/NotesMapper.xml @@ -2,7 +2,7 @@ - SELECT t2.ID, t2.`NAME`, @@ -12,10 +12,30 @@ LEFT JOIN p_question t1 ON t.QUESTION_ID = t1.ID LEFT JOIN p_chapter t2 ON t1.CHAPTER_ID = t2.ID WHERE - t.USER_ID = 10001 + t.USER_ID = #{appUserId} GROUP BY t2.ID, t2.`NAME` + HAVING + t2.ID IS NOT NULL + + + diff --git a/pom.xml b/pom.xml index 885f696..399c769 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ ${utf8} ${utf8} 1.8 - 2.2.5.RELEASE + 2.3.6.RELEASE 2.2.2 3.3.1 2.2 -- Gitee From d60de45f599e9626632872dffa30d7de8ee366a9 Mon Sep 17 00:00:00 2001 From: limingguang Date: Tue, 23 Mar 2021 23:01:53 +0800 Subject: [PATCH 23/36] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=85=A5=E5=8F=82=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/config/application.yml | 4 +++ .../profile/controller/ProfileController.java | 33 ------------------- .../profile/param/ProfileQueryParam.java | 3 ++ 3 files changed, 7 insertions(+), 33 deletions(-) diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index 4e8f15d..d561b66 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -5,6 +5,10 @@ server: port: 8888 servlet: context-path: /api + encoding: + charset: UTF-8 + enabled: true + force: true tomcat: max-threads: 1000 min-spare-threads: 30 diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java index 266502f..a3ead27 100644 --- a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java @@ -54,17 +54,6 @@ public class ProfileController extends BaseController { @Autowired private DateService dateService; - /** - * 添加用户信息 - */ - @PostMapping("/add") - @OperationLog(name = "添加用户信息", type = OperationLogType.ADD) - @ApiOperation(value = "添加用户信息", response = ApiResult.class) - public ApiResult addProfile(@Validated(Add.class) @RequestBody Profile profile) throws Exception { - boolean flag = profileService.saveProfile(profile); - return ApiResult.result(flag); - } - @PostMapping("/recharge") @OperationLog(name = "会员充值", type = OperationLogType.UPDATE) @ApiOperation(value = "会员充值", response = ApiResult.class) @@ -98,28 +87,6 @@ public class ProfileController extends BaseController { return ApiResult.result(flag); } - /** - * 删除用户信息 - */ - @PostMapping("/delete/{id}") - @OperationLog(name = "删除用户信息", type = OperationLogType.DELETE) - @ApiOperation(value = "删除用户信息", response = ApiResult.class) - public ApiResult deleteProfile(@PathVariable("id") Long id) throws Exception { - boolean flag = profileService.deleteProfile(id); - return ApiResult.result(flag); - } - - /** - * 获取用户信息详情 - */ - @GetMapping("/info/{id}") - @OperationLog(name = "用户信息详情", type = OperationLogType.INFO) - @ApiOperation(value = "用户信息详情", response = Profile.class) - public ApiResult getProfile(@PathVariable("id") Long id) throws Exception { - ProfileInfoVo profileInfoVo = profileService.getProfileInfo(id); - return ApiResult.ok(profileInfoVo); - } - /** * 用户信息分页列表 */ diff --git a/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java b/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java index 3ab668d..0a1a1a8 100644 --- a/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java +++ b/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; + @Data @Accessors(chain = true) @EqualsAndHashCode(callSuper = true) @@ -15,6 +17,7 @@ public class ProfileQueryParam extends BasePageOrderParam { private static final long serialVersionUID = 1L; @ApiModelProperty("code") + @NotBlank(message = "请输入code") private String code; @ApiModelProperty("昵称") -- Gitee From 798758647c9c9e7f1dc9e3710a771e0a3d23b3de Mon Sep 17 00:00:00 2001 From: limingguang Date: Sun, 28 Mar 2021 21:27:30 +0800 Subject: [PATCH 24/36] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E8=80=83=E8=AF=95=E8=AE=B0=E5=BD=95bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DateServiceImpl.java | 10 +++++----- .../resources/mapper/paper/PaperMapper.xml | 2 +- .../profile/controller/ProfileController.java | 11 +++++++++++ .../controller/ProfileController.class | Bin 8242 -> 7559 bytes .../profile/param/ProfileQueryParam.class | Bin 2719 -> 2847 bytes 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java b/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java index ce77082..79c593a 100644 --- a/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java +++ b/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java @@ -63,22 +63,22 @@ public class DateServiceImpl extends BaseServiceImpl imple @Override public ExamDateGoodVo calcOrderAmount() throws Exception { - BigDecimal total = new BigDecimal(90); // 总金额最高90元 + BigDecimal total = new BigDecimal(90); // 90天会员 ExamDate examDate = dateMapper.selectEarliestOne(); - // 如果没有查询到考试日期,则按照最低金额10元计算 + // 如果没有查询到考试日期,则按照最低金额9.9元计算 if (examDate == null) { ExamDateGoodVo examDateGoodVo = new ExamDateGoodVo(); examDateGoodVo.setExamDate(null); - examDateGoodVo.setAmount(new BigDecimal(10)); + examDateGoodVo.setAmount(new BigDecimal(9.9)); examDateGoodVo.setPrice(new BigDecimal(0.11)); return examDateGoodVo; } ExamDateGoodVo examDateGoodVo = Convert.convert(ExamDateGoodVo.class, examDate); // 计算考试日期距离当天的天数差 long days = examDate.getExamDate().toEpochDay() - LocalDate.now().toEpochDay(); - // 最少需要支付10 - long minDays = Math.max(90 - days, 10); + // 最少需要支付9.9 + double minDays = Math.max(75 - days, 9.9); BigDecimal amount = new BigDecimal(minDays); examDateGoodVo.setAmount(amount); examDateGoodVo.setPrice(amount.divide(total,2, BigDecimal.ROUND_HALF_UP)); diff --git a/example/src/main/resources/mapper/paper/PaperMapper.xml b/example/src/main/resources/mapper/paper/PaperMapper.xml index 46329a1..81e6ad9 100644 --- a/example/src/main/resources/mapper/paper/PaperMapper.xml +++ b/example/src/main/resources/mapper/paper/PaperMapper.xml @@ -37,7 +37,7 @@ a.USER_ID FROM p_user_paper a - LEFT JOIN ( SELECT max( t2.ID ) AS ID, PAPER_ID FROM p_user_paper t2 GROUP BY t2.PAPER_ID ) AS b ON a.PAPER_ID = b.PAPER_ID + LEFT JOIN ( SELECT max( t2.ID ) AS ID, PAPER_ID FROM p_user_paper t2 WHERE t2.USER_ID = #{userId} GROUP BY t2.PAPER_ID ) AS b ON a.PAPER_ID = b.PAPER_ID WHERE a.ID = b.ID AND a.USER_ID = #{userId} diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java index a3ead27..54b9659 100644 --- a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java @@ -87,6 +87,17 @@ public class ProfileController extends BaseController { return ApiResult.result(flag); } + /** + * 获取用户信息详情 + */ + @GetMapping("/info/{id}") + @OperationLog(name = "用户信息详情", type = OperationLogType.INFO) + @ApiOperation(value = "用户信息详情", response = Profile.class) + public ApiResult getProfile(@PathVariable("id") Long id) throws Exception { + ProfileInfoVo profileInfoVo = profileService.getProfileInfo(id); + return ApiResult.ok(profileInfoVo); + } + /** * 用户信息分页列表 */ diff --git a/wechat/target/classes/com/koronol/profile/controller/ProfileController.class b/wechat/target/classes/com/koronol/profile/controller/ProfileController.class index ada3701657556e8793ecd329d99bb1ecfa89914d..cc98a49652cf4f9981cacd1f8d4e00f95df46d5b 100644 GIT binary patch delta 2240 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 PxKFL_(bEi_%XjQQ*Jd^8 delta 1325 zcma)6O-~b16g_V`)0vjRG$gH!pH)<(ts)=tA%dWQ;s+MBfP!eLRT~jaF}N{l;?AY% zf+Y(#E;P}oF>ztyR)2zVCqEn*C3B5X;uxk?qx@7 zuoaG=Rmi1Z{%FxFGD6{iiMUgyAl@mX71~@Dy}gWaqT-1U@Ws7{y4~8G$h{zi_Nqif zRhjhv&g9;xl1Xudd^3leyh7aD>L?3QGDA*mm-VtrwCyx#1_8=iUKhQLE_5?GjHl>f zBQy?d9>-|&@ysk6&4&UVlc2; zM8w2N{w%eMs0#ztkjXjsQZA`I+@;$_;tN8r2&yO3t>5jnv0lGHlGLx{jd9bcR`UF0 zPlb9*KLXR6deHBB%Q<{VQ{8EDEu?UUNJBl&VU&4&d}-QnmPp4Sw$ds+7+~(l@ULMT zbgEQ}x}ek=!z<647{V}2+;t=V1?gg|n96bfDqAJeYh^I2JMVPn!ukhbjJ5O2aPcqY CLw?Qx -- Gitee From 68474da7dcdd5aecdc5af0d184eb45d55ef26be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=8E=E5=85=89?= Date: Sat, 5 Jun 2021 13:22:22 +0800 Subject: [PATCH 25/36] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E5=A4=B4=E6=9D=A1?= =?UTF-8?q?=E7=99=BB=E5=BD=95=EF=BC=8C=E4=BC=9A=E5=91=98=E4=BB=B7=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E6=94=B9=E4=B8=BA9.9=E5=85=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/config/application-dev.yml | 7 +++- .../resources/config/application-prod.yml | 5 +++ .../src/main/resources/config/application.yml | 1 + .../service/impl/DateServiceImpl.java | 13 +++--- .../profile/controller/ProfileController.java | 11 ++++++ .../com/koronol/profile/entity/Profile.java | 4 ++ .../profile/param/ProfileQueryParam.java | 3 ++ .../profile/service/ProfileService.java | 2 + .../service/impl/ProfileServiceImpl.java | 37 ++++++++++++++++++ .../controller/ProfileController.class | Bin 7559 -> 7817 bytes .../com/koronol/profile/entity/Profile.class | Bin 9373 -> 9920 bytes .../profile/param/ProfileQueryParam.class | Bin 2847 -> 3330 bytes .../profile/service/ProfileService.class | Bin 1200 -> 1236 bytes .../service/impl/ProfileServiceImpl.class | Bin 14442 -> 15383 bytes wechat/target/maven-archiver/pom.properties | 5 +++ .../compile/default-compile/createdFiles.lst | 23 +++++++++++ .../compile/default-compile/inputFiles.lst | 23 +++++++++++ wechat/target/wechat-2.1-SNAPSHOT.jar | Bin 0 -> 53668 bytes 18 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 wechat/target/maven-archiver/pom.properties create mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 wechat/target/wechat-2.1-SNAPSHOT.jar diff --git a/config/src/main/resources/config/application-dev.yml b/config/src/main/resources/config/application-dev.yml index 0fb7474..9c08030 100644 --- a/config/src/main/resources/config/application-dev.yml +++ b/config/src/main/resources/config/application-dev.yml @@ -46,4 +46,9 @@ wechat: apiV3Key: eb79f964741711eb87f88c8590719960 mchSerialNo: 6223053CFC87658408133AB1DAE52F24B9BA85C1 notifyUrl: http://l17424255.gicp.net/api - certPath: cert/apiclient_cert.p12 \ No newline at end of file + certPath: cert/apiclient_cert.p12 + +# 头条小程序配置 +toutiao: + appId: tt6f6419d9f05c9be001 + secret: 9889be8caf652f947e07144e519036ab3619e350 \ No newline at end of file diff --git a/config/src/main/resources/config/application-prod.yml b/config/src/main/resources/config/application-prod.yml index eadfd1d..5f61b54 100644 --- a/config/src/main/resources/config/application-prod.yml +++ b/config/src/main/resources/config/application-prod.yml @@ -45,3 +45,8 @@ wechat: mchSerialNo: 6223053CFC87658408133AB1DAE52F24B9BA85C1 notifyUrl: https://pmp.koronol.com/api certPath: /data/pmp/apiclient_cert.p12 + +# 头条小程序配置 +toutiao: + appId: tt6f6419d9f05c9be001 + secret: 9889be8caf652f947e07144e519036ab3619e350 diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index d561b66..47b5d95 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -190,6 +190,7 @@ spring-boot-plus: # 排除登录登出 - /login,/logout - /profile/signIn + - /profile/signInByToutiao - /profile/signInByPhone - /**/wechat/** # 微信支付异步通知 diff --git a/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java b/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java index 79c593a..01586f6 100644 --- a/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java +++ b/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java @@ -76,12 +76,15 @@ public class DateServiceImpl extends BaseServiceImpl imple } ExamDateGoodVo examDateGoodVo = Convert.convert(ExamDateGoodVo.class, examDate); // 计算考试日期距离当天的天数差 - long days = examDate.getExamDate().toEpochDay() - LocalDate.now().toEpochDay(); +// long days = examDate.getExamDate().toEpochDay() - LocalDate.now().toEpochDay(); // 最少需要支付9.9 - double minDays = Math.max(75 - days, 9.9); - BigDecimal amount = new BigDecimal(minDays); - examDateGoodVo.setAmount(amount); - examDateGoodVo.setPrice(amount.divide(total,2, BigDecimal.ROUND_HALF_UP)); +// double minDays = Math.max(75 - days, 9.9); +// BigDecimal amount = new BigDecimal(minDays); +// examDateGoodVo.setAmount(amount); +// examDateGoodVo.setPrice(amount.divide(total,2, BigDecimal.ROUND_HALF_UP)); +// 取消价格计算,统一按照9.9元收费2021-6-5 + examDateGoodVo.setAmount(new BigDecimal(9.9)); + examDateGoodVo.setPrice(new BigDecimal(0.11)); return examDateGoodVo; } diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java index 54b9659..3e3c2ce 100644 --- a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java @@ -120,6 +120,17 @@ public class ProfileController extends BaseController { return ApiResult.ok(profileTokenVo); } + @PostMapping("/signInByToutiao") + @OperationLog(name = "小程序用户登录", type = OperationLogType.OTHER) + @ApiOperation(value = "头条小程序用户登录", response = Profile.class) + public ApiResult signInByToutiao(@Validated @RequestBody ProfileQueryParam profileQueryParam) throws Exception { + + ProfileTokenVo profileTokenVo = profileService.signInByToutiao(profileQueryParam); + + //JSONObject obj= JSON.parseObject(response);//将json字符串转换为json对 + return ApiResult.ok(profileTokenVo); + } + @RequestMapping("/signInByPhone") @OperationLog(name = "小程序手机号登录", type = OperationLogType.OTHER) @ApiOperation(value = "微信小程序手机号登录", response = Profile.class) diff --git a/wechat/src/main/java/com/koronol/profile/entity/Profile.java b/wechat/src/main/java/com/koronol/profile/entity/Profile.java index b56f04d..70f7e1c 100644 --- a/wechat/src/main/java/com/koronol/profile/entity/Profile.java +++ b/wechat/src/main/java/com/koronol/profile/entity/Profile.java @@ -68,6 +68,10 @@ public class Profile extends BaseEntity { @JsonFormat(pattern="yyyy-MM-dd") private LocalDate valid; + @ApiModelProperty("会员来源渠道") + @TableField("CHANNEL") + private Integer channel; + @ApiModelProperty("乐观锁") @TableField("REVISION") private Integer revision; diff --git a/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java b/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java index 0a1a1a8..011a315 100644 --- a/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java +++ b/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java @@ -20,6 +20,9 @@ public class ProfileQueryParam extends BasePageOrderParam { @NotBlank(message = "请输入code") private String code; + @ApiModelProperty("anonymousCode") + private String anonymousCode; + @ApiModelProperty("昵称") private String nickName; diff --git a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java index f37f4ac..e8cdb90 100644 --- a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java +++ b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java @@ -62,6 +62,8 @@ public interface ProfileService extends BaseService { */ ProfileTokenVo signIn(ProfileQueryParam profileQueryParam) throws Exception; + ProfileTokenVo signInByToutiao(ProfileQueryParam profileQueryParam) throws Exception; + /** * 小程序通过手机号登录 * @param phoneLoginParam diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index fa3ea4f..194d4a3 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -74,6 +74,12 @@ public class ProfileServiceImpl extends BaseServiceImpl @Value("${wechat.secret}") private String secret; + @Value("${toutiao.appId}") + private String ttAppId; + + @Value("${toutiao.secret}") + private String ttSecret; + @Lazy @Autowired private JwtProperties jwtProperties; @@ -145,6 +151,37 @@ public class ProfileServiceImpl extends BaseServiceImpl return profileTokenVo; } + @Override + public ProfileTokenVo signInByToutiao(ProfileQueryParam profileQueryParam) throws Exception { + Map data = new HashMap(); + data.put("appid", ttAppId); + data.put("secret", ttSecret); + data.put("code", profileQueryParam.getCode()); + data.put("anonymous_code", profileQueryParam.getAnonymousCode()); + data.put("grant_type", "authorization_code"); + String result = HttpUtil.get("https://developer.toutiao.com/api/apps/jscode2session", data); + JSONObject response = JSONUtil.parseObj(result); + if (response.get("errcode") != null && !response.get("errcode").equals(0)) { + throw new AuthenticationException(response.getStr("errmsg")); + } + String openId = response.getStr("openid"); + Profile profile = profileMapper.selectOne(new LambdaQueryWrapper().eq(Profile::getOpenId, openId)); + if (profile == null) { + profile = new Profile(); + } + profile.setOpenId(openId); + profile.setChannel(2); + if (profileQueryParam.getAvatarUrl() != null) { + profile.setAvatarUrl(profileQueryParam.getAvatarUrl()); + } + if (profileQueryParam.getNickName() != null) { + profile.setNickName(profileQueryParam.getNickName()); + } + ProfileTokenVo profileTokenVo = getProfileTokenVo(profile); + + return profileTokenVo; + } + @Override public ProfileTokenVo signInByPhone(PhoneLoginParam phoneLoginParam) throws Exception { Map data = new HashMap(); diff --git a/wechat/target/classes/com/koronol/profile/controller/ProfileController.class b/wechat/target/classes/com/koronol/profile/controller/ProfileController.class index cc98a49652cf4f9981cacd1f8d4e00f95df46d5b..7b81601bc202498e2a2cc76cdec8fa14c35c484a 100644 GIT binary patch delta 1993 zcmb`Hd0bUR6vw~!vRt@t5QO^B2bZLeVhTx_Vn$?4ISvkF+vH zZF%jbN!hL?VM$hIdr?V??F((%zGr*dnYV%XUVrsI?{ntNnKNg;^P4-fuy9e4uVcrC zjld{&*bJk^;#M1zmLzVoS;g%(cW|f0T{adi+T5+pJ;~&7uZz{JvAEABMUSO$e-dkT z+iLRwZ5HcnGI&r&9wQk$;wobL#j2p#h|H{fW=peulYvtE#FyuulRu< z6?yDu@spyIpB2BbUGXcwDeCw=Rnf#Bie_z=@uz=H+UP!iDgNdk#c*;B3jMX_K5glJ zMiB*TzuWucvTIGb__8ltK} zV6LE@ud7BP^P<3B5P|JJ@(aVTjX_u+(}v1ap=#`gbp^#GBx(~Eg+=vu_UqGww_bP} zV(`vqL5S{RE{Q^SX%xDJVYnm8-Cr8Gf5H!J@I DwKG1p delta 1770 zcmZ{kX>?On5P-jzw7u!;jaEQU?P+@~$EuV{5GabZDhP@zD&PVFrlCTxE!C7-MMxDD z!Mfmc*W$i!)F2epic4K^!F{Rwj{Cm-5$7g(X^d%3&fK{(^Jc!8`|ev&ySyg4`JatF zz!?6v*@I5SY8wxoK5n$RiJNV1;a0_MHi}LoZa3nNd@8uJfV;R`agUAP`25`K<36+A zZ}R{TD%RKxrps6!vWcEFRy8W)(y`Gtur(NH47SVE1{*Y^`B3u_A1gl5d}?xjMxW+$BLa+6 ze4+W0uQXfvTJeqMTfWl_r%Lg?W(GfKe&i?3&-|i^@T*@Fpak+ge@)a)3KU?0ZG)?#03gr(XkFIsJlbv6~%L`~TK z@(^5{jPlbiM^Y=%gIFxST4AnWJ_m^A70y{4$au*zj%iHbAaa=~PfOG`jweqsNpZ0I zKSVJZOT;#OS$)$z;#3^UVUi<9Y97uJqIoznKA|e9c$8SD%*2XtG{=bN*a%aZR?l>f zlY$&*{RV^l71}l=Q5i)5}nC$ zau$xD%TbrXQJ3HdNsYm!mSmfoWDil#DPpylCzCXU9mVN{K_RFcfH2I0B;lzvWFc%! z5jG{OMOf$(HYW&Ab0^ho2xnmkb=15+r<-RYgk_1)V$j4jSIWc(Rk@b3;Tsq#=TX&7 z=^F8Q=^t!^U^fncy@*!HX$E@+ZIbUyQ!-^aODwZ9XT3PpN&lIj?RK&x(aBP`lO_F~ z6eLDXa>P-2fz62XOVUTYNLbniU_FO(lVr;{FUyF}&jNOV3${D~cA*QlA`MKgpLq#f zvXxvEC+qnSSyaf{2O#T^Ynhm0cCt%SWS2@@;+kCMlC8=hyF87oHJ!|dllrWbOCIyf zA5_uJZZUQ@pB5{A=!s9uFlp%uv3a;MSv-fUWZw^PHP;xJh+M8~B}|m-xITV^Z}=CL C_7Lm< diff --git a/wechat/target/classes/com/koronol/profile/entity/Profile.class b/wechat/target/classes/com/koronol/profile/entity/Profile.class index cf53d7c3ad83bc687404533c6b8ef3036dee681a..97010cbbc80c8150fb9b6c74d8c117c3e5576784 100644 GIT binary patch literal 9920 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 NSMa~m--Ph@{{oH2z=8k( literal 9373 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%0A%z|DDS{kn`&3IwuM?jEMgi4;G qFw2o~vI!T6hE8nW;f|3gqF5MK#Nvso0e64ASqy59#U*ep-=@u*{0icn`AfaZi=1p zla3>Nkq^p@k5A61bsT2I8E9t&8U2DY{vQSY2oZmG@3wg~j?gyuo_o&koO@pPq<{VM z>m4F`g)YV@MdzZ_LhrHVeYTuui!Retj3RVSp)A{{V_+Hz&9FVE&@9_ch343vSE#^1 zMVTyiwwcvZj4rSxMGm7JnOuRAuHl$^VbXA1)3#0x9~4M9Dp34@ZMmLqd6RmfY)Ej8 z{RjeyS$o>*#-!<*Qw3wtvTRTHU>5gukC?XR zUet3r!_oALL>nxbqcB+*ckGhkcnh#2&9h4d+TmaFfrg_w?Hkgv%q>SZEzi})Y;On- zpUGn*gNi!c?r z_vOv|i`NB;B2-UzPB{fISH8Qk^6?cAdriyq_6rp5>YhYixcY_>(=x`&#VNx%sUrt0 zQ+5{l)sbbK1E%QBnn+6DNY*ZDdE2oqyP%aEd&VpnT1j{GqK161)A6$5EQ~V_3o~bU z{GLr+-Hj@c1Yoc>peC@!)?!i_pc0Mjt{NQdT5qrW3Ee|4t-Bqps@oZ$a=YT$ymydI z<3d?4ASJEUejJ;cGqPTP_Zc*$UE6el2+d-9vxb8rv6Oc5qQ`t*aA@`gb!Behh&pcE zhgLcu!BJHVZmSZ)hQLmR6QA((Y<^TP`K8ADlgSfE$?Dc279z-5-JRuCMC%MAg7Fi> zqlXY8=!j#u!23jJosZGZiaW8+s?Ll}*kvbc97fX!)V8jDcCrU6(Dwg(hiJ3r z`(ONc@6z)9uWqgUc6H^-NB6E?SE-M7s`LzXsMN)lZnmVUL!kEhNibA43)8G5?dzQA zV)falQkmve47*n`e|kG=0)+52#&7EFSd9~`-HfFIx|(P3US~X^Tc!PsNI$_#Qt22C zsPqO6pf)Ov({X|JVLaswBX3R{x;ACoo;HIwXI!+MJcf?LUS-a-_z)V>U1J>6=9q&p z{kMrYDp}yIiCXHVl3`8bnOFC8FfG?V-ym)Mv>gLGg=s6%Q~2FN0&T@9MBDH|0kCez zc@y?$A$!gRvlGPgF1RELKRks6%2Bw)Py}y>ViIsxL(i$0Sdcb(90~dKESHM zn1)@zF7+&v@C%3#y@)m9GgW#Cw8{ari(bY_U?s;|t9*k(*Xxv98!DqO8YqYBl{Yt3 zMh7)e7VDL_G*m{bHBgr7m7i{?yoWM@az8Q@La1_2`X+^X>eYG5+BhUg8NhzcS*H6N z8wx+RA>Ic9?QLvGd~8F!Z}4au8eina|oX`)xa%^oL(lmSy`fJ&l1J3 zH8*iuWptd=2}W<=bdu2VyP$t#R5Q-8$19+DqJm}BpAb4TC&r5U<{-ZPlrKC^fnpvCa4I_gL4Fw zOdld|!=M!U26N>os3?7lQS}z67>&S>-ISD-zbPTpX!Ieq$ux#PMR-V?IT`&A5?5n5 z2hFetJ9{t^s|Jg%dcyGN_;ZogqLUC4i%wu;otqIZLr;dbo9y3aD7M)F0dq_3o;q*YNe6Y)inH4*9yt*wnqa)i4R zI31=EouCOgt03toL4`1BXXq3H31g;@(j+JmW!r^fu#%jmc6tX?#8354q&&hGg@{xO z0xat<*@D@m(>Rg7563Sf~cSOroROOV literal 2847 zcmb7GU2_v<6n-|@&2ExSDTTH~KtU_CO-n@U2Ps9{0t&RH&<{RDWSef&rRi?mY(Qqb z(s9N+E|fvNR_g^b;taGiGBSFDGyabPKSIRk-Q6~6n;D_g+4sEX<2~m*=VS8szrWoF z(1W=IS}-0*BPPUWQhd&+IGcciaSi9hc|JkrhZ-)3^CJxx#rd&@OG0Rl%bsC-lSZ*(DvU<_NfP9|Gi^#} z8oF#;F|tL&E@a0%*Rl(}64IwDwr9^C|8723447fpJsWrru~Pqc@dUtShiQrjyT=`1DK|mp=x9?pzzw__fm7xHQ|!&y5)KG>tv{_U@yF+Y;hT%`@Byw@Bvl z4|kToxK84rWn11M3DNeBN#Zc*Y?Nr5duZ;?hNULCafuF7I9rX}TQek8@0iC!0 zYUpZt#k#+JqjAS`#**Y~HLiH8aiw`q&;`WF{G?(OnQU{d)00z|&Aiv!ah~nvtZkoA z#IifytmzVd0aja3zJ$*UFDYM8Em%V!tYP>HHPzb`Xw-00W1f+p8#YRQWjG!xW+iBO z!#*P7COK=AX9Lh#>0=CQ^z^aeBaEAL%r(oEqDN*JQoOC|J<(RT-Na#_De{1?OI8N{MQ9b@7lGR5qWP2p46e^9YJKCqm^~M zkDQJJ$PsNFAAnHyaUT>+bIzJJjqH@;c-a{?y?NDf=Q!oA7>j~s2U9;_l+96&_eq!O z_`|`)Rn0c&AXdjHl}vk@b5`4W;du!u2NO1+-!txXE~n@D>pm^ZO$2 zTY0`j*{(8~yGguU#w%!}Bn4>;s;r2p3FX2l$ul(CLwnX~qoCc_Vnr#+&?d`M;;D2l zLHdT&-VBX{myC^;Z3dqR;$LP%#N_*MCTU=7)j` zOJYXC)Gjh=QO=%wP|htO)}$^%>s&;fM^hr8lY-U*Iwj}^eipH*J`O?kdseH@xe9zq zgY*@rubY|9pP z?zFs!Eh`$yoI;gkE|yk=PV51i7LZCS=~#_YDyLE@mDAFyP|`vrHO)kVm*iUvEn3se z4SrW#2tr;h>rM3HAQNiF=jdaDM<}syh`cC&6Xo$PDH*456z`EzaE50;sTi(s2nR^1 z_zc@INJ_(D`s_kV)&4<)iX-tSXi;&L|C;m!+X6CPOY&`QtFU+nc#6JM1d<~B+F1<3 z54uuW4PRl8M`Q0SLDw2H3sAck(R@kplQ~%k z(sC%#L@5GMDyR4&R>3#Y(uyzIQ6JbtfzL3qC?;?mCm4~2Q4EoaaC4o&Fr$rP4_E#O zDVb2V;v^}>hwdt3Pq_$XLMKT?i@yP%QoVYQ2u3rM6@?WYc`Ykci`A%AHP>^g%-}|S PxKFL_(bEi_%XjQQ*Jd^8 diff --git a/wechat/target/classes/com/koronol/profile/service/ProfileService.class b/wechat/target/classes/com/koronol/profile/service/ProfileService.class index f808f30f3b20428231e9216c672677f22c7516dd..f322b451ae6e6932b9afa05fd35623945ac46cae 100644 GIT binary patch delta 147 zcmdnMd4*H>)W2Q(7#J8#806U*q}dr{*coIe3cEAPZH!*YD8OHwnV#pF=TsSzUs{rx zn7^5ciJ6I!b21xCdZ+*cBLf>yCkv2fXJKRzVh~0X5n&KT6A@z&M;2jVV&Dauz{DWI IAPJ_W0Nc+I@Bjb+ delta 112 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 delta 4744 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 NXPIgL{ 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 Date: Mon, 7 Jun 2021 07:58:34 +0800 Subject: [PATCH 26/36] =?UTF-8?q?feat:=E4=BC=9A=E5=91=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AD=9B=E9=80=89=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DateServiceImpl.java | 14 +++++------ .../profile/param/ProfilePageParam.java | 7 ++++++ .../service/impl/ProfileServiceImpl.java | 8 ++++++ .../profile/param/ProfilePageParam.class | Bin 1103 -> 2284 bytes .../service/impl/ProfileServiceImpl.class | Bin 15383 -> 15979 bytes wechat/target/maven-archiver/pom.properties | 5 ---- .../compile/default-compile/createdFiles.lst | 23 ------------------ .../compile/default-compile/inputFiles.lst | 23 ------------------ wechat/target/wechat-2.1-SNAPSHOT.jar | Bin 53668 -> 0 bytes 9 files changed, 22 insertions(+), 58 deletions(-) delete mode 100644 wechat/target/maven-archiver/pom.properties delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 wechat/target/wechat-2.1-SNAPSHOT.jar diff --git a/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java b/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java index 01586f6..d110337 100644 --- a/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java +++ b/example/src/main/java/com/example/examDate/service/impl/DateServiceImpl.java @@ -76,15 +76,15 @@ public class DateServiceImpl extends BaseServiceImpl imple } ExamDateGoodVo examDateGoodVo = Convert.convert(ExamDateGoodVo.class, examDate); // 计算考试日期距离当天的天数差 -// long days = examDate.getExamDate().toEpochDay() - LocalDate.now().toEpochDay(); + long days = examDate.getExamDate().toEpochDay() - LocalDate.now().toEpochDay(); // 最少需要支付9.9 -// double minDays = Math.max(75 - days, 9.9); -// BigDecimal amount = new BigDecimal(minDays); -// examDateGoodVo.setAmount(amount); -// examDateGoodVo.setPrice(amount.divide(total,2, BigDecimal.ROUND_HALF_UP)); + double minDays = Math.max(75 - days, 9.9); + BigDecimal amount = new BigDecimal(minDays); + examDateGoodVo.setAmount(amount); + examDateGoodVo.setPrice(amount.divide(total,2, BigDecimal.ROUND_HALF_UP)); // 取消价格计算,统一按照9.9元收费2021-6-5 - examDateGoodVo.setAmount(new BigDecimal(9.9)); - examDateGoodVo.setPrice(new BigDecimal(0.11)); +// examDateGoodVo.setAmount(new BigDecimal(9.9)); +// examDateGoodVo.setPrice(new BigDecimal(0.11)); return examDateGoodVo; } diff --git a/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java b/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java index 9a42920..3002949 100644 --- a/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java +++ b/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java @@ -1,6 +1,7 @@ package com.koronol.profile.param; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -20,4 +21,10 @@ import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; @ApiModel(value = "用户信息分页参数") public class ProfilePageParam extends BasePageOrderParam { private static final long serialVersionUID = 1L; + + @ApiModelProperty("是否会员") + private String isVip; + + @ApiModelProperty("昵称") + private String nickName; } diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index 194d4a3..d0c6806 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -2,11 +2,13 @@ package com.koronol.profile.service.impl; import cn.hutool.core.codec.Base64; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.example.history.entity.History; import com.example.history.service.HistoryService; +import com.example.question.entity.Question; import com.example.userPaper.service.UserPaperService; import com.koronol.profile.entity.Profile; import com.koronol.profile.mapper.ProfileMapper; @@ -118,6 +120,12 @@ public class ProfileServiceImpl extends BaseServiceImpl public Paging getProfilePageList(ProfilePageParam profilePageParam) throws Exception { Page page = new PageInfo<>(profilePageParam, OrderItem.desc(getLambdaColumn(Profile::getCreatedTime))); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if(StrUtil.isNotEmpty(profilePageParam.getIsVip())) { + wrapper.eq(Profile::getIsVip, profilePageParam.getIsVip()); + } + if(StrUtil.isNotEmpty(profilePageParam.getNickName())) { + wrapper.like(Profile::getNickName, profilePageParam.getNickName()); + } IPage iPage = profileMapper.selectPage(page, wrapper); return new Paging(iPage); } diff --git a/wechat/target/classes/com/koronol/profile/param/ProfilePageParam.class b/wechat/target/classes/com/koronol/profile/param/ProfilePageParam.class index 27b337b12658714866bc6afe579fc5094517cc57..b1ae228d96f52e7bfba24d3ba8817ec048bfdf90 100644 GIT binary patch literal 2284 zcmb7GU2has7=F&~%$&bwnMiw>+CGV zOT94Msfi{Hcid1fNWjFli5fp{F!4`#LreS*B0gtk+U>_CV$(V2J@0uxp7Xr#nb|-7 z`Qc{(hw(uY+i|uHX`GY8U>xU@P;fSZcjY{kq;fcc5jkH-U{osKi(^c#$EEMZBreHe zJ4#Y2#c^4ny>7aeQ7xHn-E!y_DV*zVX6cm|Ac^Q)k{`QpkwH| zal_E7hF#IeJ=d};MS;v%!}hEhvt-q+iK=w#?!=a7=O52Kpm5Z( zE$^5>G@C04C<6>7uyx3?&5_2;gy~*1h(zLb$~>mQ!*U%e6>rKSw4R}|Gow#Cu46k@ zz2-XCtg5Nk4A+>^iAt_UjS3$sh%Qkvy}^Km9obwf9#XUzS;d;Dui78aZZ^;Tzw9YS zTNB%J0`|#-`EkRj@;IGqlU$g%ZkD}b?kel*tS?)*MYHVc!pZ|4d ze(8(PmcMzRVIN-9kU_VG7tk%xwXwTTHmvHTB&lm-{;W?}zlJNgsv(P*u&mao){mPaV&5gY0hJ*o!tQSptqP(MRVjIIHn| z1CtOqjYF`f6YL7aHhyp96%ENa!daGIl`Kenkxlr5;;XCpRHBmjguL8gm_O+!Ke+wv z#iQ*1ZT+%dBfHy+QzR_WUYJ9?cL5zANqw?UksBE$+(}3pxwX4BJ%@w9VfrZgNWnWy zn;;R#DMfgr58?zNMQPK8lav&nit|vO^5!a}LI|FoKLwuBsJV_vMJLo1gB2TPy^3bc SGT@VQYW4kani%+gIP)(cQOW24 delta 612 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 OQ@GMoxXrRfzxN-w{-B)z delta 6046 zcmcIod3;pW75>hhnY@>mmt-;|gkcK_Adne|>@WhdBOsAYVgQ9e0z@!@0J5lzf=b;G z9VwvV0<{QkXmk>YvS4*OL|H#3m)lhNXUXE9TLet zFG>1HUqkv?NRjgm>2JX+9ZVUZ2L~p}AQ^08v+fKrWvC^?te~JhFqrConpvT3jwWnK#H{R zX_}g@sbWo)Xw7Hn)o1EvmMNvCT&{;_n=;2jI3QP8Ql@n(Pn5Yb&yWfWeJPO4`I=f_ z%0k__Qg;?vvRIZ_vQ(}zw4YXV91T8th6v% zmYYH+2jnKL$<0Y}i`<$RCV86=ie|}bxg$yLl!zgBS(v14nj~wqKYpvJwc6fwrmWW@ z?$*scmfR~FbaS7FA=H0;bnkvW_<)}NpeY;mVw)`aojj!3zt`-|mOLz5EZHiH!n%FL zl1Jq+OCFae4B2MMlk${>g;HtB)AEddKWa&pR9muLc34s)&nC%pvQrQ2GG%v??2+d! zc|rc5jeOCRz4|%9lzpbWr1>xF<`q+3)z8;V*{`3kn{t59JbA-p2+8=PDF;n?)0DSN zIb_J&ro3ZejZ8G;uqE%x5kvlD$kEEz)h?I3SGg)-nX59#64hLgJZ?eJ^x30|=8i9# zHmAgp_vvy&J|HwI^X%2)J#5II4V*OOLk5OniX2FO%=pNVztGW@D^fa%dz&GDt$ZeR zgJeWeWy{C%i7m%;^Edfa&^0o(ZL`P{t5IZ4TC?Eay>cMcBgegR!bOjJbOT%V%V)NH zF8?s(3tPUFuWUr+>&Vfx!Co8p;eJE@Y0JOlq@Z)Hw8kDi<(tTDzLq%~v59Ki@^AUp z#%6317?;nVGQGT*)_iBn_i`|@-#50i{9wzEa>|g?wjyLWtE8eLHtPdDa)373N-3A2 z+_v(_Cy~*O`ZP^Y23Jz1AfbG2Nm*%esz)W-%93v*4>szakfdxuPUH?Nr@gI`Rf?@r z<)E#+no84@kCZf$bQ@c+$;Knt6v<9+>S{!#`lW}m(p3iiD@dAOGJk$)dD)cNB})v| z*jAaUi6Ap_es*RjTlux5rm7ir?il;C89MS>$U#H3v{jZe4b{q4*(xV;H2s{csA?@p zA24KG-k^bl@Y;kts+XpEtB^oC+v+^+k3Ooeq59eCeAU-h{nY?l4OD|{HCPQHUer*5t4EI>HXg&{ zh8kw83)FC1jZhL-rf_3*e^r4{9dnr*8&+QV1as!Y4RT=f(r&MaAQ5g{?Wm~W6CR8dm2prm+w zq+Mp3Iam8&9)sLJvyZnz4hlR)bLY-kVypRN&dth+Jf4|oF3`djlCdlESmKqoTBH^W z`Z*B4%-cHhS(71^<^E1$FHuWbe$-WhUhN~rIc$Y;iR5P4nKB z16o#y8BkXXRLQ(ZH0!w}>XlzQeRh7)6(yB(Tg_IkYt*vJ_jBf(O~SUiR$Xt)K6%rY zy^N~7Wy?!)C{h~eB{xPk1~$1@YNyT%wv4#^A)Q(u}J;8-z zi!;t=llrlJoc!gjuk1$$HW;aywgXGB6N3*xC;5K@FZ|Pw*Ue z!sWajqJB!x&J9#SJxWTU{_Ppg+l^y0YTwq9cVRcB?BQ%TpU>09Tt9{63;h0J5@b4F zB(?YK%ea2J%$)yvnX|334==%`P#sy_DKlKJd&MsZeHpJ%wT8N%P3Wt5t=2=;@bI4p zsTz0+1GzhBKD}>L!>mH$s2W&>RY=OueHwPK#gNcxgo1sG!eBI~r|Ax(fwCUj{pk zDT-9h5MfTnB)gXr+@wJYk zO%>YiB6$wUkVpHi)`vUL4)A-TXulgBwj);&WPwnEKVhGq5}<}b-P1EV7Eqf`dy(u< z&_on@nsM%4gkzj@qv%|a>rbdcmyqE%bQIi96viT*beLveOW$3G94u!7tw0FZV*qZz zFx-e~Sc!SKiSfCamE;zt?ycC0Ror@Rr;OFa_??7MgmG9ySFUxUI5y@;gku>-pW;2d zPj8!ehxDK6@c}GHAF^V&xX3zuguhUwr6|E)$@6fbK~7dBP^1eV;}aN8kagz9WE`W6 zzfpNV+@~&&1xh* zhd~~OjmT###&c6B$3s}g9bqLNX8GU3YQB~A_EARYF}%#)8?5O^Sj#^oD30?O@--`h zuCrq`vVfCy*?h7N2A|i$AfF;*Fc{ATV=!3B1!FMSf>E_F`1&j`&@#?|!LpyiAdC|^ z8VB_-_#FR;rMrv3K^oJ3_L(sF<#Z4IJn}zD_Xd%V1wQ;M>CU`APv?EYujW0|wn5$- zPoYl@`mzS}BP7p{qQ7qd8`1;gv_F9q@i!=n!FoLhdl(~^Q=8Du=c#j!myWBX&+(u5~24pj|Z=^h`f$ZxhH%@_Mejgtw## z4oME)mH^(7a8DeT!FX3j;)q;=qcRom%PhXC(HVu0W9j&UC{N{#WPHggap0i8R5Vx~Mk0)d=-i`@^ zQKSm$Hmys*&9ty~*9v2zeyde}4JHw+ll7+9F^WqI{O;gB7_QAQf>B)NRIw>!)}IfW z>T?APzs1rYWR`cQWBbsPV_0Bx@M7nL@$o>hOvMf|`gaLa5~*wu?S;4gM7pgzvLs1t zYOZ&T?og*O6tt55NH!$J`J_S&Nj=TkKO3NXQX3wTM7)w#>yAAXs&B@Vbp{8vW2&=F z^XO0%#k7Jjt((3V-f9$UDvFZzNat=*oQ@e$%!;D4U^9F{Jyy@rl7icDxjwKP?#*yJ z2gKO1Ddv_hc)0wMN%J*25N#pCV>ltC-J%acR3`40FeZzSaOAaz#atg#W1D6&JU^fV zWA9Dz_HSsK(ih;EX|jxQPNcMZe6y+2oN8P#iuI#xAJS@VEmxrWDYZT7TcGDfF*je& zi(+0d%wShkV}3OjgxtP`fofd28w*1ozsK*6Vi6-ApBbCD*r|j|qF5TmRXvOhgYK%v z)gjYw`V+R}8htHEehSNcJlI~Vcsi;F%s`#FOc_gnH2!3eB|IR8B>`Os-JxP)453g+ z5X_MjES6MU!x%1?M!1CruaXS@$kW7e;ba=U9Ep-4jh)@=p13o4n~ELuE!-iQ^r}J^ zl=7`t==7nuSp4LuSd44?`AX)_-=4|joj>|1bjC-J&&hv^R1jr;j5g7 zJ|zRq`TdT(!CY{q`2dFS`5WI&Jj$*|Z_+pWZgJ?2q;K`z=Fr)sSA~7IJDm)6R{QR7 z=tSpWyN#UxNz|`OdY2O8O6@1Dl?rPO_plS!>KW3jYDH}!9an0@8A{#Gk+`T8q~rE2 zA|01Bn{-^#6w<4GcRJ>cb8bYn=7s-zSNS3hJat#xQ>>=jYOtoz_uDG0-Ni7(%0TQg z+uy;fbD5PBk|V7-uHn@j){h7hNfJ&@wwiyB;dP&HSt(3uQ+Hd|kkWsNzID}DUx{V< z!Yt0+AijnN&Sgp3$~hcU(k}iBg0yFM1$h=kU8inP%i)(!><8hJJpO!suC(qfU8JjY PtL;ucqqjIgL{ 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 Date: Mon, 7 Jun 2021 20:22:38 +0800 Subject: [PATCH 27/36] commit --- config/src/main/resources/config/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index d561b66..22d39a8 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -44,7 +44,7 @@ spring: --- spring: profiles: - active: prod + active: dev # active: @profileActive@ # logback.xml中有详细的日志配置 -- Gitee From e98a1f92229677570401cf500ba50e9b67d521c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=8E=E5=85=89?= Date: Wed, 9 Jun 2021 23:35:47 +0800 Subject: [PATCH 28/36] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=94=B6=E8=97=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FavorServiceImpl.java | 6 ++++++ .../controller/QuestionController.java | 2 +- .../service/impl/ProfileServiceImpl.class | Bin 15979 -> 16099 bytes 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java b/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java index 76afedf..5ab7a01 100644 --- a/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java +++ b/example/src/main/java/com/example/favorite/service/impl/FavorServiceImpl.java @@ -50,6 +50,12 @@ public class FavorServiceImpl extends BaseServiceImpl implem public boolean saveFavor(Favor favor) throws Exception { String appUserId = LoginUtil.getAppUserId(); String key = String.format("favoriteList-%s", appUserId); + int count = favorMapper.selectCount(new LambdaQueryWrapper() + .eq(Favor::getUserId, appUserId) + .eq(Favor::getQuestionId, favor.getQuestionId())); + if (count > 0) { + return true; + } favor.setUserId(Convert.toInt(appUserId)); // 清空缓存 diff --git a/example/src/main/java/com/example/question/controller/QuestionController.java b/example/src/main/java/com/example/question/controller/QuestionController.java index ac49a0c..c717767 100644 --- a/example/src/main/java/com/example/question/controller/QuestionController.java +++ b/example/src/main/java/com/example/question/controller/QuestionController.java @@ -103,7 +103,7 @@ public class QuestionController extends BaseController { @PostMapping("/getPageList") @OperationLog(name = "题目信息分页列表", type = OperationLogType.PAGE) @ApiOperation(value = "题目信息分页列表", response = Question.class) - @Cacheable(cacheNames = "question", key = "#p0.toString()") +// @Cacheable(cacheNames = "question", key = "#p0.toString()") public ApiResult> getQuestionPageList(@Validated @RequestBody QuestionPageParam questionPageParam) throws Exception { Paging paging = questionService.getQuestionPageList(questionPageParam); return ApiResult.ok(paging); diff --git a/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class b/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class index f3d0e17cd518920bb23f73bc8c353a734f1a1f46..e160dd6d7b653efd197ec0b16de45f11a75565f5 100644 GIT binary patch delta 5984 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 V!Ixn}FT)nrVJ0?i<0tgS{{azNO#T1> delta 5787 zcmbVQ33wD$@~^5ny3^?-Lz9>cg5ih)Ng#wH;t-G!4j~YZfFX!NBoQKaK;#|;6%|FW z6+sU1L_t;{I7x_$uqvqQ#k#u+9v}+n>UzM67svnidS*iS%YNVP=1X2z)q7p9j$hU5 zm(Le`JwN#7*`2$HsIxp_&=cHA4V~4{MGZL`UuhBX)dp?go(AV}FM~XsuW@gK46Nop z+}GfKe2qn{RvA1%$qFozFgqv)Zx+V#U>>6JP=k_qn8rm0C37d8hsRKG1CNO1Yq?mb z7u3>`I+qwcim%gow9eP-e1pMbc&x#te520e3@+nxgKy&T22bD$jc?X@q7qIrs4Y*{ zd5T3YzFOmHYRl;wR~nS9yvpVoO6^QV-J+-hMa?pT*z;Dk@oY8B(Rr@U^VIx&ofoJj z3k?n`Yi^6-+j)`3iw(+GjtBV;Mct|MU5Z(vn7a+Whwn9bDc`5@{RR!>Wja4#P!TWJ zc!kan8Z?A$jUQ5?ht;q$sPQ8@uQKRbwsl^uc6?M>vL=?-@;XJWx5$lH^5gtOEI-Ll zY5cT7rOKyLeny32qoSTw{ywMkCZ%Ds8lE?J3;#h4FL;n(^^>c(t!i?cTE1Q9s-W6p zhrus$NXe^}yvE>K-f3{1a;T19GWd_Y%ix!Jx5j%6{u94q&^&(C;MaJsdVQb4uk#xQ zzsY|#_$_`rmfzub)x>)`?~mob@cRb;mH(!E{JYK{sAq-FAL@KS=c0o;f25{AR>LPc zf2y8`bUv(}pXq!=JwMlxNIbvL`KZpvbUv>0ml}Vi^FIt)$CEYw+Td^apBjIw@pn}R zBK%3#q%`?V~n_5<` z$t9*F^HKXltEfYYDSm09$)%<=m1bB}URmiZ;**%+Bk+Lq_nK8 zV#;_^ddSswUQ#+j*3+Jnl%nTJFH`cRx4kSWBdZTArJYo#Nnca?@s}pOM1O>z*Z8Er zCId_*3^|)wWQfGw%>2u$ex&5C965yVP!852XEP*=?G)s`{Ws3G0u@D(u&0pdFvmvT9VTfqKenQy!J|CLiQu zCVzmW^Kp|u;xFx88C`jU{Zq!1{J6a)b6{`-JwZ%Ql0i*WBvI?4suQwjL3{Ch&XJ)q zBeGaLpU2;p8T1D%MwR}4Vk;(4E5D!EjtSIH{Y0={*AC18M3ET-Ts1ZhZw?$>R1TzH zR1VNzL>>njx*o>e(42)QQxF|4y_$HN=Qh_=^51|&w~;=|Mmpu?MuQdB5y0r`{;FOc>}B6c)p1cUrH1Y^3V8t>pJ3b^fst> z!rR!v_Q}EXN~iqCN-w7KU3%|grn~>Y=`%0fCCBkx*}k9t0@E7Wez9%dr@yLg?1HRY zc#pj&t94Mtu`{V-yR1GEW%M`tJG3RyVETYQM4XyYKRQ4M@$M)<@gw>e5&8u0G>0U- z>eKpFhw4`y#;VV-$|N~MT{JqP(dWqxZ2W?NYN4ap>KGjdwHsM{3oq$->5zSUhq-n_ zr?|5AM1D_*5_VHoEpiXEs2E0x_R{Qj!L?-5P z@9789R5bG(K!=r_fD#otKe^A+bd64G^e>HmJVRX_;#7*SK^&QW3Wv|0-?2%zt7_>| z7Zqn(P1AQ!Aj)(@BvPYHE|~67rn%K3Oj8CGhbn z1nz0T=oxB>&KAr<-Q}XQ^g|vB5wGEBXH#hlEkrL{LR&Gj4V`T}`p*t@ix&}x5Q?W7 z=&VJ^b|U^S(Mfa?h3s&qPSt1XRDGttjby42yM;3~9IY0aDo3i8V8d{#o})pLRGn;? zsz|1kk_$4m@b{T&d10o0re74$?O^B5+|%CFVQA3rw(>%h5%3~ijqAt&qGNZ`#j*g< zHUPc0oqE+#K9=`JI{SpEuhkC&=xd_1-wP^4{X;ZBEvcb`fUf2h5##r&hY_r!fhGQ! zY8n)XwF+x!Z~$dBq{MGnL#t_6AkJ@k{Bi!+5DoX6emz7Z0`csRf11+$@w?VjS{+?m z;*YnAt7&8)!Jkk=X#t;K^ZTq4_!Od1#bBJ$O!sT5@UZ55;mxJXREvKF0C*Jucntv9 zi_X6f{rh#4!yCZBn{*@E?{qZYxoEtL>0LnOJs@L0&Z+n5F#6P2sJavAQoqnacGE{3 zOCNIzeZnp2Q_i46d?g*`-t-w4&=DRwR1}1TtookN`^Xl!U4TMtq-8B~o0mk=}h8>ex+##m}1K<5t>W*;|F(1r9z)QCDV zh6A$K)zWCDL7=X$2k#ApZ^JRsmOWO$wJxlqQegGQfZOkG7ou^+es|_R(pMu`p;LrUL4yXc#f@QXCbi*2 zP%gZi%1L|)3|DQn3&}a^OCH1n*WzT2Q=DHvA>#gXSgvL+n80ny-|&28Zo-#F!m$Th z)je#qs^E-Ty2&}C24z~~Lo}fn&Qi}&?x=$fd@RM<6Mh&;zY+Zt;+OscG*8G}&OGxt%Wh_AN@ z!Tk6L2YZ$2l_8o{sMdw()=VUOb`8y`p}7IKH7}!v=I^F?0gvC~cZX;}G5X(yD;GMQ zFc_lSLUenMmZTwGHMA(8`*pv!mKF;RiMZ`_hjnKy-6i-mI1iX!PUU)0P&zf@7^FOw z(m9?wasu^b9}NY9OBhiG5N2~SEnq(d7a@;J5u#<>j8<`TCxoNn^dgGkRPgF!WKDfA z*Ek_$U~&bwKv;!3QU$lf*Ov=`8o{j~a|59RoO9hnlPHVR_;Mh5Hnrj_xHZmtg}~P2 zK2518zyZcN8b`Xq8_E#H2so;-jmB+J^D*a3&}VQudV%wO?9#Cx(kwgDL$qX|bVm&D zw)4An%DpE<_pYYyuI?MDYlgMd;j-M|(lf049Ik~2T+nna7{#TaBS!HE&=I4!Kj?^2+#PhpD9&zZ6t}`mR8unOsHRxZ!Ki=dz(oB!2|DWE z@txF&DC*w<%tRygHt1-i_JEFRdJ%L~({rGsn%3<^P1b9A05i}8;3MdZ!9-Qv3OcH4 zBIu~9F`!pjk2>p%cB)<(HR?Z4-el?5B$3fMgRZ+ -- Gitee From 914a2e0647c3f4c23d6bb794051dfeee65f04b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=8E=E5=85=89?= Date: Thu, 10 Jun 2021 09:15:08 +0800 Subject: [PATCH 29/36] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=BC=9A=E5=91=98?= =?UTF-8?q?=E6=97=B6=E9=95=BF=E4=B8=BA90=E5=A4=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ProfileServiceImpl.java | 6 ++--- .../service/impl/ProfileServiceImpl.class | Bin 16099 -> 15979 bytes wechat/target/maven-archiver/pom.properties | 5 ++++ .../compile/default-compile/createdFiles.lst | 23 ++++++++++++++++++ .../compile/default-compile/inputFiles.lst | 23 ++++++++++++++++++ wechat/target/wechat-2.1-SNAPSHOT.jar | Bin 0 -> 54440 bytes 6 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 wechat/target/maven-archiver/pom.properties create mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 wechat/target/wechat-2.1-SNAPSHOT.jar diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index d0c6806..ba56669 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -247,11 +247,11 @@ public class ProfileServiceImpl extends BaseServiceImpl public boolean renew(String userId) throws Exception { Profile profile = profileMapper.selectById(userId); profile.setIsVip("1"); // 设置为会员 - // 如果会员已过期,则设置从今天开始 +60天 + // 如果会员已过期,则设置从今天开始 +90天 if(profile.getValid() == null || LocalDate.now().isAfter(profile.getValid())) { - profile.setValid(LocalDate.now().plusDays(60)); + profile.setValid(LocalDate.now().plusDays(90)); } else { - profile.setValid(profile.getValid().plusDays(60));// 邀请新用户赠送3天会员 + profile.setValid(profile.getValid().plusDays(90));// 邀请新用户赠送7天会员 } return profileMapper.updateById(profile) > 0 ? true : false; diff --git a/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class b/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class index e160dd6d7b653efd197ec0b16de45f11a75565f5..f3d0e17cd518920bb23f73bc8c353a734f1a1f46 100644 GIT binary patch delta 5787 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 delta 5984 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 V!Ixn}FT)nrVJ0?i<0tgS{{azNO#T1> diff --git a/wechat/target/maven-archiver/pom.properties b/wechat/target/maven-archiver/pom.properties new file mode 100644 index 0000000..ca1558f --- /dev/null +++ b/wechat/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Jun 09 23:37:04 CST 2021 +version=2.1-SNAPSHOT +groupId=io.geekidea.boot +artifactId=wechat diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..d3cf5e2 --- /dev/null +++ b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,23 @@ +com/koronol/wxpay/controller/WxPayController.class +com/koronol/wxpay/controller/AbstractWxPayApiController.class +com/koronol/invite/entity/Invite.class +com/koronol/wxpay/entity/WxPayBean.class +com/koronol/profile/controller/ProfileController.class +com/koronol/invite/service/InviteService.class +com/koronol/profile/service/impl/ProfileServiceImpl.class +com/koronol/profile/entity/Profile.class +com/koronol/invite/service/impl/InviteServiceImpl.class +com/koronol/profile/param/ProfilePageParam.class +com/koronol/invite/controller/InviteController.class +com/koronol/profile/vo/ProfileInfoVo.class +com/koronol/wxpay/vo/PaymentVo.class +com/koronol/profile/param/ProfileQueryParam.class +com/koronol/wxpay/param/WxPayNotifyParam.class +com/koronol/profile/param/PhoneLoginParam.class +com/koronol/wxpay/interceptor/WxPayInterceptor.class +com/koronol/wxpay/param/WxPayParam.class +com/koronol/profile/mapper/ProfileMapper.class +com/koronol/invite/param/InvitePageParam.class +com/koronol/profile/vo/ProfileTokenVo.class +com/koronol/invite/mapper/InviteMapper.class +com/koronol/profile/service/ProfileService.class diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..9fbee88 --- /dev/null +++ b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,23 @@ +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/interceptor/WxPayInterceptor.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/controller/InviteController.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/param/WxPayNotifyParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/entity/Invite.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/service/InviteService.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/vo/PaymentVo.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/vo/ProfileInfoVo.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/param/WxPayParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/controller/AbstractWxPayApiController.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/entity/Profile.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/PhoneLoginParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/ProfileService.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/entity/WxPayBean.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/param/InvitePageParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/mapper/InviteMapper.java +/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java diff --git a/wechat/target/wechat-2.1-SNAPSHOT.jar b/wechat/target/wechat-2.1-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..ee0dcc8a027f1ec1b99b06fec3c1047f57d0ce4e GIT binary patch literal 54440 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

T7u~VT}+%-J4T*LvR^!{$-@PK*d{g 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 Date: Thu, 10 Jun 2021 09:17:26 +0800 Subject: [PATCH 30/36] =?UTF-8?q?=E5=A2=9E=E5=8A=A0.gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wechat/.gitignore | 36 ++++++++++++++++++ .../service/impl/ProfileServiceImpl.class | Bin 15979 -> 15979 bytes wechat/target/maven-archiver/pom.properties | 2 +- wechat/target/wechat-2.1-SNAPSHOT.jar | Bin 54440 -> 54441 bytes 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 wechat/.gitignore diff --git a/wechat/.gitignore b/wechat/.gitignore new file mode 100644 index 0000000..ccdf702 --- /dev/null +++ b/wechat/.gitignore @@ -0,0 +1,36 @@ +/target/ +/classes +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +.DS_Store + +*.log +logs + +*.rdb + + + diff --git a/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class b/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class index f3d0e17cd518920bb23f73bc8c353a734f1a1f46..b6068b4c38f1ff15640e2a56c95b5ad3419c58b6 100644 GIT binary patch delta 14 VcmaD|^SWlkOGd`1&94|6Z2&zm2Oj_c delta 14 VcmaD|^SWlkOGZYU&94|6Z2&xc2LS*8 diff --git a/wechat/target/maven-archiver/pom.properties b/wechat/target/maven-archiver/pom.properties index ca1558f..ec16dac 100644 --- a/wechat/target/maven-archiver/pom.properties +++ b/wechat/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Wed Jun 09 23:37:04 CST 2021 +#Thu Jun 10 09:16:08 CST 2021 version=2.1-SNAPSHOT groupId=io.geekidea.boot artifactId=wechat diff --git a/wechat/target/wechat-2.1-SNAPSHOT.jar b/wechat/target/wechat-2.1-SNAPSHOT.jar index ee0dcc8a027f1ec1b99b06fec3c1047f57d0ce4e..3374ee7c5a424eefa0102b29a1af76d7331dbbdf 100644 GIT binary patch delta 1266 zcmY+EYeSogvQEHi8v{2C`EuChYW@)Z;YHF5cYLp>GNnbQfw0j|y2dQvc zmVpLEwvaAnIyas3ws|RyFeF6iMjwKNG}`+=OKKnX`=96eKhHVmeV?tVnQLz5WEwTc zOC7|IkYv6t^W%6M!W%fwhVfOve1HfNzyyMs%nH#&N*G_TmRSoLnGi69^&@TuiOb)< zqBn%yfLy8ILo`87j-?=G{miFLk%orQu-quN5RVXf=@vQaCl-ITq7-Ux=UKE!v(ZPCIN#iQi$QApPF5#Tt#3G^0%!2}@`EEU4R79k9r5hB4l zTT`XuGCYd?juRqvQBFr0hzHJRBoLt<>4Iq2o%gm#AhK7+F%b2uCRvDb{}$>A3vykA zNPNV7>iH5m%_A}z6HUuK5=vbWxtgJ;o?Tg|Y57>r21lf11)pivuftVRXYu)Iy!jkH5wt(m57);H2t%6kXsc6S?VykL%cnZt3m zVIjBL1Htb0XpuVpwS<+3yOv#wIZ#ZzI#uPeUbR#oy4b-oug$+xw59r7VS~$w2Cq3) zamA6a*4V@(?XI?0?O%(Mwa=~{@0hxhwMP;AaprQ_&cg6dWkszIC#S3>Pv0%w{k*Lp zxh~_-$72^RM1P3c;s18phGUZC)QN>YSawt$=N5GwVm=! zCw-4Hy%O&%MZX?At5<*>`Y3Q-Pv3iJ7agqpE;=9DuFc}L$>VN0ne7T(&?*Dfc_ulz zXb3=D(JLoI2K)@FjoT1Xjw~VhMmnQ6j7r2NjBz5XjdG&s4*DxAskCjh6|ULtByej_ z0(iA&2RPXi11>kIz&ukt*ksxQelsP4ir($G*f~3`y=ts|&2ivCb1bbhr-F0lEHJY# z8+_823wrkFgC+emKGvUsb?`tYczz%qd_O?*k%N1%t{Kb$e+=#g(}waEW|F)dqRo9Q zG`tST*wKpD~Od-S24X I6#qm106H?zFaQ7m delta 1275 zcmY+EYe-XJ7{@(3XX@58U7CniYKnMU<}!0;-YM7x*~J&b zFfGfV1qHG%MpA6<;-<5?*_AFIB7zDEmmi{xcK+`Y8l3(9@ALeh=bZDt&!*F{cXe!# znrAtwpYXXoX1fv;&))K4-4HwE#mhKgAxQv9Vv@l+CPpxk6U-{GpGgGGi~>}M;z@`} zvgBW1!K)BuBG)QjLDVS$fuomx?>DM!xMk)=`HqG&E4nD0Sb@P_0 z@_RMkx1{op57of|b7K{rFj;E2R(oITxG$>=yWUw8rj==B5AD@m7nB~)!R{ZjW1S1p zY)9_zqET1Z9KU3v=AhCu@6u@WN=@~$`JOosKPvC4$Z*RE-`?_3XNx?a(BP-$8BrMf zZ>|{|d10VO8f?tN@u`g&;2C2!XfUe4KSnwNYscw$HILI#85rLr>;M_DM3JB4$&0$c zMD<})F=8rP6mgp94}me4B9`xtB+X_zrhVo-#9o^VLB zdp%e`xgFF`HiF?(d%@Nz8h<`ji?za02cC0iz_$*X&z|0a_0{PHaDI9xsCnA7IH6?h zDQ&*eNs}j?+hCe@(q{29v|0NMT|b{WfP8^#7dYf<#3UMwktEt33!U%g!Hez(lEtAU NC9}Kztp?%G Date: Thu, 10 Jun 2021 09:18:14 +0800 Subject: [PATCH 31/36] mvn clean --- wechat/target/classes/cert/apiclient_cert.p12 | Bin 4751 -> 0 bytes wechat/target/classes/cert/apiclient_key.pem | 28 ------------------ .../invite/controller/InviteController.class | Bin 3951 -> 0 bytes .../com/koronol/invite/entity/Invite.class | Bin 6060 -> 0 bytes .../koronol/invite/mapper/InviteMapper.class | Bin 398 -> 0 bytes .../invite/param/InvitePageParam.class | Bin 1094 -> 0 bytes .../invite/service/InviteService.class | Bin 829 -> 0 bytes .../service/impl/InviteServiceImpl.class | Bin 7577 -> 0 bytes .../controller/ProfileController.class | Bin 7817 -> 0 bytes .../com/koronol/profile/entity/Profile.class | Bin 9920 -> 0 bytes .../profile/mapper/ProfileMapper.class | Bin 701 -> 0 bytes .../profile/param/PhoneLoginParam.class | Bin 2809 -> 0 bytes .../profile/param/ProfilePageParam.class | Bin 2284 -> 0 bytes .../profile/param/ProfileQueryParam.class | Bin 3330 -> 0 bytes .../profile/service/ProfileService.class | Bin 1236 -> 0 bytes .../service/impl/ProfileServiceImpl.class | Bin 15979 -> 0 bytes .../koronol/profile/vo/ProfileInfoVo.class | Bin 2304 -> 0 bytes .../koronol/profile/vo/ProfileTokenVo.class | Bin 5766 -> 0 bytes .../AbstractWxPayApiController.class | Bin 421 -> 0 bytes .../wxpay/controller/WxPayController.class | Bin 13073 -> 0 bytes .../com/koronol/wxpay/entity/WxPayBean.class | Bin 3966 -> 0 bytes .../wxpay/interceptor/WxPayInterceptor.class | Bin 1542 -> 0 bytes .../wxpay/param/WxPayNotifyParam.class | Bin 1054 -> 0 bytes .../com/koronol/wxpay/param/WxPayParam.class | Bin 2142 -> 0 bytes .../com/koronol/wxpay/vo/PaymentVo.class | Bin 4111 -> 0 bytes .../classes/mapper/invite/InviteMapper.xml | 5 ---- .../classes/mapper/profile/ProfileMapper.xml | 8 ----- wechat/target/maven-archiver/pom.properties | 5 ---- .../compile/default-compile/createdFiles.lst | 23 -------------- .../compile/default-compile/inputFiles.lst | 23 -------------- wechat/target/wechat-2.1-SNAPSHOT.jar | Bin 54441 -> 0 bytes 31 files changed, 92 deletions(-) delete mode 100644 wechat/target/classes/cert/apiclient_cert.p12 delete mode 100644 wechat/target/classes/cert/apiclient_key.pem delete mode 100644 wechat/target/classes/com/koronol/invite/controller/InviteController.class delete mode 100644 wechat/target/classes/com/koronol/invite/entity/Invite.class delete mode 100644 wechat/target/classes/com/koronol/invite/mapper/InviteMapper.class delete mode 100644 wechat/target/classes/com/koronol/invite/param/InvitePageParam.class delete mode 100644 wechat/target/classes/com/koronol/invite/service/InviteService.class delete mode 100644 wechat/target/classes/com/koronol/invite/service/impl/InviteServiceImpl.class delete mode 100644 wechat/target/classes/com/koronol/profile/controller/ProfileController.class delete mode 100644 wechat/target/classes/com/koronol/profile/entity/Profile.class delete mode 100644 wechat/target/classes/com/koronol/profile/mapper/ProfileMapper.class delete mode 100644 wechat/target/classes/com/koronol/profile/param/PhoneLoginParam.class delete mode 100644 wechat/target/classes/com/koronol/profile/param/ProfilePageParam.class delete mode 100644 wechat/target/classes/com/koronol/profile/param/ProfileQueryParam.class delete mode 100644 wechat/target/classes/com/koronol/profile/service/ProfileService.class delete mode 100644 wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class delete mode 100644 wechat/target/classes/com/koronol/profile/vo/ProfileInfoVo.class delete mode 100644 wechat/target/classes/com/koronol/profile/vo/ProfileTokenVo.class delete mode 100644 wechat/target/classes/com/koronol/wxpay/controller/AbstractWxPayApiController.class delete mode 100644 wechat/target/classes/com/koronol/wxpay/controller/WxPayController.class delete mode 100644 wechat/target/classes/com/koronol/wxpay/entity/WxPayBean.class delete mode 100644 wechat/target/classes/com/koronol/wxpay/interceptor/WxPayInterceptor.class delete mode 100644 wechat/target/classes/com/koronol/wxpay/param/WxPayNotifyParam.class delete mode 100644 wechat/target/classes/com/koronol/wxpay/param/WxPayParam.class delete mode 100644 wechat/target/classes/com/koronol/wxpay/vo/PaymentVo.class delete mode 100644 wechat/target/classes/mapper/invite/InviteMapper.xml delete mode 100644 wechat/target/classes/mapper/profile/ProfileMapper.xml delete mode 100644 wechat/target/maven-archiver/pom.properties delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 wechat/target/wechat-2.1-SNAPSHOT.jar diff --git a/wechat/target/classes/cert/apiclient_cert.p12 b/wechat/target/classes/cert/apiclient_cert.p12 deleted file mode 100644 index 4063fd92f47aae259e0c502b778d156cd8b4f6f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4751 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 P`nMs5mr0uP8FKj_Gh&i@ diff --git a/wechat/target/classes/com/koronol/invite/entity/Invite.class b/wechat/target/classes/com/koronol/invite/entity/Invite.class deleted file mode 100644 index 53c99b5cc072036bb9b472abdaf4ddd91e292193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6060 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 BABq3~ diff --git a/wechat/target/classes/com/koronol/invite/mapper/InviteMapper.class b/wechat/target/classes/com/koronol/invite/mapper/InviteMapper.class deleted file mode 100644 index 0e3ea240d9a7dabbeb95e1d89321b8c74ec09e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmb7A!Ab)`49!&CwN*in{(u+3T)eFadJu#ap#|@=YaG(H{e-^-`}jcG?+yZkE)hs&2(%qs8*8 z^k|1hCyu`BBeoIb6oaTSy;Tdf+b8 zo^1!)16Laf3eM+!Ub6JUk(-Y0oRgHP#YF{|wFHCF2X^KyXiM)BRu~fnk~Db2IeCek zBn+AAV&h;((68*jyb4Zt%`3*WFT~C=cg3>yXBe`PT8RSby9|ScVr7kQaNFa)Yqz76kr7W@+#}qf!indl+L~~p znc`z=NNGLCmB|x>siL|FsN0o@JB>xY9_yq@5v{}hI~td+bspB+eNxj4L>P#$~NF2t_W;?{9@0o z%S9TlM;)3QdJELx;nwqm_j?E1@AhB5INbiY|7z>U>)kxM(9O{I2X~>!Q25_L=W!ON z@)*{~Ih<#>L8@FK8gf-|yQWlRKcRhyO%*h3M+JIcuJq$3>{~pfb-7|GSQSCMH%!p4 zX6Zi$qsXFzY>vDXI$_eC^wQZw5t}R{YnJxFKEx@#bY|jUANuH?ZzrH11LV<+F+`^> zo+7J@jsDawnH2tBY8;hPdr9dt$~LH`TrRzZncgXXgYgEYu~YsEV{x+d3F+7^mG@xA zxAcx?IzcfIs~c~_BoqXQ(-N=6OvOm#n;Yts`uU}^!H z;baqShT(R?5rav%nt|y>B``Ayj74M2%#QsF$Vz}rf*q$lY5of_@kLyUr7~Qm=#>yx Fe*>AV-EjZ_ diff --git a/wechat/target/classes/com/koronol/invite/service/InviteService.class b/wechat/target/classes/com/koronol/invite/service/InviteService.class deleted file mode 100644 index fc41d983c83a309493bb5adc985e85baf86d51e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829 zcmcIi%TB^T6upB$1yOnU_yQByI2&DIT$pHL(nJz=Zp=`wlYw@oX{SZk{*?hNC zQUp;%H!hm?p5AlLeZ9UtzW~4q96Hc)V9$Yl2Gv-kc&$@qk-<^h^-RFWCNkRiTuot) z+A90V^Q3O)mPnTm9)?yK9XoKqpq7L~VdpZnA^NxoTWxnFQo((pC3lUMQ;mj1n@jeD zL|4U@!QD##P(&h_*=M=EEbew(Ww=Bft04+LFvjwG!f|4vG51V_JQPxCkyXiwrpT8; zrLQDmNkrW~{jb~E@3TCoipp^^2oyCRe45hDV1%CSu5U32sIwTORC&lRM2!9X`;W%e zzDXhvuar--Xy&V!DI90}V$fc33?F_=`3&ld4d=BpI9+XO diff --git a/wechat/target/classes/com/koronol/invite/service/impl/InviteServiceImpl.class b/wechat/target/classes/com/koronol/invite/service/impl/InviteServiceImpl.class deleted file mode 100644 index d4f75fb5a4dfe6ba97544edb38226174af1105e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7577 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 TU&5Dh4X$-Y_vDQ3wMYK}A)?UA diff --git a/wechat/target/classes/com/koronol/profile/controller/ProfileController.class b/wechat/target/classes/com/koronol/profile/controller/ProfileController.class deleted file mode 100644 index 7b81601bc202498e2a2cc76cdec8fa14c35c484a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7817 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 VBd|D3F!z#-5AVTyy$tuh{{p2tJB$DT diff --git a/wechat/target/classes/com/koronol/profile/entity/Profile.class b/wechat/target/classes/com/koronol/profile/entity/Profile.class deleted file mode 100644 index 97010cbbc80c8150fb9b6c74d8c117c3e5576784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9920 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 NSMa~m--Ph@{{oH2z=8k( diff --git a/wechat/target/classes/com/koronol/profile/mapper/ProfileMapper.class b/wechat/target/classes/com/koronol/profile/mapper/ProfileMapper.class deleted file mode 100644 index 06a9a8c236a0e673bd9605b1471f084df513f0c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmb7C!A=xG5Pdx?JHn!@D=1vKxIkiG^n@{4O-xJ%G(fob48_tg(>3Yt(d<9@18^{& z{U~GY?0OJ3A*Pe6u9wPtU9aoc@7o^$USm7OMh{EaOz}L$ixgW5UF!n*sPJ-_6*%Pda`LAp zF9jK7T$u9Acss40{;%p`TOBB@oY=85vGGD`??0lY$_-ccoEu$D zauaQ+%O>c8J?S~=dlP8J_;#W8or&Lx?&=9QzMzj{h)gs0V#e`mYK6k~aU(`mbY_E< z8Ar}>6m@no;(o?{tV8Xs8((-+(Kq(jIz;lsaZ-~$rkaC|>?fkN^YAaMp^H>uxTteJ zS?1@WZP|6x{F$>wyRuq?ZjbYydo0{xNXM}n>h`UZ&{ptraG6Y2&@g74F2 ktV--k6R?4v#I^R`ll)k!B|MRsU>*H7KgB@uwEr3K2P`?s`Tzg` diff --git a/wechat/target/classes/com/koronol/profile/param/PhoneLoginParam.class b/wechat/target/classes/com/koronol/profile/param/PhoneLoginParam.class deleted file mode 100644 index 876426f4cbb9df3f0adf0290f1bb730fd0c63721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2809 zcma)8-E$LF6#w01H@is_D4{I`i-J^WnwBV5#gw9a6fL%;wzLW&vQ3tBX}TMCHwAoj z#z)5ohX;LEUYHSQw9LrJ=nKyHf1vykBL41f(l#G6l1a`z_k7)Rf9KpY`Sagj9sn4{ zN&-Dth(pDqBp*ofp@s_yt`{ZwNE%#{+{cn!mfKG>TuC5_1s#T5mvj_$lysPKcU41K z!?HlPXS$YASu|bGa_oi4(*okGKYA};Xr_qG zzsV>n52`VSX5KJXs}*vpQChWZfxXRHp1)ab&NO1J33P27Eq5u?F1k0XzF9hL_=Z5= zhPFi!J7(FIe_S9sm|Y}Trvk9HPg%A(Q(Ij!-SY;4k?=W1f^HCc?(0IuU$%%;ZmQ_4 z=2slov7Ji3>N;1gikYt(uCbb*U3P49$|+m+tlUeq%BCNl(leOtR1}p4le|MW*NNt9 zXkNp&cd*@6UO=Tq;LNqfIc9!ZGb+rt$@kpSHM8iCWiPUgoaQ#Es~FVrmrYk7F7G=K zmNpT{>KiRkNZ|EQEZKA*Y{7eHsBe*`=6$2MGHp}?VEItk?2J`3>mLeUNFGXPg z|1~d*nf&{k`;UIT_2{e5|GITIi6P{Ycn{XT zs01Ru-}zwPSf7OtA!byord<*k>C}O3O<7NI4Es6edcahnU=RARi~Md*s0cFr5i`=g z+{@kb)V<(gADtq2(WCZ&hXK4qbqZo9HVq;Y=(=YQ*ZuUQ!@-8dp?0T3G-F}fodz3D z*>M=}wNkj4UG7Y>t8h6Xf!nL8oNO4{uF6C!t8oYNhh z*$Ew-qpi+;9i7=h9h{X`=RF;rU&HHl=K?Pok(V6G{ftQGOZSBq^-D`YWMw5*Z*-0m zebzX#&N9x?&T*7yjU!7h zY{_Ud!z2Y|@B8y|{sK_F06l#KLjPqHNY8-Xf=Ps+_^w z*{OaNfc86?yD;tEaqewhO zP(pkf6ACq1JEs{YQP9uE(!rxnE<&f-0$qjEG(k&7TfI?Yt0 zIKZbgLrx*cyKs)28o+iPv8NO$giQ!S#Xnw8X}-CSNI@^uhC#zdX%^MZVq45MEnB5D zW}2MeA$GXTROL__y^rLDdq}0Xtz)}{kW0Ed$&bwnMiw>+CGV zOT94Msfi{Hcid1fNWjFli5fp{F!4`#LreS*B0gtk+U>_CV$(V2J@0uxp7Xr#nb|-7 z`Qc{(hw(uY+i|uHX`GY8U>xU@P;fSZcjY{kq;fcc5jkH-U{osKi(^c#$EEMZBreHe zJ4#Y2#c^4ny>7aeQ7xHn-E!y_DV*zVX6cm|Ac^Q)k{`QpkwH| zal_E7hF#IeJ=d};MS;v%!}hEhvt-q+iK=w#?!=a7=O52Kpm5Z( zE$^5>G@C04C<6>7uyx3?&5_2;gy~*1h(zLb$~>mQ!*U%e6>rKSw4R}|Gow#Cu46k@ zz2-XCtg5Nk4A+>^iAt_UjS3$sh%Qkvy}^Km9obwf9#XUzS;d;Dui78aZZ^;Tzw9YS zTNB%J0`|#-`EkRj@;IGqlU$g%ZkD}b?kel*tS?)*MYHVc!pZ|4d ze(8(PmcMzRVIN-9kU_VG7tk%xwXwTTHmvHTB&lm-{;W?}zlJNgsv(P*u&mao){mPaV&5gY0hJ*o!tQSptqP(MRVjIIHn| z1CtOqjYF`f6YL7aHhyp96%ENa!daGIl`Kenkxlr5;;XCpRHBmjguL8gm_O+!Ke+wv z#iQ*1ZT+%dBfHy+QzR_WUYJ9?cL5zANqw?UksBE$+(}3pxwX4BJ%@w9VfrZgNWnWy zn;;R#DMfgr58?zNMQPK8lav&nit|vO^5!a}LI|FoKLwuBsJV_vMJLo1gB2TPy^3bc SGT@VQYW4kani%+gIP)(cQOW24 diff --git a/wechat/target/classes/com/koronol/profile/param/ProfileQueryParam.class b/wechat/target/classes/com/koronol/profile/param/ProfileQueryParam.class deleted file mode 100644 index 167a63544e8e6a99583ff62cc9cf4a4d7424fe6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3330 zcmb7G>vI!T6hE8nW;f|3gqF5MK#Nvso0e64ASqy59#U*ep-=@u*{0icn`AfaZi=1p zla3>Nkq^p@k5A61bsT2I8E9t&8U2DY{vQSY2oZmG@3wg~j?gyuo_o&koO@pPq<{VM z>m4F`g)YV@MdzZ_LhrHVeYTuui!Retj3RVSp)A{{V_+Hz&9FVE&@9_ch343vSE#^1 zMVTyiwwcvZj4rSxMGm7JnOuRAuHl$^VbXA1)3#0x9~4M9Dp34@ZMmLqd6RmfY)Ej8 z{RjeyS$o>*#-!<*Qw3wtvTRTHU>5gukC?XR zUet3r!_oALL>nxbqcB+*ckGhkcnh#2&9h4d+TmaFfrg_w?Hkgv%q>SZEzi})Y;On- zpUGn*gNi!c?r z_vOv|i`NB;B2-UzPB{fISH8Qk^6?cAdriyq_6rp5>YhYixcY_>(=x`&#VNx%sUrt0 zQ+5{l)sbbK1E%QBnn+6DNY*ZDdE2oqyP%aEd&VpnT1j{GqK161)A6$5EQ~V_3o~bU z{GLr+-Hj@c1Yoc>peC@!)?!i_pc0Mjt{NQdT5qrW3Ee|4t-Bqps@oZ$a=YT$ymydI z<3d?4ASJEUejJ;cGqPTP_Zc*$UE6el2+d-9vxb8rv6Oc5qQ`t*aA@`gb!Behh&pcE zhgLcu!BJHVZmSZ)hQLmR6QA((Y<^TP`K8ADlgSfE$?Dc279z-5-JRuCMC%MAg7Fi> zqlXY8=!j#u!23jJosZGZiaW8+s?Ll}*kvbc97fX!)V8jDcCrU6(Dwg(hiJ3r z`(ONc@6z)9uWqgUc6H^-NB6E?SE-M7s`LzXsMN)lZnmVUL!kEhNibA43)8G5?dzQA zV)falQkmve47*n`e|kG=0)+52#&7EFSd9~`-HfFIx|(P3US~X^Tc!PsNI$_#Qt22C zsPqO6pf)Ov({X|JVLaswBX3R{x;ACoo;HIwXI!+MJcf?LUS-a-_z)V>U1J>6=9q&p z{kMrYDp}yIiCXHVl3`8bnOFC8FfG?V-ym)Mv>gLGg=s6%Q~2FN0&T@9MBDH|0kCez zc@y?$A$!gRvlGPgF1RELKRks6%2Bw)Py}y>ViIsxL(i$0Sdcb(90~dKESHM zn1)@zF7+&v@C%3#y@)m9GgW#Cw8{ari(bY_U?s;|t9*k(*Xxv98!DqO8YqYBl{Yt3 zMh7)e7VDL_G*m{bHBgr7m7i{?yoWM@az8Q@La1_2`X+^X>eYG5+BhUg8NhzcS*H6N z8wx+RA>Ic9?QLvGd~8F!Z}4au8eina|oX`)xa%^oL(lmSy`fJ&l1J3 zH8*iuWptd=2}W<=bdu2VyP$t#R5Q-8$19+DqJm}BpAb4TC&r5U<{-ZPlrKC^fnpvCa4I_gL4Fw zOdld|!=M!U26N>os3?7lQS}z67>&S>-ISD-zbPTpX!Ieq$ux#PMR-V?IT`&A5?5n5 z2hFetJ9{t^s|Jg%dcyGN_;ZogqLUC4i%wu;otqIZLr;dbo9y3aD7M)F0dq_3o;q*YNe6Y)inH4*9yt*wnqa)i4R zI31=EouCOgt03toL4`1BXXq3H31g;@(j+JmW!r^fu#%jmc6tX?#8354q&&hGg@{xO z0xat<*@D@m(>Rg7563Sf~cSOroROOV diff --git a/wechat/target/classes/com/koronol/profile/service/ProfileService.class b/wechat/target/classes/com/koronol/profile/service/ProfileService.class deleted file mode 100644 index f322b451ae6e6932b9afa05fd35623945ac46cae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236 zcmcIk%Wm306upxYTu8}_=F#`ENf((-D^;TEB2ptovQ#Qi7TrzE#hn0it?`(YFX%sI zkq_ucRlUYICO{EcbYa&ms3lQHxq_+I!9Gr%>qq{T8YyZ_BF{6v8Owza6Y)=Mc zQAR4%Mx~`nPSY$cpwiMIV~ORafBkR0Ppb^|GgnoPxvFy`;9`Z6z9nc!`3x3qZAkgF z+SEgHL9DQqDV&bllsK)37ndW=A7pqM?WNLbj88nohYD{Nn?5&P*8Mndh=pS+x=8cJ zO{`lqcr9RWnxf@wy4uv6G-b7~msc3L#&VMk2JDR(?NA3OPgRVq?0eP*ZAJYkl*EU0n*8fv5ZEyep diff --git a/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class b/wechat/target/classes/com/koronol/profile/service/impl/ProfileServiceImpl.class deleted file mode 100644 index b6068b4c38f1ff15640e2a56c95b5ad3419c58b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15979 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 d;8)ExJcsAC!BuyK#3@M_(9U zlo=m*!5POHAMinVr~`~z2AuKof;0XNKH65_eH8I`vYWQ4nSq()obP=1@ArM@>~H_x z`4PYX-if0bV+~O7id@EHn22*fCYR$sgL{YV@Fh7!zn3acs{wY=6oqmQB^apk25&5H$tVyi>M)fvw}` zjCmtdH0;^TsO_7xrkfQ=O;TvhnNyZ$O&85!+je}zr(;i`d)#s|-uuQZRWrt#Br{yH zCY%|wc*1o`rt5z|KkB>;E6}j=&E>zo`h5Ab8{~O;$CbRL+utsI`N`77j|H@SmTmd_ z1)}NhDFJ1Kegrm;Tef+uJU4B+Ck>_{&^+$sS){>Ic@CM1U$B_h&hfl6mpSjaj_njP zCD%D?70t}NlVLuR9JS9nQx22TXH9=3sJ=DbUAKOzk_*z*y;bdOx{h-9Lx-iK(5Gg; zS2l{wxplqA@s?cPCf0r1E9eaoUAjAf5#Hi8 zcR|bPr^4cu%T+G8^dY=MHn#F)B8Ol zJsZt~#M=UuFmWn}Sg`^19Yr77QGl(GqZnrNH-p8PQK7fzYpBXX?=MikfEr!s{Ta$c zU(X`c%8`V2tdGl}(*G+OQ_5Xzxr#)8N?Am#s-X|6RM7{ulqz+!yJ)_Orj(k}s!GZN zV@0vCS4V>!R!c5mH}){YR^;#u`xl|bK|D)dls9NUKZJWYTt_$%&yi9w!9jYSl!h1R zpTiQ<|G}mhUc864820j~i+gw^ARG9Vkk>LqU@v#s6IGTj)04q!M=9utx|*KKq-1(R z-sI5D@3d2CH<--sQ-&&Vbtba~f~6;WuOimJh=zA1UmsMYAf<#7T|!7vXMJb}0mJT8AQ)%rSk&ITTRfVdK zQp=(m UKU8@UlJtL=C%y7B8@PF-SiQ zt8*9j7v1l6pyv-yIVE%ce0 zv9$lS=xwi7=h9E6# z^$%}0N3a(!``Yb=oaKD6e)HIwsY92ij$gWY`aJC5Dcg-R`bUTCEQ~@^hmTC1yf!(0 z85pN7n7N&~42YAjT%0^O4uE?W#&FDeH=mrCdhGF*yE~^|e|hrCmA~J3YFX#x6W4EE ze+KTXe4jNcNS``>Zu03<@7_2udGxqEE=QzM9*rY_i1eG8b!H)r>qI4S>g3_6XAe!C zd{IzmPrp5q+HK|w>D;3unbaP$e>iVv%i@ySg!KkHH)0mxAvkIlK+OsY@58^&-rmju zzFxr|PGd8$%F0@Wdj)xywDt+|twlWXwLMlgy?Jb8S30-DL^?Qje5yVZ$;Mi3`U*o9 zF22|~(y*PgvvwvmnzMIXnRIHeokCt1?%=QLvpGA1=>i8gzNED*7pepzP;Q=1R>KU+ zbh<(yZBZ%GfVavl>40lW$zj%Zl@?}o%iuFaL2|(76y47XIg^|dZ-XCv~aneTCp_`trcV%LA5Q9?R*=0~aq3s4jo6Iz`3Zt3QYaUn)j{^uuFj z2362lezh&T_N4m@U9Asd9N05EPpJ@HyD*f_p+dQelAILH*>PZvvsvohTB#~+L>xk~ zTXm@}F2jyeb#O%L)T-7|l{Ioys>^ny>tb6g*TtoDt-4vcRx7E(0OGqSm0C%a>N%xS zs~Y60f4J8ib(#vZ9HSMX=r^}k;wwqI$E4`0qPws(+QI-nKH?8k|v>(HVK`?0g6_g#_4`MZA(X#y(g%_*}_wG zyYuw6_RAq3Fh?<3QM{eyy*xdpN`7Ws6*-;3FZO=f%$&)mg?RT^OoEnBnC4L{wE?%| z?Z-nM_(P7dz8mWZK9}Kdd7eH31@b;y@i8b+3$qpXK!N(0tyl>KYG$^g3kuZHY{hCQ zP+PMVpMV1OrW6fWspH;9Yq7a5PwTOVVw`Qdf#zTnMGe`FyYig{KK*T%NnCJ(u?aHZ zY{ux*z`7(*5A|XtxMU$`8eb&O`3mE?uEwZx7h`XwakHy2y2HiTS82S!)fipnV(hOp zUg&C!ZgepYR2nB;jnTy}#=%PC#jeKaeivh{(zwml7*oT=I8F^XX}rwU z_(A%dGUoF3pf-YS?U%^YR%tG4tVvQ-je)G%QPAh<3vQ0QRXdXHE9i^vj(k-+lI>Fy|4wIexx1nqKnq*d)mjw?a^G~kxCP}Pp)coUR% zKT)`9M{)`Ze#XiZd47jlYs4TMZf`q9e&5;lUsB`*`Mqb`-=auwN81GH&Jv(za|eXs z>-;rE627;o?lkG03Eu?O78y~)4@%SsB>cR^u1BK{$dI$R!p86AXiSj@Zx1i4Rs-ZvAle8D8 z77xT>dITsc0;s@8fns729;o|(>O?ypzWagVViVpez6?|^wo)@40BWGG;I1RIAgKL^ zYJ>FE_oyjIU&DV*yhn2-4E=v0f`WHR)o&~D$>Y|~WzBK-%!<1lw*F$=5y?F`Ill+s z-BP;o9*3O{>wm?%R{2&ttuQ~>R-s>{RonSjsT`0P5 z0r~I>ca;tS`SJe#0v!elp!5!+*tlTFQS?WEG

!{}fP&enrda+dyIZ6JFQ80~F!1 z@^~qJ3mZO^l@KT;65 z?mA@{ax*O1-d3&5!?!Und3ZmDauT_{lail1kd!O^eO;Bj-I)i6C^!7Pl3hxtP;&hC ze&9OIec&=B;`1h`nVWTj=EpxEaTFi%1rlSnH^)CHaUJ6pi80Qb;|nFOXZ#_FF~OVT zcS+pHK9dqR@%|!+3Hq@63!VJYa6q++2Q!u@(NX93RSakTE>`$`^$Z=$)3g5r6VrN6 diff --git a/wechat/target/classes/com/koronol/wxpay/controller/AbstractWxPayApiController.class b/wechat/target/classes/com/koronol/wxpay/controller/AbstractWxPayApiController.class deleted file mode 100644 index 1993cd6ad92c3bcf6cc156d8b91475d75f907441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmbV|%}T>S5Xb-9=0jt&wJ#ugYCX6YK|~Qs!BbE{sprkQ#*JyVY`3+2EKh<5AHata zCrJ@6UYx^x{AT9QFrQ!V9{`Tgi_k_VL^s4PLvXH3?JgMF{lS>Q8<_{i&`ETuuI7_e z**lRIM0$ylq8JOSt9lJR_oQbGr-?KZ{%ou%O~GH5Q?cUGl+K!>P?itVnX^K=`{j*T z4X1ka(>h~_Gvylgs56Fx{-74qc_q?F{o11$+KFz>+)8z+tHbvGmOskHLd5XkGo1YM zM22pq!V6Jm{5s8*blyH%^uo$opqIfXA5g_9GK&7;8`x{z4#@`%#0KT@I^RSDcnn)a KKy167-uVWu&TZxZ diff --git a/wechat/target/classes/com/koronol/wxpay/controller/WxPayController.class b/wechat/target/classes/com/koronol/wxpay/controller/WxPayController.class deleted file mode 100644 index 16ccb6b152f396b58924515148e9d51d7259313b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13073 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 diff --git a/wechat/target/classes/com/koronol/wxpay/interceptor/WxPayInterceptor.class b/wechat/target/classes/com/koronol/wxpay/interceptor/WxPayInterceptor.class deleted file mode 100644 index e9d614cc80cb215ecd4209096a7684aded8d3106..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1542 zcmb7ENmCO+6#hEfU>F30sJH?y1QiBxK?$NjX=xdkB9xZiI!T)hOlIOtBY4xBUc6&@ z77tv!1WT%1PFDFpaQO)yw0u1i3j&2H57Wz=*YADrdtdjL-|yZ7IEB$Tns7uzx0;h` z=!qkQqZ*EBINpHXI5hOd5rYv&KTc>E&~Q@2DTdgvX`6C{A)M^F%@7%P@`9l`ZQA0- zOerheNuIUHl1Mu_Zr$dtsrFT4L>5htp+B8-O2)L~I<{jOvvXzs$S`dw+?*&&$2IQE z-Qtg~t{PGdTgtAu!tJ~YolmBx_(MKtc*1>X3279iEE`v7$OMK7@nA-HGF8{jD?7F) z0zbpzcEPxrof0{j>bXaimV_)id4|5U;}#6B?3#ArzROEu)^VqeS&=mY42f4I?c8fSD2;;fEy7-AUQD1=q+jM1zo zU7nME{?W2IzJ}J_tE^7U*wQSCOLIy-rel-9zCK@Ad0JVSfBoa-enRX8nwFv6O*AZF%ZK*pN5m?KzeVGn$YOYrj)$RAcAMu`V0^*Ktb;EYhp1iG<{JRm_#ce%-01{O(Zt2QXU@6jeBU|WoUcFMZvr@vkvI&TjUp3= zhHMPEDDqJZGjw~FE4W>`__a-mf6iF6jglOG0kza~6}T%jWC=Dc*JBW-hW zslk`c26uVgyuCETm#3vK?k>-$z$g(~_nO?Ms#K;h#}~M1bEj%vFV9&Oe>6Kw?MlVA z=ZV3Pe$8@emZHxq^HaPLbU_+0#46mmqHyW6#=Tl=3L0sW2wlr-+CBl36Z2)!cZE}B z=*?vRU};6Ezj#qL-HLTpsHs!!1DsQRG4$VPI=-k|CE*E@W8871&wUb{=1LcYG`&S$ zty-?hf4`XH4KYRP+C*Y3sNcXaxV`yu>(jHHN3XU%JlX!Zvh!l?`-9bQPuI2|uIxPC zNFad@hRpxUo4^2iNxk;2Gg(@Uc11~nAVl33gPjrg)vraGHp&3$MrQy~#K`WarPH8x zj;WUD?xcuGmXS4b@4#LMDP44{LQq*Z-HBELdXOZK;UIeHR>hJ4BV^P0+;bTEdj1Qv zRTz=={AXxW!@0MJ1g^eLNfERI54DOzV1hvkeFU8%%0on^;V{+35sAirpfieo=t`WB z{32P6-VMd72(&!}eXWFD0)t=`0mBg-4Ph>XFuFb#wD~U-Jw(w6^B4vLl;ao*QAPrv fhD_=ke{H2DVq_O29b}!rNwNp1_!OPf9?tv%BG1_o diff --git a/wechat/target/classes/com/koronol/wxpay/param/WxPayParam.class b/wechat/target/classes/com/koronol/wxpay/param/WxPayParam.class deleted file mode 100644 index fb7a28a412b343ece5f0b6ba54fce266fd9cf6c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2142 zcma)7%~M-d6#w1iz2qf?PoX6h6eTnJRlICD_O3&Vl0?Nb1`oWTbAwWE&~?@l9Q&LE?(D{mklSaS8vk8 z1#`+?GV-$yV>|9DCR_ck8gjw{rTGVtt}!MG%eFTBM?j^ z7X*|M#-QD#X&KX{l|{q3s1t$&YG+xX&N6xSm5Q4)iK%-sYpejxefh?$zB(&K!ig*!?u=h|Ya&^z@~AYafQ=NZ_HBuS<`QpI+Eg4u#>XW+Pe6OD zXBMv*S$81$A$wx)W!%3aQ?{Ek9DzDnPiyf@^SrBPuTJTOGC3S5 z4u^o2)vYlJi(*bM<~)8$_BgZ7&W%rv5f=E;I#}_%U2?L< zIa79}u}bg>IYH+R$U;>~GDFL1;->V35)=D-m7hz8Kb=iUq=Ll8&s z99k*2@lz4NA^wvQo{#Wc$NhQ!cND1%NR|#>yod;uq>^hFebU?oceQ5=;$AuEQLdq~ zGJ<22W1a!J@iI?B(#dtN^Y;kc-RIm`)0rKp;T+uW+)~pyi5}lM!}Y%oS#~T&m|gsLDp_7bsst4Q`}pv#%R1`gYCKdiQZ|??i2a>9 z?_t=jIENGE2Df1zC)vFKZ$|MdbwM(42Cq@#4-9+xIwciT9G`wlA-uu(orr|BztIrJ zn@?~kj8pv6#1pi8VuW90`M!JxPIH%htFm+nFK_^!*AR6Vo=Q;O{P9WpVg96_O7Be5 zz@RczrmLfAAV;#arqnvZeVd4UB=uTGkr#2rztJRxyy~b;O}`h_&mF`m3}BEsRhBwL zDZro1lcYpaa}0;^HYKG@!vvJ4R4AlD2$l{Zp3NlA) diff --git a/wechat/target/classes/com/koronol/wxpay/vo/PaymentVo.class b/wechat/target/classes/com/koronol/wxpay/vo/PaymentVo.class deleted file mode 100644 index ec0052bc59fd08574b5e7c703c9c35975af9e320..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4111 zcmb7G-*X#R75=WQ)vn}~te7~7(gd91f-Tz>(D0*jTyWEry4Z<{Qd{@t6e320WKFgzvDK61i3X=QR& zemXN=E;{+?0fE%v`Fz=#vnQOAb3A7c<@0XYDs$bEK+lNdW=f~5>1n%|vFe`8P{A2> zr|jHV(Jk1;@&eb_Ga(S(&z%XhjW~Jx;QZWiyLiN6VPyH-Nmkur?K$=* z!{r%=mFgUsbmua&Zqd!Vxy-32_>{~^H#24}%-L*+%K{nGc6mrOVrzF#P%BI_j?}By z%HhFU0p)0{Rzo?G+fbX1NndqeMyd9kz1W^w5F345|U(DN`g>#moi@1m64@{CQ*#AI!|eDSt=lhskeb2Uhy6^)ZjZSH7M+5; zI0SZ7t}U+p=3M3a;=g`%mWOZU#!HH5;qDPvvG`-UFOOwGJ0w4e1N6Ey) z_^OF7;cgT6OO%ypK$?Bh3`%p4G~dJ{0^6JKynE-J+?148vbKwEPh*27eu8rXW?yHm z&V$@qUuU(_YE-SY8da;!QLL}iuQvyx$HaGVHy=|^Kq*{ct2f2Fb=^|-K;NK&3ttog*U@!#}5ZuxnyfrYGLJJ5EHwSMI45mN>g0<%0 zoq@p=c0h2XIe2$qFb_mPu-+Wp85sO!e8mqQU{6CVvYzgJ3!!v#xN6omMe&})kUB#G2Z9&UH@%QLb3$H@ zs%xPz8`8$E-RezWf)>8g`)3#zp|xD;{S%DQzVs5J-jE=6u#YAi?*9u~Q{nfpNHMdKlqNZm_t1VB@syT|G?3z1ouqiyNa>Pf_#{1LG>{V6C`pNIEEScc zm`{qPVhyCWY%57^Su@otNv2OCY9J-EagvhRL@F*x37-^CC90(G74E-<-|y@1m6udq zYEr$02QbX4bzlt-@~)BB=il))&b9Db{2NAy!mR6C7$wqZui_w41UX#5AtD_`zDCA~ z4EzkU_&QM(KZlLOL@_L}FXKe5SZ1S-5SjP~uj_}1;`k?S!vs+R-(aRA=+KQ@Na#5F z0k-Kl#y>-RfE@}(|1ZeA`Qr4?vAhgIe1ayWAWIY4P#SfLwOVO37DSdt$oHyRCiDQ~ zqKv+j9M~5g^yITEIWR-<7|Gtt(EFFLIN=munS=KL8--x& zAjF4UtUeCOi4JI0LX{I&bO~fWr?lHiXopf_;8qG$^nh`(ND* zXTABcq*R47thxLiIC=x^$KJ-r+P5yDLyC((?b{UQ>F;RYu5eu99SZZnceJMzZj*SY q!byp5qgleP;J23g#5n5fAcSe}RLpo^PD$qDFe`pJoxp4fx&HtaSRn)e diff --git a/wechat/target/classes/mapper/invite/InviteMapper.xml b/wechat/target/classes/mapper/invite/InviteMapper.xml deleted file mode 100644 index 3aa9590..0000000 --- a/wechat/target/classes/mapper/invite/InviteMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/wechat/target/classes/mapper/profile/ProfileMapper.xml b/wechat/target/classes/mapper/profile/ProfileMapper.xml deleted file mode 100644 index 365fb8e..0000000 --- a/wechat/target/classes/mapper/profile/ProfileMapper.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - insert into p_profile (name, phone, open_id, nick_name, avatar_url) - values (#{name}, #{phone}, #{openId}, #{nickName}, #{avatarUrl}) - - diff --git a/wechat/target/maven-archiver/pom.properties b/wechat/target/maven-archiver/pom.properties deleted file mode 100644 index ec16dac..0000000 --- a/wechat/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Thu Jun 10 09:16:08 CST 2021 -version=2.1-SNAPSHOT -groupId=io.geekidea.boot -artifactId=wechat diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index d3cf5e2..0000000 --- a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,23 +0,0 @@ -com/koronol/wxpay/controller/WxPayController.class -com/koronol/wxpay/controller/AbstractWxPayApiController.class -com/koronol/invite/entity/Invite.class -com/koronol/wxpay/entity/WxPayBean.class -com/koronol/profile/controller/ProfileController.class -com/koronol/invite/service/InviteService.class -com/koronol/profile/service/impl/ProfileServiceImpl.class -com/koronol/profile/entity/Profile.class -com/koronol/invite/service/impl/InviteServiceImpl.class -com/koronol/profile/param/ProfilePageParam.class -com/koronol/invite/controller/InviteController.class -com/koronol/profile/vo/ProfileInfoVo.class -com/koronol/wxpay/vo/PaymentVo.class -com/koronol/profile/param/ProfileQueryParam.class -com/koronol/wxpay/param/WxPayNotifyParam.class -com/koronol/profile/param/PhoneLoginParam.class -com/koronol/wxpay/interceptor/WxPayInterceptor.class -com/koronol/wxpay/param/WxPayParam.class -com/koronol/profile/mapper/ProfileMapper.class -com/koronol/invite/param/InvitePageParam.class -com/koronol/profile/vo/ProfileTokenVo.class -com/koronol/invite/mapper/InviteMapper.class -com/koronol/profile/service/ProfileService.class diff --git a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 9fbee88..0000000 --- a/wechat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,23 +0,0 @@ -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/mapper/ProfileMapper.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/interceptor/WxPayInterceptor.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/controller/InviteController.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/param/WxPayNotifyParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/entity/Invite.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/service/InviteService.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/vo/PaymentVo.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/vo/ProfileInfoVo.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/vo/ProfileTokenVo.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/param/WxPayParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/service/impl/InviteServiceImpl.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/controller/AbstractWxPayApiController.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/entity/Profile.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/PhoneLoginParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/ProfileService.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/wxpay/entity/WxPayBean.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/param/InvitePageParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/param/ProfileQueryParam.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/invite/mapper/InviteMapper.java -/Users/limingguang/Documents/dev/java/spring-boot-plus/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java diff --git a/wechat/target/wechat-2.1-SNAPSHOT.jar b/wechat/target/wechat-2.1-SNAPSHOT.jar deleted file mode 100644 index 3374ee7c5a424eefa0102b29a1af76d7331dbbdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54441 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

T7u~VT}+%-J4T*LvR^!{$-@PK*d{g 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

KhD9EVO!JjU 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 -- Gitee From fa47e40df761e8dcb14311883a564e14c1ec9de4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=8E=E5=85=89?= Date: Thu, 10 Jun 2021 22:04:09 +0800 Subject: [PATCH 32/36] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/src/main/resources/config/application.yml | 2 +- .../koronol/profile/service/impl/ProfileServiceImpl.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/config/src/main/resources/config/application.yml b/config/src/main/resources/config/application.yml index 2a8a501..47b5d95 100644 --- a/config/src/main/resources/config/application.yml +++ b/config/src/main/resources/config/application.yml @@ -44,7 +44,7 @@ spring: --- spring: profiles: - active: dev + active: prod # active: @profileActive@ # logback.xml中有详细的日志配置 diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index ba56669..050896d 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -262,7 +262,13 @@ public class ProfileServiceImpl extends BaseServiceImpl String newSalt = SaltUtil.getSalt("666", jwtProperties); if (profile.getId() == null) { - profileMapper.insert(profile); + if (profile.getNickName() != null) { + profileMapper.insert(profile); + } else { + ProfileTokenVo profileTokenVo = Convert.convert(ProfileTokenVo.class, profile); + profileTokenVo.setToken(""); + return profileTokenVo; + } } else { profileMapper.updateById(profile); } -- Gitee From 3761b4f6144d4b155d599a8c2b63da2a7d983ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=8E=E5=85=89?= Date: Fri, 11 Jun 2021 20:04:54 +0800 Subject: [PATCH 33/36] =?UTF-8?q?[fix]=E4=BF=AE=E5=A4=8D=E6=89=8B=E6=9C=BA?= =?UTF-8?q?=E5=8F=B7=E7=99=BB=E5=BD=95=E6=97=B6=E6=9C=AA=E8=BF=94=E5=9B=9E?= =?UTF-8?q?token=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/koronol/profile/service/impl/ProfileServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index 050896d..15880e2 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -226,6 +226,7 @@ public class ProfileServiceImpl extends BaseServiceImpl profile.setPhone(phoneObj.getStr("phoneNumber")); } profile.setOpenId(openId); + profile.setNickName(""); // 设置个空的昵称 ProfileTokenVo profileTokenVo = getProfileTokenVo(profile); @@ -262,7 +263,7 @@ public class ProfileServiceImpl extends BaseServiceImpl String newSalt = SaltUtil.getSalt("666", jwtProperties); if (profile.getId() == null) { - if (profile.getNickName() != null) { + if (profile.getNickName() != null || profile.getPhone() != null) { profileMapper.insert(profile); } else { ProfileTokenVo profileTokenVo = Convert.convert(ProfileTokenVo.class, profile); -- Gitee From 969ed07f5723fe0124c7403db1a7e20e4d742553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=8E=E5=85=89?= Date: Wed, 16 Jun 2021 22:05:39 +0800 Subject: [PATCH 34/36] =?UTF-8?q?[fix]=E4=BF=AE=E5=A4=8D=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E5=81=9A=E9=A2=98=E8=AE=B0=E5=BD=95=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84bug=20[feat]=E5=A2=9E=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=80=83=E8=AF=95=E8=AE=B0=E5=BD=95=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/QuestionServiceImpl.java | 2 +- .../controller/UserPaperController.java | 7 +-- .../userPaper/mapper/UserPaperMapper.java | 4 +- .../userPaper/service/UserPaperService.java | 3 +- .../service/impl/UserPaperServiceImpl.java | 11 ++-- .../com/example/userPaper/vo/UserPaperVo.java | 50 +++++++++++++++++++ .../mapper/userPaper/UserPaperMapper.xml | 23 +++++++++ 7 files changed, 88 insertions(+), 12 deletions(-) create mode 100644 example/src/main/java/com/example/userPaper/vo/UserPaperVo.java diff --git a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java index 8213d67..e643835 100644 --- a/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java +++ b/example/src/main/java/com/example/question/service/impl/QuestionServiceImpl.java @@ -132,7 +132,7 @@ public class QuestionServiceImpl extends BaseServiceImpl().eq(History::getQuestionId, question.getId())); + boolean flag = historyService.saveOrUpdate(history, new LambdaQueryWrapper().eq(History::getQuestionId, question.getId()).eq(History::getUserId, appUserId)); // 更新考试正确题数和当前进度 UserPaper userPaper = userPaperService.getById(questionAnswerParam.getRecordId()); if (userPaper != null) { diff --git a/example/src/main/java/com/example/userPaper/controller/UserPaperController.java b/example/src/main/java/com/example/userPaper/controller/UserPaperController.java index 05bbe63..d3aa24a 100644 --- a/example/src/main/java/com/example/userPaper/controller/UserPaperController.java +++ b/example/src/main/java/com/example/userPaper/controller/UserPaperController.java @@ -2,6 +2,7 @@ package com.example.userPaper.controller; import com.example.userPaper.entity.UserPaper; import com.example.userPaper.service.UserPaperService; +import com.example.userPaper.vo.UserPaperVo; import com.example.userPaper.vo.UserRankVo; import lombok.extern.slf4j.Slf4j; import com.example.userPaper.param.UserPaperPageParam; @@ -88,9 +89,9 @@ public class UserPaperController extends BaseController { */ @PostMapping("/getPageList") @OperationLog(name = "用户考试表分页列表", type = OperationLogType.PAGE) - @ApiOperation(value = "用户考试表分页列表", response = UserPaper.class) - public ApiResult> getUserPaperPageList(@Validated @RequestBody UserPaperPageParam userPaperPageParam) throws Exception { - Paging paging = userPaperService.getUserPaperPageList(userPaperPageParam); + @ApiOperation(value = "用户考试表分页列表", response = UserPaperVo.class) + public ApiResult> getUserPaperPageList(@Validated @RequestBody UserPaperPageParam userPaperPageParam) throws Exception { + Paging paging = userPaperService.getUserPaperPageList(userPaperPageParam); return ApiResult.ok(paging); } diff --git a/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java b/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java index b89bcf3..f4439a2 100644 --- a/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java +++ b/example/src/main/java/com/example/userPaper/mapper/UserPaperMapper.java @@ -4,13 +4,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.userPaper.entity.UserPaper; import com.example.userPaper.param.UserPaperPageParam; +import com.example.userPaper.vo.UserPaperVo; import com.example.userPaper.vo.UserRankVo; import org.springframework.stereotype.Repository; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; -import java.io.Serializable; import java.util.List; /** @@ -26,4 +26,6 @@ public interface UserPaperMapper extends BaseMapper { List selectRank(); Integer getAvgScore(String appUserId); + + IPage selectUserPaperPage(Page page, @Param("param") UserPaperPageParam userPaperPageParam, @Param("appUserId") String appUserId); } diff --git a/example/src/main/java/com/example/userPaper/service/UserPaperService.java b/example/src/main/java/com/example/userPaper/service/UserPaperService.java index 38f230c..8c4f522 100644 --- a/example/src/main/java/com/example/userPaper/service/UserPaperService.java +++ b/example/src/main/java/com/example/userPaper/service/UserPaperService.java @@ -2,6 +2,7 @@ package com.example.userPaper.service; import com.example.userPaper.entity.UserPaper; import com.example.userPaper.param.UserPaperPageParam; +import com.example.userPaper.vo.UserPaperVo; import com.example.userPaper.vo.UserRankVo; import io.geekidea.boot.framework.common.service.BaseService; import io.geekidea.boot.framework.core.pagination.Paging; @@ -51,7 +52,7 @@ public interface UserPaperService extends BaseService { * @return * @throws Exception */ - Paging getUserPaperPageList(UserPaperPageParam userPaperPageParam) throws Exception; + Paging getUserPaperPageList(UserPaperPageParam userPaperPageParam) throws Exception; /** * 获取用户排行 diff --git a/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java b/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java index 4f1c2a6..4e1294c 100644 --- a/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java +++ b/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java @@ -4,7 +4,7 @@ import com.example.userPaper.entity.UserPaper; import com.example.userPaper.mapper.UserPaperMapper; import com.example.userPaper.service.UserPaperService; import com.example.userPaper.param.UserPaperPageParam; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.example.userPaper.vo.UserPaperVo; import com.example.userPaper.vo.UserRankVo; import io.geekidea.boot.framework.common.service.impl.BaseServiceImpl; import io.geekidea.boot.framework.core.pagination.Paging; @@ -56,11 +56,10 @@ public class UserPaperServiceImpl extends BaseServiceImpl getUserPaperPageList(UserPaperPageParam userPaperPageParam) throws Exception { - Page page = new PageInfo<>(userPaperPageParam, OrderItem.desc(getLambdaColumn(UserPaper::getCreatedTime))); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - IPage iPage = userPaperMapper.selectPage(page, wrapper); - return new Paging(iPage); + public Paging getUserPaperPageList(UserPaperPageParam userPaperPageParam) throws Exception { + Page page = new PageInfo<>(userPaperPageParam, OrderItem.desc(getLambdaColumn(UserPaper::getCreatedTime))); + IPage iPage = userPaperMapper.selectUserPaperPage(page, userPaperPageParam, LoginUtil.getAppUserId()); + return new Paging<>(iPage); } @Override diff --git a/example/src/main/java/com/example/userPaper/vo/UserPaperVo.java b/example/src/main/java/com/example/userPaper/vo/UserPaperVo.java new file mode 100644 index 0000000..0408767 --- /dev/null +++ b/example/src/main/java/com/example/userPaper/vo/UserPaperVo.java @@ -0,0 +1,50 @@ +package com.example.userPaper.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +@Data +@Accessors(chain = true) +@ApiModel(value = "UserPaperVo对象", description = "考试记录对象") +public class UserPaperVo implements Serializable { + + private static final long serialVersionUID = -6557771116248176541L; + + @ApiModelProperty("id") + private String id; + + @ApiModelProperty("用户编号") + private String userId; + + @ApiModelProperty("用户昵称") + private String nickName; + + @ApiModelProperty("用户头像") + private String avatarUrl; + + @ApiModelProperty("试卷编号") + private Integer paperId; + + @ApiModelProperty("试卷名称") + private String paperName; + + @ApiModelProperty("考试进度") + private Integer progress; + + @ApiModelProperty("正确题数") + private Integer correctCount; + + @ApiModelProperty("错误题数") + private Integer errorCount; + + @ApiModelProperty("耗时") + private Integer timeCost; + + @ApiModelProperty("createdTime") + private Date createdTime; +} diff --git a/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml b/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml index b903a0e..f4b8fe9 100644 --- a/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml +++ b/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml @@ -27,4 +27,27 @@ AND t.USER_ID = #{appUserId} + -- Gitee From f75c8a4a42708fa7dbefb6053aaae6c12bcedcf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=8E=E5=85=89?= Date: Fri, 18 Jun 2021 14:24:30 +0800 Subject: [PATCH 35/36] =?UTF-8?q?[feat]=E4=BF=AE=E6=94=B9=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E5=85=85=E5=80=BC=E4=BD=93=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koronol/profile/controller/ProfileController.java | 6 +++--- .../com/koronol/profile/service/ProfileService.java | 11 ++++++++++- .../profile/service/impl/ProfileServiceImpl.java | 10 ++++++---- .../com/koronol/wxpay/controller/WxPayController.java | 6 +++--- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java index 3e3c2ce..48473eb 100644 --- a/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java +++ b/wechat/src/main/java/com/koronol/profile/controller/ProfileController.java @@ -57,16 +57,16 @@ public class ProfileController extends BaseController { @PostMapping("/recharge") @OperationLog(name = "会员充值", type = OperationLogType.UPDATE) @ApiOperation(value = "会员充值", response = ApiResult.class) - public ApiResult recharge() throws Exception { + public ApiResult recharge(@RequestParam(value = "type", required = false) String type) throws Exception { String format = DateUtil.format(new Date(),"yyyyMMddHHmmss"); String numbers = RandomUtil.randomNumbers(5); String orderId = format+numbers; - ExamDateGoodVo examDateGoodVo = dateService.calcOrderAmount(); +// ExamDateGoodVo examDateGoodVo = dateService.calcOrderAmount(); Order order = new Order(); order.setOrderId(orderId); order.setOrderType("2"); - order.setAmount(examDateGoodVo != null ? examDateGoodVo.getAmount() : new BigDecimal(10)); + order.setAmount("2".equals(type) ? new BigDecimal(9.9) : new BigDecimal(19.9)); order.setUserId(LoginUtil.getAppUserId()); order.setRemark("会员充值"); diff --git a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java index e8cdb90..1a94921 100644 --- a/wechat/src/main/java/com/koronol/profile/service/ProfileService.java +++ b/wechat/src/main/java/com/koronol/profile/service/ProfileService.java @@ -9,6 +9,8 @@ import com.koronol.profile.vo.ProfileTokenVo; import io.geekidea.boot.framework.common.service.BaseService; import io.geekidea.boot.framework.core.pagination.Paging; +import java.math.BigDecimal; + /** * 用户信息 服务类 * @@ -73,5 +75,12 @@ public interface ProfileService extends BaseService { ProfileInfoVo getProfileInfo(Long id) throws Exception; - boolean renew(String userId) throws Exception; + /** + * 更新会员有效期 + * @param userId + * @param amount + * @return + * @throws Exception + */ + boolean renew(String userId, BigDecimal amount) throws Exception; } diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index 15880e2..ed7f28f 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -50,6 +50,7 @@ import org.springframework.beans.factory.annotation.Autowired; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; +import java.math.BigDecimal; import java.security.spec.AlgorithmParameterSpec; import java.time.Duration; import java.time.LocalDate; @@ -226,7 +227,7 @@ public class ProfileServiceImpl extends BaseServiceImpl profile.setPhone(phoneObj.getStr("phoneNumber")); } profile.setOpenId(openId); - profile.setNickName(""); // 设置个空的昵称 +// profile.setNickName(""); // 设置个空的昵称 ProfileTokenVo profileTokenVo = getProfileTokenVo(profile); @@ -245,14 +246,15 @@ public class ProfileServiceImpl extends BaseServiceImpl } @Override - public boolean renew(String userId) throws Exception { + public boolean renew(String userId, BigDecimal amount) throws Exception { Profile profile = profileMapper.selectById(userId); profile.setIsVip("1"); // 设置为会员 + Integer days = new BigDecimal(10).compareTo(BigDecimal.valueOf(amount.intValue())) == 1 ? 30 : 90; // 支付9.9元会员增加30天,其他则增加90天,暂时写死,后续增加配置 // 如果会员已过期,则设置从今天开始 +90天 if(profile.getValid() == null || LocalDate.now().isAfter(profile.getValid())) { - profile.setValid(LocalDate.now().plusDays(90)); + profile.setValid(LocalDate.now().plusDays(days)); // 从当天开始往后增加天数 } else { - profile.setValid(profile.getValid().plusDays(90));// 邀请新用户赠送7天会员 + profile.setValid(profile.getValid().plusDays(days));// 从会员过期时间往后增加天数 } return profileMapper.updateById(profile) > 0 ? true : false; diff --git a/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java b/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java index 9a850a8..c788349 100644 --- a/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java +++ b/wechat/src/main/java/com/koronol/wxpay/controller/WxPayController.java @@ -170,7 +170,7 @@ public class WxPayController extends AbstractWxPayApiController { order.setTradeNo(params.get("transaction_id")); // 微信支付订单号 order.setPayTime(new Date()); if (order.getOrderType().equals("2")) { - boolean flag = profileService.renew(order.getUserId()); + boolean flag = profileService.renew(order.getUserId(), order.getAmount()); } orderService.updateOrder(order); return WxPayKit.toXml(xml); @@ -212,9 +212,9 @@ public class WxPayController extends AbstractWxPayApiController { order.setStatus("2"); order.setTradeNo(result.get("transaction_id")); orderService.updateOrder(order); - // 如果是重置订单,则更新用户信息 + // 如果是充值订单,则更新用户信息 if (order.getOrderType().equals("2")) { - profileService.renew(order.getUserId()); + profileService.renew(order.getUserId(), order.getAmount()); } } // 返回成功信息 -- Gitee From 1c8933c07b1e04299f04e9998f68c0d82d924e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=8E=E5=85=89?= Date: Sun, 20 Jun 2021 21:35:09 +0800 Subject: [PATCH 36/36] =?UTF-8?q?[feat]=E7=94=A8=E6=88=B7=E8=80=83?= =?UTF-8?q?=E8=AF=95=E8=AE=B0=E5=BD=95=E5=A2=9E=E5=8A=A0=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/userPaper/param/UserPaperPageParam.java | 7 +++++++ .../userPaper/service/impl/UserPaperServiceImpl.java | 3 ++- .../main/resources/mapper/userPaper/UserPaperMapper.xml | 8 +++++++- .../java/com/koronol/profile/param/ProfilePageParam.java | 3 +++ .../koronol/profile/service/impl/ProfileServiceImpl.java | 3 +++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/example/src/main/java/com/example/userPaper/param/UserPaperPageParam.java b/example/src/main/java/com/example/userPaper/param/UserPaperPageParam.java index 9a70d26..d46e1fa 100644 --- a/example/src/main/java/com/example/userPaper/param/UserPaperPageParam.java +++ b/example/src/main/java/com/example/userPaper/param/UserPaperPageParam.java @@ -1,6 +1,7 @@ package com.example.userPaper.param; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -20,4 +21,10 @@ import io.geekidea.boot.framework.core.pagination.BasePageOrderParam; @ApiModel(value = "用户考试表分页参数") public class UserPaperPageParam extends BasePageOrderParam { private static final long serialVersionUID = 1L; + + @ApiModelProperty("昵称") + private String nickName; + + @ApiModelProperty("试卷id") + private Integer paperId; } diff --git a/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java b/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java index 4e1294c..979859c 100644 --- a/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java +++ b/example/src/main/java/com/example/userPaper/service/impl/UserPaperServiceImpl.java @@ -58,7 +58,8 @@ public class UserPaperServiceImpl extends BaseServiceImpl getUserPaperPageList(UserPaperPageParam userPaperPageParam) throws Exception { Page page = new PageInfo<>(userPaperPageParam, OrderItem.desc(getLambdaColumn(UserPaper::getCreatedTime))); - IPage iPage = userPaperMapper.selectUserPaperPage(page, userPaperPageParam, LoginUtil.getAppUserId()); + String appUserId = LoginUtil.getAppUserId(); + IPage iPage = userPaperMapper.selectUserPaperPage(page, userPaperPageParam, appUserId); return new Paging<>(iPage); } diff --git a/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml b/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml index f4b8fe9..1ba9901 100644 --- a/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml +++ b/example/src/main/resources/mapper/userPaper/UserPaperMapper.xml @@ -46,8 +46,14 @@ JOIN p_paper t2 ON t.PAPER_ID = t2.ID WHERE t.progress > 0 - + AND t.USER_ID = #{appUserId} + + and t1.NICK_NAME like concat('%', #{param.nickName} ,'%') + + + and t.PAPER_ID = #{param.paperId} + diff --git a/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java b/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java index 3002949..43bc8b4 100644 --- a/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java +++ b/wechat/src/main/java/com/koronol/profile/param/ProfilePageParam.java @@ -27,4 +27,7 @@ public class ProfilePageParam extends BasePageOrderParam { @ApiModelProperty("昵称") private String nickName; + + @ApiModelProperty("来源渠道") + private String channel; } diff --git a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java index ed7f28f..4be6763 100644 --- a/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java +++ b/wechat/src/main/java/com/koronol/profile/service/impl/ProfileServiceImpl.java @@ -127,6 +127,9 @@ public class ProfileServiceImpl extends BaseServiceImpl if(StrUtil.isNotEmpty(profilePageParam.getNickName())) { wrapper.like(Profile::getNickName, profilePageParam.getNickName()); } + if(StrUtil.isNotEmpty(profilePageParam.getChannel())) { + wrapper.eq(Profile::getChannel, profilePageParam.getChannel()); + } IPage iPage = profileMapper.selectPage(page, wrapper); return new Paging(iPage); } -- Gitee