From a8661d575236be9cf9944e6aa3be6ef1642a6adb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com>
Date: Thu, 16 Oct 2025 17:45:12 +0800
Subject: [PATCH] =?UTF-8?q?feat(core):=20=E5=88=9D=E5=A7=8B=E5=8C=96?=
=?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=9F=BA=E7=A1=80=E9=85=8D=E7=BD=AE=E4=B8=8E?=
=?UTF-8?q?=E6=A0=B8=E5=BF=83=E5=B7=A5=E5=85=B7=E7=B1=BB-=20=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0.gitignore=E6=96=87=E4=BB=B6=EF=BC=8C=E9=85=8D?=
=?UTF-8?q?=E7=BD=AE=E5=90=84=E7=B1=BBIDE=E5=92=8C=E7=B3=BB=E7=BB=9F?=
=?UTF-8?q?=E5=BF=BD=E7=95=A5=E8=A7=84=E5=88=99=20-=20=E6=96=B0=E5=A2=9EAI?=
=?UTF-8?q?=E8=81=8A=E5=A4=A9=E6=8E=A7=E5=88=B6=E5=99=A8=EF=BC=8C=E6=94=AF?=
=?UTF-8?q?=E6=8C=81WebSocket=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81=20-=20?=
=?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=94=AF=E4=BB=98=E5=AE=9D=E9=85=8D=E7=BD=AE?=
=?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=EF=BC=8C=E6=94=AF=E6=8C=81=E8=AF=81?=
=?UTF-8?q?=E4=B9=A6=E8=AE=A4=E8=AF=81=E6=94=AF=E4=BB=98=20-=20=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0=E9=98=BF=E9=87=8C=E4=BA=91=E7=AD=BE=E5=90=8D=E5=8F=91?=
=?UTF-8?q?=E9=80=81=E5=B7=A5=E5=85=B7=E7=B1=BB=20-=20=E5=88=9B=E5=BB=BA?=
=?UTF-8?q?=E7=BB=9F=E4=B8=80API=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C?=
=?UTF-8?q?=E5=B0=81=E8=A3=85=E7=B1=BB=20-=20=E9=85=8D=E7=BD=AE=E5=A4=9A?=
=?UTF-8?q?=E7=8E=AF=E5=A2=83application=E9=85=8D=E7=BD=AE=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=EF=BC=88dev/prod=EF=BC=89-=20=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2=E3=80=81=E6=96=87=E7=AB=A0?=
=?UTF-8?q?=E7=8A=B6=E6=80=81=E3=80=81=E4=BD=99=E9=A2=9D=E5=8F=98=E5=8A=A8?=
=?UTF-8?q?=E7=AD=89=E5=B8=B8=E9=87=8F=E5=AE=9A=E4=B9=89-=20=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0Controller=E5=9F=BA=E7=B1=BB=EF=BC=8C=E5=B0=81?=
=?UTF-8?q?=E8=A3=85=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E8=8E=B7=E5=8F=96?=
=?UTF-8?q?=E7=AD=89=E9=80=9A=E7=94=A8=E6=96=B9=E6=B3=95=20-=20=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8=E6=A8=A1?=
=?UTF-8?q?=E6=9D=BF=E6=96=87=E4=BB=B6=EF=BC=88add.config.ts.btl=E5=92=8Ca?=
=?UTF-8?q?dd.tsx.btl=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 44 +
README.md | 286 +++
pom.xml | 427 ++++
.../com/gxwebsoft/WebSoftApplication.java | 31 +
.../com/gxwebsoft/common/core/Constants.java | 93 +
.../core/config/BigDecimalDeserializer.java | 41 +
.../core/config/CertificateProperties.java | 213 ++
.../common/core/config/ConfigProperties.java | 105 +
.../core/config/HttpMessageConverter.java | 15 +
.../common/core/config/JacksonConfig.java | 26 +
.../config/LocalDateTimeDeserializer.java | 29 +
.../core/config/LocalDateTimeSerializer.java | 27 +
.../common/core/config/MqttProperties.java | 72 +
.../common/core/config/MybatisPlusConfig.java | 138 ++
.../core/config/RestTemplateConfig.java | 29 +
.../common/core/config/SpringContextUtil.java | 62 +
.../common/core/config/SwaggerConfig.java | 111 +
.../common/core/config/WebMvcConfig.java | 31 +
.../core/constants/AppUserConstants.java | 8 +
.../core/constants/ArticleConstants.java | 6 +
.../core/constants/BalanceConstants.java | 10 +
.../common/core/constants/BaseConstants.java | 5 +
.../common/core/constants/OrderConstants.java | 37 +
.../core/constants/PlatformConstants.java | 12 +
.../core/constants/ProfitConstants.java | 9 +
.../core/constants/QRCodeConstants.java | 10 +
.../common/core/constants/RedisConstants.java | 47 +
.../common/core/constants/TaskConstants.java | 22 +
.../core/constants/WebsiteConstants.java | 14 +
.../core/constants/WxOfficialConstants.java | 6 +
.../core/exception/BusinessException.java | 48 +
.../exception/GlobalExceptionHandler.java | 89 +
.../core/security/JwtAccessDeniedHandler.java | 29 +
.../security/JwtAuthenticationEntryPoint.java | 30 +
.../security/JwtAuthenticationFilter.java | 118 +
.../common/core/security/JwtSubject.java | 31 +
.../common/core/security/JwtUtil.java | 141 ++
.../common/core/security/SecurityConfig.java | 113 +
.../service/CertificateHealthService.java | 253 ++
.../core/service/CertificateService.java | 281 +++
.../EnvironmentAwarePaymentService.java | 143 ++
.../core/service/PaymentCacheService.java | 174 ++
.../common/core/utils/AliYunSender.java | 145 ++
.../common/core/utils/AlipayConfigUtil.java | 110 +
.../common/core/utils/CacheClient.java | 265 +++
.../common/core/utils/CertificateLoader.java | 230 ++
.../common/core/utils/CommonUtil.java | 321 +++
.../common/core/utils/DateTimeUtil.java | 93 +
.../core/utils/EncryptedQrCodeUtil.java | 433 ++++
.../common/core/utils/FileServerUtil.java | 401 ++++
.../common/core/utils/HttpUtils.java | 311 +++
.../common/core/utils/ImageUtil.java | 96 +
.../common/core/utils/JChardetFacadeUtil.java | 2025 +++++++++++++++++
.../gxwebsoft/common/core/utils/JSONUtil.java | 69 +
.../common/core/utils/MyQrCodeUtil.java | 85 +
.../common/core/utils/OpenOfficeUtil.java | 124 +
.../core/utils/QrCodeDecryptResult.java | 93 +
.../common/core/utils/RedisUtil.java | 279 +++
.../common/core/utils/SignCheckUtil.java | 197 ++
.../core/utils/WechatCertAutoConfig.java | 171 ++
.../utils/WechatPayCertificateDiagnostic.java | 314 +++
.../core/utils/WechatPayCertificateFixer.java | 312 +++
.../core/utils/WechatPayConfigChecker.java | 243 ++
.../core/utils/WechatPayConfigValidator.java | 223 ++
.../core/utils/WechatPayDiagnostic.java | 222 ++
.../common/core/utils/WechatPayUtils.java | 111 +
.../common/core/utils/WxNativeUtil.java | 20 +
.../common/core/utils/WxOfficialUtil.java | 106 +
.../gxwebsoft/common/core/utils/WxUtil.java | 132 ++
.../common/core/utils/WxWorkUtil.java | 134 ++
.../gxwebsoft/common/core/web/ApiResult.java | 87 +
.../common/core/web/BaseController.java | 333 +++
.../gxwebsoft/common/core/web/BaseParam.java | 98 +
.../gxwebsoft/common/core/web/BatchParam.java | 57 +
.../common/core/web/ExistenceParam.java | 96 +
.../gxwebsoft/common/core/web/PageParam.java | 343 +++
.../gxwebsoft/common/core/web/PageResult.java | 51 +
.../system/controller/AiController.java | 139 ++
.../system/controller/CacheController.java | 117 +
.../system/controller/DictController.java | 177 ++
.../system/controller/DictDataController.java | 124 +
.../controller/DictionaryController.java | 148 ++
.../controller/DictionaryDataController.java | 123 +
.../system/controller/DomainController.java | 127 ++
.../system/controller/EmailController.java | 48 +
.../controller/LoginRecordController.java | 55 +
.../system/controller/MainController.java | 314 +++
.../system/controller/MenuController.java | 145 ++
.../controller/OperationRecordController.java | 61 +
.../controller/OrganizationController.java | 130 ++
.../system/controller/PlugController.java | 161 ++
.../controller/RedisUtilController.java | 77 +
.../system/controller/RoleController.java | 144 ++
.../system/controller/RoleMenuController.java | 96 +
.../system/controller/SettingController.java | 178 ++
.../system/controller/TenantController.java | 158 ++
.../controller/UserCollectionController.java | 135 ++
.../system/controller/UserController.java | 401 ++++
.../system/controller/UserFileController.java | 158 ++
.../controller/UserRefereeController.java | 183 ++
.../common/system/dto/PaymentCacheDTO.java | 39 +
.../gxwebsoft/common/system/entity/Cache.java | 34 +
.../common/system/entity/ChatMessage.java | 48 +
.../common/system/entity/Company.java | 337 +++
.../common/system/entity/CompanyComment.java | 61 +
.../common/system/entity/CompanyContent.java | 44 +
.../common/system/entity/CompanyGit.java | 142 ++
.../system/entity/CompanyParameter.java | 57 +
.../common/system/entity/CompanyUrl.java | 66 +
.../gxwebsoft/common/system/entity/Dict.java | 60 +
.../common/system/entity/DictData.java | 66 +
.../common/system/entity/Dictionary.java | 59 +
.../common/system/entity/DictionaryData.java | 67 +
.../common/system/entity/Domain.java | 75 +
.../common/system/entity/EmailRecord.java | 59 +
.../common/system/entity/FileRecord.java | 94 +
.../common/system/entity/KVEntity.java | 56 +
.../common/system/entity/LoginRecord.java | 76 +
.../gxwebsoft/common/system/entity/Menu.java | 87 +
.../common/system/entity/OperationRecord.java | 98 +
.../common/system/entity/Organization.java | 92 +
.../common/system/entity/Payment.java | 100 +
.../gxwebsoft/common/system/entity/Plug.java | 144 ++
.../gxwebsoft/common/system/entity/Role.java | 56 +
.../common/system/entity/RoleMenu.java | 47 +
.../common/system/entity/Setting.java | 61 +
.../common/system/entity/Tenant.java | 78 +
.../gxwebsoft/common/system/entity/User.java | 310 +++
.../common/system/entity/UserBalanceLog.java | 87 +
.../common/system/entity/UserCollection.java | 45 +
.../common/system/entity/UserFile.java | 79 +
.../common/system/entity/UserInfo.java | 260 +++
.../common/system/entity/UserReferee.java | 59 +
.../common/system/entity/UserRole.java | 52 +
.../system/mapper/CompanyCommentMapper.java | 37 +
.../system/mapper/CompanyContentMapper.java | 37 +
.../system/mapper/CompanyGitMapper.java | 37 +
.../common/system/mapper/CompanyMapper.java | 62 +
.../system/mapper/CompanyParameterMapper.java | 37 +
.../system/mapper/CompanyUrlMapper.java | 37 +
.../common/system/mapper/DictDataMapper.java | 47 +
.../common/system/mapper/DictMapper.java | 14 +
.../system/mapper/DictionaryDataMapper.java | 47 +
.../system/mapper/DictionaryMapper.java | 14 +
.../common/system/mapper/DomainMapper.java | 37 +
.../system/mapper/EmailRecordMapper.java | 14 +
.../system/mapper/FileRecordMapper.java | 47 +
.../system/mapper/LoginRecordMapper.java | 48 +
.../common/system/mapper/MenuMapper.java | 22 +
.../system/mapper/OperationRecordMapper.java | 48 +
.../system/mapper/OrganizationMapper.java | 37 +
.../common/system/mapper/PaymentMapper.java | 40 +
.../common/system/mapper/PlugMapper.java | 42 +
.../common/system/mapper/RoleMapper.java | 14 +
.../common/system/mapper/RoleMenuMapper.java | 39 +
.../common/system/mapper/SettingMapper.java | 40 +
.../common/system/mapper/TenantMapper.java | 37 +
.../system/mapper/UserBalanceLogMapper.java | 37 +
.../system/mapper/UserCollectionMapper.java | 37 +
.../common/system/mapper/UserFileMapper.java | 14 +
.../common/system/mapper/UserMapper.java | 69 +
.../system/mapper/UserRefereeMapper.java | 37 +
.../common/system/mapper/UserRoleMapper.java | 45 +
.../mapper/xml/CompanyCommentMapper.xml | 53 +
.../mapper/xml/CompanyContentMapper.xml | 38 +
.../system/mapper/xml/CompanyGitMapper.xml | 65 +
.../system/mapper/xml/CompanyMapper.xml | 198 ++
.../mapper/xml/CompanyParameterMapper.xml | 50 +
.../system/mapper/xml/CompanyUrlMapper.xml | 59 +
.../system/mapper/xml/DictDataMapper.xml | 71 +
.../common/system/mapper/xml/DictMapper.xml | 5 +
.../mapper/xml/DictionaryDataMapper.xml | 71 +
.../system/mapper/xml/DictionaryMapper.xml | 5 +
.../common/system/mapper/xml/DomainMapper.xml | 62 +
.../system/mapper/xml/EmailRecordMapper.xml | 5 +
.../system/mapper/xml/FileRecordMapper.xml | 76 +
.../system/mapper/xml/LoginRecordMapper.xml | 62 +
.../common/system/mapper/xml/MenuMapper.xml | 32 +
.../mapper/xml/OperationRecordMapper.xml | 71 +
.../system/mapper/xml/OrganizationMapper.xml | 98 +
.../system/mapper/xml/PaymentMapper.xml | 90 +
.../common/system/mapper/xml/PlugMapper.xml | 105 +
.../common/system/mapper/xml/RoleMapper.xml | 5 +
.../system/mapper/xml/RoleMenuMapper.xml | 42 +
.../system/mapper/xml/SettingMapper.xml | 33 +
.../common/system/mapper/xml/TenantMapper.xml | 56 +
.../mapper/xml/UserCollectionMapper.xml | 38 +
.../system/mapper/xml/UserFileMapper.xml | 5 +
.../common/system/mapper/xml/UserMapper.xml | 264 +++
.../system/mapper/xml/UserRefereeMapper.xml | 50 +
.../system/mapper/xml/UserRoleMapper.xml | 35 +
.../common/system/param/AlipayParam.java | 31 +
.../common/system/param/CacheParam.java | 25 +
.../system/param/CompanyCommentParam.java | 58 +
.../system/param/CompanyContentParam.java | 35 +
.../common/system/param/CompanyGitParam.java | 60 +
.../common/system/param/CompanyParam.java | 167 ++
.../system/param/CompanyParameterParam.java | 50 +
.../common/system/param/CompanyUrlParam.java | 59 +
.../common/system/param/DictDataParam.java | 55 +
.../common/system/param/DictParam.java | 34 +
.../system/param/DictionaryDataParam.java | 55 +
.../common/system/param/DictionaryParam.java | 38 +
.../common/system/param/DomainParam.java | 61 +
.../common/system/param/FileRecordParam.java | 70 +
.../common/system/param/LoginParam.java | 37 +
.../common/system/param/LoginRecordParam.java | 60 +
.../common/system/param/MenuParam.java | 68 +
.../system/param/OperationRecordParam.java | 67 +
.../system/param/OrganizationParam.java | 81 +
.../common/system/param/PaymentParam.java | 81 +
.../common/system/param/PlugParam.java | 95 +
.../common/system/param/RoleParam.java | 41 +
.../common/system/param/SettingParam.java | 50 +
.../common/system/param/SmsCaptchaParam.java | 31 +
.../common/system/param/TenantParam.java | 55 +
.../system/param/UpdatePasswordParam.java | 31 +
.../system/param/UserBalanceLogParam.java | 77 +
.../system/param/UserCollectionParam.java | 37 +
.../common/system/param/UserFileParam.java | 40 +
.../common/system/param/UserImportParam.java | 42 +
.../common/system/param/UserParam.java | 249 ++
.../common/system/param/UserRefereeParam.java | 48 +
.../common/system/result/CaptchaResult.java | 30 +
.../common/system/result/LoginResult.java | 31 +
.../common/system/result/RedisResult.java | 34 +
.../system/result/SmsCaptchaResult.java | 26 +
.../system/service/CompanyCommentService.java | 42 +
.../system/service/CompanyContentService.java | 42 +
.../system/service/CompanyGitService.java | 42 +
.../service/CompanyParameterService.java | 42 +
.../common/system/service/CompanyService.java | 51 +
.../system/service/CompanyUrlService.java | 42 +
.../system/service/DictDataService.java | 52 +
.../common/system/service/DictService.java | 14 +
.../system/service/DictionaryDataService.java | 51 +
.../system/service/DictionaryService.java | 14 +
.../common/system/service/DomainService.java | 42 +
.../system/service/DomainServiceImpl.java | 46 +
.../system/service/EmailRecordService.java | 51 +
.../system/service/FileRecordService.java | 58 +
.../system/service/LoginRecordService.java | 54 +
.../common/system/service/MenuService.java | 18 +
.../service/OperationRecordService.java | 49 +
.../system/service/OrganizationService.java | 42 +
.../common/system/service/PaymentService.java | 43 +
.../common/system/service/PlugService.java | 44 +
.../system/service/RoleMenuService.java | 35 +
.../common/system/service/RoleService.java | 14 +
.../common/system/service/SettingService.java | 67 +
.../common/system/service/TenantService.java | 42 +
.../system/service/UserBalanceLogService.java | 42 +
.../system/service/UserCollectionService.java | 42 +
.../service/UserCollectionServiceImpl.java | 46 +
.../system/service/UserFileService.java | 14 +
.../system/service/UserRefereeService.java | 45 +
.../system/service/UserRoleService.java | 42 +
.../common/system/service/UserService.java | 122 +
.../impl/CompanyCommentServiceImpl.java | 47 +
.../impl/CompanyContentServiceImpl.java | 47 +
.../service/impl/CompanyGitServiceImpl.java | 47 +
.../impl/CompanyParameterServiceImpl.java | 47 +
.../service/impl/CompanyServiceImpl.java | 86 +
.../service/impl/CompanyUrlServiceImpl.java | 47 +
.../service/impl/DictDataServiceImpl.java | 52 +
.../system/service/impl/DictServiceImpl.java | 18 +
.../impl/DictionaryDataServiceImpl.java | 52 +
.../service/impl/DictionaryServiceImpl.java | 18 +
.../service/impl/EmailRecordServiceImpl.java | 99 +
.../service/impl/FileRecordServiceImpl.java | 63 +
.../service/impl/LoginRecordServiceImpl.java | 78 +
.../system/service/impl/MenuServiceImpl.java | 139 ++
.../impl/OperationRecordServiceImpl.java | 52 +
.../service/impl/OrganizationServiceImpl.java | 45 +
.../service/impl/PaymentServiceImpl.java | 52 +
.../system/service/impl/PlugServiceImpl.java | 112 +
.../service/impl/RoleMenuServiceImpl.java | 31 +
.../system/service/impl/RoleServiceImpl.java | 18 +
.../service/impl/SettingServiceImpl.java | 254 +++
.../service/impl/TenantServiceImpl.java | 46 +
.../impl/UserBalanceLogServiceImpl.java | 47 +
.../service/impl/UserFileServiceImpl.java | 18 +
.../service/impl/UserRefereeServiceImpl.java | 74 +
.../service/impl/UserRoleServiceImpl.java | 37 +
.../system/service/impl/UserServiceImpl.java | 247 ++
src/main/resources/application-dev.yml | 65 +
src/main/resources/application-prod.yml | 84 +
src/main/resources/application.yml | 236 ++
src/test/java/com/gxwebsoft/TestMain.java | 21 +
.../gxwebsoft/generator/ShopGenerator.java | 435 ++++
.../engine/BeetlTemplateEnginePlus.java | 50 +
.../generator/templates/add.config.ts.btl | 4 +
.../gxwebsoft/generator/templates/add.tsx.btl | 115 +
.../templates/columns.config.vue.btl | 47 +
.../templates/components.edit.vue.btl | 221 ++
.../templates/components.search.vue.btl | 42 +
.../generator/templates/controller.java.btl | 278 +++
.../generator/templates/entity.java.btl | 157 ++
.../generator/templates/index.config.ts.btl | 4 +
.../generator/templates/index.ts.btl | 105 +
.../generator/templates/index.ts.uniapp.btl | 101 +
.../generator/templates/index.tsx.btl | 171 ++
.../generator/templates/index.vue.btl | 242 ++
.../generator/templates/mapper.java.btl | 41 +
.../generator/templates/mapper.xml.btl | 100 +
.../generator/templates/model.ts.btl | 43 +
.../generator/templates/model.ts.uniapp.btl | 43 +
.../generator/templates/param.java.btl | 146 ++
.../generator/templates/service.java.btl | 55 +
.../generator/templates/serviceImpl.java.btl | 62 +
.../generator/templates/smart-columns.vue.btl | 89 +
.../templates/table-columns-config.js | 60 +
.../templates/table-with-column-settings.vue | 263 +++
313 files changed, 29669 insertions(+)
create mode 100644 .gitignore
create mode 100644 README.md
create mode 100644 pom.xml
create mode 100644 src/main/java/com/gxwebsoft/WebSoftApplication.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/Constants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/BigDecimalDeserializer.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/CertificateProperties.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/ConfigProperties.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/HttpMessageConverter.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/JacksonConfig.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/LocalDateTimeDeserializer.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/LocalDateTimeSerializer.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/MqttProperties.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/RestTemplateConfig.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/SpringContextUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/SwaggerConfig.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/config/WebMvcConfig.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/AppUserConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/ArticleConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/BalanceConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/BaseConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/OrderConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/PlatformConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/ProfitConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/QRCodeConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/RedisConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/TaskConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/WebsiteConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/constants/WxOfficialConstants.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/exception/BusinessException.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/exception/GlobalExceptionHandler.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/security/JwtAccessDeniedHandler.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/security/JwtAuthenticationEntryPoint.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/security/JwtAuthenticationFilter.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/security/JwtSubject.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/security/JwtUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/security/SecurityConfig.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/service/CertificateHealthService.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/service/CertificateService.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/service/EnvironmentAwarePaymentService.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/service/PaymentCacheService.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/AliYunSender.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/AlipayConfigUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/CacheClient.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/CertificateLoader.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/CommonUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/DateTimeUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/EncryptedQrCodeUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/FileServerUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/HttpUtils.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/ImageUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/JChardetFacadeUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/JSONUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/MyQrCodeUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/OpenOfficeUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/QrCodeDecryptResult.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/RedisUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/SignCheckUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WechatCertAutoConfig.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WechatPayCertificateDiagnostic.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WechatPayCertificateFixer.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WechatPayConfigChecker.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WechatPayConfigValidator.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WechatPayDiagnostic.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WechatPayUtils.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WxNativeUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WxOfficialUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WxUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/utils/WxWorkUtil.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/web/ApiResult.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/web/BaseController.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/web/BaseParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/web/BatchParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/web/ExistenceParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/web/PageParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/core/web/PageResult.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/AiController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/CacheController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/DictController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/DictDataController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/DictionaryController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/DictionaryDataController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/DomainController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/EmailController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/LoginRecordController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/MainController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/MenuController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/OperationRecordController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/OrganizationController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/PlugController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/RedisUtilController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/RoleController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/RoleMenuController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/SettingController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/TenantController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/UserCollectionController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/UserController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/UserFileController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/controller/UserRefereeController.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/dto/PaymentCacheDTO.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Cache.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/ChatMessage.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Company.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/CompanyComment.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/CompanyContent.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/CompanyGit.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/CompanyParameter.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/CompanyUrl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Dict.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/DictData.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Dictionary.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/DictionaryData.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Domain.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/EmailRecord.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/FileRecord.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/KVEntity.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/LoginRecord.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Menu.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/OperationRecord.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Organization.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Payment.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Plug.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Role.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/RoleMenu.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Setting.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/Tenant.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/User.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/UserBalanceLog.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/UserCollection.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/UserFile.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/UserInfo.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/UserReferee.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/entity/UserRole.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/CompanyCommentMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/CompanyContentMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/CompanyGitMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/CompanyMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/CompanyParameterMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/CompanyUrlMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/DictDataMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/DictMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/DictionaryDataMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/DictionaryMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/DomainMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/EmailRecordMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/FileRecordMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/LoginRecordMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/MenuMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/OperationRecordMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/OrganizationMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/PaymentMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/PlugMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/RoleMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/RoleMenuMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/SettingMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/TenantMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/UserBalanceLogMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/UserCollectionMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/UserFileMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/UserMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/UserRefereeMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/UserRoleMapper.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/CompanyCommentMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/CompanyContentMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/CompanyGitMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/CompanyMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/CompanyParameterMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/CompanyUrlMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/DictDataMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/DictMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/DictionaryDataMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/DictionaryMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/DomainMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/EmailRecordMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/FileRecordMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/LoginRecordMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/MenuMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/OperationRecordMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/OrganizationMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/PaymentMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/PlugMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/RoleMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/RoleMenuMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/SettingMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/TenantMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/UserCollectionMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/UserFileMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/UserRefereeMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/mapper/xml/UserRoleMapper.xml
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/AlipayParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/CacheParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/CompanyCommentParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/CompanyContentParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/CompanyGitParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/CompanyParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/CompanyParameterParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/CompanyUrlParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/DictDataParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/DictParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/DictionaryDataParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/DictionaryParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/DomainParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/FileRecordParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/LoginParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/LoginRecordParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/MenuParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/OperationRecordParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/OrganizationParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/PaymentParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/PlugParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/RoleParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/SettingParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/SmsCaptchaParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/TenantParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/UpdatePasswordParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/UserBalanceLogParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/UserCollectionParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/UserFileParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/UserImportParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/UserParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/param/UserRefereeParam.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/result/CaptchaResult.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/result/LoginResult.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/result/RedisResult.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/result/SmsCaptchaResult.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/CompanyCommentService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/CompanyContentService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/CompanyGitService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/CompanyParameterService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/CompanyService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/CompanyUrlService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/DictDataService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/DictService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/DictionaryDataService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/DictionaryService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/DomainService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/DomainServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/EmailRecordService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/FileRecordService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/LoginRecordService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/MenuService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/OperationRecordService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/OrganizationService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/PaymentService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/PlugService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/RoleMenuService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/RoleService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/SettingService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/TenantService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/UserBalanceLogService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/UserCollectionService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/UserCollectionServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/UserFileService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/UserRefereeService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/UserRoleService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/UserService.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/CompanyCommentServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/CompanyContentServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/CompanyGitServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/CompanyParameterServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/CompanyServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/CompanyUrlServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/DictDataServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/DictServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/DictionaryDataServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/DictionaryServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/EmailRecordServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/FileRecordServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/LoginRecordServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/MenuServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/OperationRecordServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/OrganizationServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/PaymentServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/PlugServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/RoleMenuServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/RoleServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/SettingServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/TenantServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/UserBalanceLogServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/UserFileServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/UserRefereeServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/UserRoleServiceImpl.java
create mode 100644 src/main/java/com/gxwebsoft/common/system/service/impl/UserServiceImpl.java
create mode 100644 src/main/resources/application-dev.yml
create mode 100644 src/main/resources/application-prod.yml
create mode 100644 src/main/resources/application.yml
create mode 100644 src/test/java/com/gxwebsoft/TestMain.java
create mode 100644 src/test/java/com/gxwebsoft/generator/ShopGenerator.java
create mode 100644 src/test/java/com/gxwebsoft/generator/engine/BeetlTemplateEnginePlus.java
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/add.config.ts.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/add.tsx.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/columns.config.vue.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/components.edit.vue.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/components.search.vue.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/controller.java.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/entity.java.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/index.config.ts.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/index.ts.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/index.ts.uniapp.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/index.tsx.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/index.vue.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/mapper.java.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/mapper.xml.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/model.ts.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/model.ts.uniapp.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/param.java.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/service.java.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/serviceImpl.java.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/smart-columns.vue.btl
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/table-columns-config.js
create mode 100644 src/test/java/com/gxwebsoft/generator/templates/table-with-column-settings.vue
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cda18ea
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,44 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
+/cert/
+/src/main/resources/dev/
+
+### macOS ###
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+/file/
+/websoft-modules.log
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ef5a814
--- /dev/null
+++ b/README.md
@@ -0,0 +1,286 @@
+
+
🚀 WebSoft API
+
基于 Spring Boot + MyBatis Plus 的企业级后端API服务
+
+
+
+
+
+
+
+
+
+
+
+## 📖 项目简介
+
+WebSoft API 是一个基于 **Spring Boot + MyBatis Plus** 构建的现代化企业级后端API服务,采用最新的Java技术栈:
+
+- **核心框架**:Spring Boot 2.5.4 + Spring Security + Spring AOP
+- **数据访问**:MyBatis Plus 3.4.3 + Druid 连接池
+- **数据库**:MySQL + Redis
+- **文档工具**:Swagger 3.0 + Knife4j
+- **工具库**:Hutool、Lombok、FastJSON
+
+
+
+## 项目演示
+| 后台管理系统 | https://mp.websoft.top |
+|--------|-------------------------------------------------------------------------------------------------------------------------------------|
+| 测试账号 | 13800010123,123456
+| 正式账号 | [立即注册](https://mp.websoft.top/register/?inviteCode=github) |
+| 关注公众号 |  |
+
+
+
+
+## 🛠️ 技术栈
+
+### 核心框架
+| 技术 | 版本 | 说明 |
+|------|------|------|
+| Java | 1.8+ | 编程语言 |
+| Spring Boot | 2.5.4 | 微服务框架 |
+| Spring Security | 5.5.x | 安全框架 |
+| MyBatis Plus | 3.4.3 | ORM框架 |
+| MySQL | 8.0+ | 关系型数据库 |
+| Redis | 6.0+ | 缓存数据库 |
+| Druid | 1.2.6 | 数据库连接池 |
+
+### 功能组件
+- **Swagger 3.0 + Knife4j** - API文档生成与测试
+- **JWT** - 用户认证与授权
+- **Hutool** - Java工具类库
+- **EasyPOI** - Excel文件处理
+- **阿里云OSS** - 对象存储服务
+- **微信支付/支付宝** - 支付集成
+- **Socket.IO** - 实时通信
+- **MQTT** - 物联网消息传输
+
+## 📋 环境要求
+
+### 基础环境
+- ☕ **Java 1.8+**
+- 🗄️ **MySQL 8.0+**
+- 🔴 **Redis 6.0+**
+- 📦 **Maven 3.6+**
+
+### 开发工具
+- **推荐**:IntelliJ IDEA / Eclipse
+- **插件**:Lombok Plugin、MyBatis Plugin
+
+## 🚀 快速开始
+
+### 1. 克隆项目
+```bash
+git clone https://github.com/websoft-top/mp-java.git
+cd mp-java
+```
+
+### 2. 数据库配置
+```sql
+-- 创建数据库
+CREATE DATABASE websoft_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+-- 导入数据库脚本(如果有的话)
+-- source /path/to/database.sql
+```
+
+### 3. 配置文件
+编辑 `src/main/resources/application-dev.yml` 文件,配置数据库连接:
+```yaml
+spring:
+ datasource:
+ url: jdbc:mysql://localhost:3306/websoft_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+ username: your_username
+ password: your_password
+ redis:
+ host: localhost
+ port: 6379
+ password: your_redis_password
+```
+
+### 4. 启动项目
+```bash
+# 使用 Maven 启动
+mvn spring-boot:run
+
+# 或者使用 IDE 直接运行 WebSoftApplication.java
+```
+
+访问 `http://localhost:9200` 即可看到API服务。
+
+### 5. API文档
+启动项目后,访问以下地址查看API文档:
+- Swagger UI: `http://localhost:9200/swagger-ui/index.html`
+- Knife4j: `http://localhost:9200/doc.html`
+
+## ⚙️ 配置说明
+
+### 数据库配置
+在 `application-dev.yml` 中配置数据库连接:
+```yaml
+spring:
+ datasource:
+ url: jdbc:mysql://localhost:3306/websoft_db
+ username: root
+ password: your_password
+ driver-class-name: com.mysql.cj.jdbc.Driver
+```
+
+### Redis配置
+```yaml
+spring:
+ redis:
+ host: localhost
+ port: 6379
+ password: your_redis_password
+ database: 0
+```
+
+### 阿里云OSS配置
+```yaml
+config:
+ endpoint: https://oss-cn-shenzhen.aliyuncs.com
+ accessKeyId: your_access_key_id
+ accessKeySecret: your_access_key_secret
+ bucketName: your_bucket_name
+ bucketDomain: https://your-domain.com
+```
+
+### 其他配置
+- **JWT密钥**:`config.token-key` 用于JWT令牌加密
+- **文件上传路径**:`config.upload-path` 本地文件存储路径
+- **邮件服务**:配置SMTP服务器用于发送邮件
+
+## 🎯 核心功能
+
+### 🔐 用户认证与授权
+- **JWT认证**:基于JSON Web Token的用户认证
+- **Spring Security**:完整的安全框架集成
+- **角色权限**:基于RBAC的权限控制
+- **图形验证码**:防止恶意登录
+
+### 📝 内容管理系统(CMS)
+- **文章管理**:支持富文本内容管理
+- **媒体文件**:图片/视频文件上传与管理
+- **分类管理**:内容分类与标签管理
+- **SEO优化**:搜索引擎优化支持
+
+### 🛒 电商系统
+- **商品管理**:商品信息、规格、库存管理
+- **订单系统**:完整的订单流程管理
+- **支付集成**:支持微信支付、支付宝
+- **物流跟踪**:快递100物流查询集成
+
+### 🔧 系统管理
+- **用户管理**:用户信息维护与管理
+- **系统配置**:动态配置管理
+- **日志监控**:系统操作日志记录
+- **数据备份**:数据库备份与恢复
+
+### 📊 数据分析
+- **统计报表**:业务数据统计分析
+- **图表展示**:数据可视化展示
+- **导出功能**:Excel数据导出
+- **实时监控**:系统性能监控
+
+## 🏗️ 项目结构
+
+```
+src/main/java/com/gxwebsoft/
+├── WebSoftApplication.java # 启动类
+├── cms/ # 内容管理模块
+│ ├── controller/ # 控制器层
+│ ├── service/ # 业务逻辑层
+│ ├── mapper/ # 数据访问层
+│ └── entity/ # 实体类
+├── shop/ # 商城模块
+│ ├── controller/
+│ ├── service/
+│ ├── mapper/
+│ └── entity/
+├── common/ # 公共模块
+│ ├── core/ # 核心配置
+│ ├── utils/ # 工具类
+│ └── exception/ # 异常处理
+└── resources/
+ ├── application.yml # 主配置文件
+ ├── application-dev.yml # 开发环境配置
+ └── application-prod.yml# 生产环境配置
+```
+
+## 🔧 开发规范
+
+### 代码结构
+- **Controller层**:处理HTTP请求,参数验证
+- **Service层**:业务逻辑处理,事务管理
+- **Mapper层**:数据访问,SQL映射
+- **Entity层**:数据实体,数据库表映射
+
+### 命名规范
+- **类名**:使用大驼峰命名法(PascalCase)
+- **方法名**:使用小驼峰命名法(camelCase)
+- **常量**:使用全大写,下划线分隔
+- **包名**:使用小写字母,点分隔
+
+## 📚 API文档
+
+项目集成了Swagger和Knife4j,提供完整的API文档:
+
+### 访问地址
+- **Swagger UI**: `http://localhost:9200/swagger-ui/index.html`
+- **Knife4j**: `http://localhost:9200/doc.html`
+
+### 主要接口模块
+- **用户认证**: `/api/auth/**` - 登录、注册、权限验证
+- **用户管理**: `/api/user/**` - 用户CRUD操作
+- **内容管理**: `/api/cms/**` - 文章、媒体文件管理
+- **商城管理**: `/api/shop/**` - 商品、订单管理
+- **系统管理**: `/api/system/**` - 系统配置、日志管理
+
+## 🚀 部署指南
+
+### 开发环境部署
+```bash
+# 1. 启动MySQL和Redis服务
+# 2. 创建数据库并导入初始数据
+# 3. 修改配置文件
+# 4. 启动应用
+mvn spring-boot:run
+```
+
+### 生产环境部署
+```bash
+# 1. 打包应用
+mvn clean package -Dmaven.test.skip=true
+
+# 2. 运行jar包
+java -jar target/com-gxwebsoft-modules-1.5.0.jar --spring.profiles.active=prod
+
+# 3. 使用Docker部署(可选)
+docker build -t websoft-api .
+docker run -d -p 9200:9200 websoft-api
+```
+
+## 🤝 贡献指南
+
+1. Fork 本仓库
+2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
+3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
+4. 推送到分支 (`git push origin feature/AmazingFeature`)
+5. 打开 Pull Request
+
+## 📄 许可证
+
+本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情
+
+## 📞 联系我们
+
+- 官网:https://websoft.top
+- 邮箱:170083662@qq.top
+- QQ群:479713884
+
+---
+
+⭐ 如果这个项目对您有帮助,请给我们一个星标!
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..c64a5b4
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,427 @@
+
+
+ 4.0.0
+
+ com.gxwebsoft
+ com-gxwebsoft-modules
+ 1.5.0
+
+ com-gxwebsoft-api
+ WebSoftApi project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.18
+
+
+
+
+ 17
+ UTF-8
+ UTF-8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+
+ com.mysql
+ mysql-connector-j
+ runtime
+
+
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.2.20
+
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.4.3.3
+
+
+
+
+ com.github.yulichang
+ mybatis-plus-join-boot-starter
+ 1.4.5
+
+
+
+
+ com.baomidou
+ mybatis-plus-generator
+ 3.4.1
+
+
+
+
+ cn.hutool
+ hutool-core
+ 5.8.25
+
+
+ cn.hutool
+ hutool-extra
+ 5.8.25
+
+
+ cn.hutool
+ hutool-http
+ 5.8.25
+
+
+ cn.hutool
+ hutool-crypto
+ 5.8.25
+
+
+
+
+ cn.afterturn
+ easypoi-base
+ 4.4.0
+
+
+
+
+ org.apache.tika
+ tika-core
+ 2.9.1
+
+
+
+
+ com.github.livesense
+ jodconverter-core
+ 1.0.5
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-mail
+
+
+
+
+ com.ibeetl
+ beetl
+ 3.15.10.RELEASE
+
+
+
+
+ org.springdoc
+ springdoc-openapi-ui
+ 1.7.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+
+ io.jsonwebtoken
+ jjwt-api
+ 0.11.5
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ 0.11.5
+ runtime
+
+
+ io.jsonwebtoken
+ jjwt-jackson
+ 0.11.5
+ runtime
+
+
+
+
+ com.github.whvcse
+ easy-captcha
+ 1.6.2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+
+ com.aliyun
+ aliyun-java-sdk-core
+ 4.4.3
+
+
+
+ com.alipay.sdk
+ alipay-sdk-java
+ 4.35.0.ALL
+
+
+
+ org.bouncycastle
+ bcprov-jdk18on
+ 1.77
+
+
+
+ commons-logging
+ commons-logging
+ 1.3.0
+
+
+
+ com.alibaba
+ fastjson
+ 2.0.43
+
+
+
+
+ com.google.zxing
+ core
+ 3.5.2
+
+
+
+ com.google.code.gson
+ gson
+ 2.10.1
+
+
+
+ com.vaadin.external.google
+ android-json
+ 0.0.20131108.vaadin1
+ compile
+
+
+
+
+ com.corundumstudio.socketio
+ netty-socketio
+ 2.0.2
+
+
+
+
+ com.github.wechatpay-apiv3
+ wechatpay-java
+ 0.2.17
+
+
+
+
+ org.springframework.integration
+ spring-integration-mqtt
+
+
+ org.eclipse.paho
+ org.eclipse.paho.client.mqttv3
+ 1.2.0
+
+
+
+ com.github.binarywang
+ weixin-java-miniapp
+ 4.6.0
+
+
+
+ com.github.binarywang
+ weixin-java-mp
+ 4.6.0
+
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.17.4
+
+
+
+ com.github.kuaidi100-api
+ sdk
+ 1.0.13
+
+
+
+
+ com.nuonuo
+ open-sdk
+ 1.0.5.2
+
+
+
+
+ com.github.xiaoymin
+ knife4j-openapi3-spring-boot-starter
+ 4.3.0
+
+
+
+ com.belerweb
+ pinyin4j
+ 2.5.1
+
+
+
+
+ com.aliyun
+ alimt20181012
+ 1.0.3
+
+
+ com.aliyun
+ tea-openapi
+ 0.2.5
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.12.0
+
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+ 3.1.8
+
+
+
+ com.freewayso
+ image-combiner
+ 2.6.9
+
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
+
+ com.aliyun
+ bailian20231229
+ 2.4.0
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*Mapper.xml
+
+
+
+ src/main/resources
+
+ **
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.project-lombok
+ lombok
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 17
+ 17
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ true
+
+
+
+
+
+
+
+ aliYunMaven
+ https://maven.aliyun.com/repository/public
+
+
+
+
diff --git a/src/main/java/com/gxwebsoft/WebSoftApplication.java b/src/main/java/com/gxwebsoft/WebSoftApplication.java
new file mode 100644
index 0000000..1a7fa35
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/WebSoftApplication.java
@@ -0,0 +1,31 @@
+package com.gxwebsoft;
+
+import com.gxwebsoft.common.core.config.ConfigProperties;
+import com.gxwebsoft.common.core.config.MqttProperties;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+
+/**
+ * 启动类
+ * Created by WebSoft on 2018-02-22 11:29:03
+ */
+@EnableAsync
+@EnableTransactionManagement
+@MapperScan("com.gxwebsoft.**.mapper")
+@EnableConfigurationProperties({ConfigProperties.class, MqttProperties.class})
+@SpringBootApplication
+@EnableScheduling
+@EnableWebSocket
+public class WebSoftApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(WebSoftApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/Constants.java b/src/main/java/com/gxwebsoft/common/core/Constants.java
new file mode 100644
index 0000000..be48387
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/Constants.java
@@ -0,0 +1,93 @@
+package com.gxwebsoft.common.core;
+
+/**
+ * 系统常量
+ * Created by WebSoft on 2019-10-29 15:55
+ */
+public class Constants {
+ /**
+ * 默认成功码
+ */
+ public static final int RESULT_OK_CODE = 0;
+
+ /**
+ * 默认失败码
+ */
+ public static final int RESULT_ERROR_CODE = 1;
+
+ /**
+ * 默认成功信息
+ */
+ public static final String RESULT_OK_MSG = "操作成功";
+
+ /**
+ * 默认失败信息
+ */
+ public static final String RESULT_ERROR_MSG = "操作失败";
+
+ /**
+ * 无权限错误码
+ */
+ public static final int UNAUTHORIZED_CODE = 403;
+
+ /**
+ * 无权限提示信息
+ */
+ public static final String UNAUTHORIZED_MSG = "没有访问权限";
+
+ /**
+ * 未认证错误码
+ */
+ public static final int UNAUTHENTICATED_CODE = 401;
+
+ /**
+ * 未认证提示信息
+ */
+ public static final String UNAUTHENTICATED_MSG = "请先登录";
+
+ /**
+ * 登录过期错误码
+ */
+ public static final int TOKEN_EXPIRED_CODE = 401;
+
+ /**
+ * 登录过期提示信息
+ */
+ public static final String TOKEN_EXPIRED_MSG = "登录已过期";
+
+ /**
+ * 非法token错误码
+ */
+ public static final int BAD_CREDENTIALS_CODE = 401;
+
+ /**
+ * 非法token提示信息
+ */
+ public static final String BAD_CREDENTIALS_MSG = "请退出重新登录";
+
+ /**
+ * 表示升序的值
+ */
+ public static final String ORDER_ASC_VALUE = "asc";
+
+ /**
+ * 表示降序的值
+ */
+ public static final String ORDER_DESC_VALUE = "desc";
+
+ /**
+ * token通过header传递的名称
+ */
+ public static final String TOKEN_HEADER_NAME = "Authorization";
+
+ /**
+ * token通过参数传递的名称
+ */
+ public static final String TOKEN_PARAM_NAME = "access_token";
+
+ /**
+ * token认证类型
+ */
+ public static final String TOKEN_TYPE = "Bearer";
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/BigDecimalDeserializer.java b/src/main/java/com/gxwebsoft/common/core/config/BigDecimalDeserializer.java
new file mode 100644
index 0000000..ed76d34
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/BigDecimalDeserializer.java
@@ -0,0 +1,41 @@
+package com.gxwebsoft.common.core.config;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+
+/**
+ * BigDecimal 自定义反序列化器
+ * 处理null值和空字符串,避免反序列化异常
+ *
+ * @author WebSoft
+ * @since 2025-01-15
+ */
+@Slf4j
+public class BigDecimalDeserializer extends JsonDeserializer {
+
+ @Override
+ public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+ String value = p.getValueAsString();
+
+ if (value == null || value.trim().isEmpty() || "null".equals(value)) {
+ return null;
+ }
+
+ try {
+ return new BigDecimal(value);
+ } catch (NumberFormatException e) {
+ log.warn("无法解析BigDecimal值: {}, 返回null", value);
+ return null;
+ }
+ }
+
+ @Override
+ public BigDecimal getNullValue(DeserializationContext ctxt) {
+ return null;
+ }
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/CertificateProperties.java b/src/main/java/com/gxwebsoft/common/core/config/CertificateProperties.java
new file mode 100644
index 0000000..d8cbb5e
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/CertificateProperties.java
@@ -0,0 +1,213 @@
+package com.gxwebsoft.common.core.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 证书配置属性类
+ * 支持开发环境从classpath加载证书,生产环境从Docker挂载卷加载证书
+ *
+ * @author 科技小王子
+ * @since 2024-07-26
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "certificate")
+public class CertificateProperties {
+
+ /**
+ * 证书加载模式
+ * CLASSPATH: 从classpath加载(开发环境)
+ * FILESYSTEM: 从文件系统加载(生产环境)
+ * VOLUME: 从Docker挂载卷加载(容器环境)
+ */
+ private LoadMode loadMode = LoadMode.CLASSPATH;
+
+ /**
+ * Docker挂载卷证书根路径
+ */
+ private String certRootPath = "/www/wwwroot/file.ws";
+
+ /**
+ * 开发环境证书路径前缀
+ */
+ private String devCertPath = "dev";
+
+ /**
+ * 微信支付证书配置
+ */
+ private WechatPayConfig wechatPay = new WechatPayConfig();
+
+ /**
+ * 支付宝证书配置
+ */
+ private AlipayConfig alipay = new AlipayConfig();
+
+ /**
+ * 证书加载模式枚举
+ */
+ public enum LoadMode {
+ CLASSPATH, // 从classpath加载
+ FILESYSTEM, // 从文件系统加载
+ VOLUME // 从Docker挂载卷加载
+ }
+
+ /**
+ * 微信支付证书配置
+ */
+ @Data
+ public static class WechatPayConfig {
+ /**
+ * 开发环境配置
+ */
+ private DevConfig dev = new DevConfig();
+
+ /**
+ * 生产环境基础路径
+ */
+ private String prodBasePath = "/file";
+
+ /**
+ * 微信支付证书目录名
+ */
+ private String certDir = "wechat";
+
+ @Data
+ public static class DevConfig {
+ /**
+ * APIv3密钥
+ */
+ private String apiV3Key;
+
+ /**
+ * 商户私钥证书文件名
+ */
+ private String privateKeyFile = "apiclient_key.pem";
+
+ /**
+ * 商户证书文件名
+ */
+ private String apiclientCertFile = "apiclient_cert.pem";
+
+ /**
+ * 微信支付平台证书文件名
+ */
+ private String wechatpayCertFile = "wechatpay_cert.pem";
+ }
+ }
+
+ /**
+ * 支付宝证书配置
+ */
+ @Data
+ public static class AlipayConfig {
+ /**
+ * 支付宝证书目录名
+ */
+ private String certDir = "alipay";
+
+ /**
+ * 应用私钥文件名
+ */
+ private String appPrivateKeyFile = "app_private_key.pem";
+
+ /**
+ * 应用公钥证书文件名
+ */
+ private String appCertPublicKeyFile = "appCertPublicKey.crt";
+
+ /**
+ * 支付宝公钥证书文件名
+ */
+ private String alipayCertPublicKeyFile = "alipayCertPublicKey.crt";
+
+ /**
+ * 支付宝根证书文件名
+ */
+ private String alipayRootCertFile = "alipayRootCert.crt";
+ }
+
+ /**
+ * 获取证书文件的完整路径
+ *
+ * @param certType 证书类型(wechat/alipay)
+ * @param fileName 文件名
+ * @return 完整路径
+ */
+ public String getCertificatePath(String certType, String fileName) {
+ switch (loadMode) {
+ case CLASSPATH:
+ return devCertPath + "/" + certType + "/" + fileName;
+ case FILESYSTEM:
+ return System.getProperty("user.dir") + "/certs/" + certType + "/" + fileName;
+ case VOLUME:
+ return certRootPath + "/" + certType + "/" + fileName;
+ default:
+ throw new IllegalArgumentException("不支持的证书加载模式: " + loadMode);
+ }
+ }
+
+ /**
+ * 获取微信支付证书路径
+ *
+ * @param fileName 文件名
+ * @return 完整路径
+ */
+ public String getWechatPayCertPath(String fileName) {
+ // 生产环境特殊处理:数据库中存储的路径需要拼接到 /file/ 目录下
+ if (loadMode == LoadMode.VOLUME) {
+ // 修复路径拼接逻辑:数据库中存储的路径如果已经包含 /file,则直接拼接
+ if (fileName.startsWith("/file/")) {
+ // 路径已经包含 /file/ 前缀,直接拼接到根路径
+ return certRootPath + fileName;
+ } else if (fileName.startsWith("file/")) {
+ // 路径包含 file/ 前缀,添加根路径和斜杠
+ return certRootPath + "/" + fileName;
+ } else {
+ // 路径不包含 file 前缀,添加完整的 /file/ 前缀
+ return certRootPath + "/file/" + fileName;
+ }
+ } else {
+ // 开发环境和文件系统模式使用原有逻辑
+ return getCertificatePath(wechatPay.getCertDir(), fileName);
+ }
+ }
+
+ /**
+ * 获取支付宝证书路径
+ *
+ * @param fileName 文件名
+ * @return 完整路径
+ */
+ public String getAlipayCertPath(String fileName) {
+ return getCertificatePath(alipay.getCertDir(), fileName);
+ }
+
+ /**
+ * 检查证书加载模式是否为classpath模式
+ *
+ * @return true if classpath mode
+ */
+ public boolean isClasspathMode() {
+ return LoadMode.CLASSPATH.equals(loadMode);
+ }
+
+ /**
+ * 检查证书加载模式是否为文件系统模式
+ *
+ * @return true if filesystem mode
+ */
+ public boolean isFilesystemMode() {
+ return LoadMode.FILESYSTEM.equals(loadMode);
+ }
+
+ /**
+ * 检查证书加载模式是否为挂载卷模式
+ *
+ * @return true if volume mode
+ */
+ public boolean isVolumeMode() {
+ return LoadMode.VOLUME.equals(loadMode);
+ }
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/ConfigProperties.java b/src/main/java/com/gxwebsoft/common/core/config/ConfigProperties.java
new file mode 100644
index 0000000..d500177
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/ConfigProperties.java
@@ -0,0 +1,105 @@
+package com.gxwebsoft.common.core.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 系统配置属性
+ *
+ * @author WebSoft
+ * @since 2021-08-30 17:58:16
+ */
+@Data
+@ConfigurationProperties(prefix = "config")
+public class ConfigProperties {
+ /**
+ * 文件上传磁盘位置
+ */
+ private Integer uploadLocation = 0;
+
+ /**
+ * 文件上传是否使用uuid命名
+ */
+ private Boolean uploadUuidName = true;
+
+ /**
+ * 文件上传生成缩略图的大小(kb)
+ */
+ private Integer thumbnailSize = 60;
+
+ /**
+ * OpenOffice的安装目录
+ */
+ private String openOfficeHome;
+
+ /**
+ * swagger扫描包
+ */
+ private String swaggerBasePackage;
+
+ /**
+ * swagger文档标题
+ */
+ private String swaggerTitle;
+
+ /**
+ * swagger文档描述
+ */
+ private String swaggerDescription;
+
+ /**
+ * swagger文档版本号
+ */
+ private String swaggerVersion;
+
+ /**
+ * swagger地址
+ */
+ private String swaggerHost;
+
+ /**
+ * token过期时间, 单位秒
+ */
+ private Long tokenExpireTime = 60 * 60 * 365 * 24L;
+
+ /**
+ * token快要过期自动刷新时间, 单位分钟
+ */
+ private int tokenRefreshTime = 30;
+
+ /**
+ * 生成token的密钥Key的base64字符
+ */
+ private String tokenKey;
+
+ /**
+ * 文件上传目录
+ */
+ private String uploadPath;
+
+ /**
+ * 本地文件上传目录(开发环境)
+ */
+ private String localUploadPath;
+
+ /**
+ * 文件服务器
+ */
+ private String fileServer;
+
+ /**
+ * 网关地址
+ */
+ private String serverUrl;
+
+ /**
+ * 阿里云存储 OSS
+ * Endpoint
+ */
+ private String endpoint;
+ private String accessKeyId;
+ private String accessKeySecret;
+ private String bucketName;
+ private String bucketDomain;
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/HttpMessageConverter.java b/src/main/java/com/gxwebsoft/common/core/config/HttpMessageConverter.java
new file mode 100644
index 0000000..6bae59d
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/HttpMessageConverter.java
@@ -0,0 +1,15 @@
+package com.gxwebsoft.common.core.config;
+
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class HttpMessageConverter extends MappingJackson2HttpMessageConverter {
+ public HttpMessageConverter(){
+ List mediaTypes = new ArrayList<>();
+ mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
+ setSupportedMediaTypes(mediaTypes);
+ }
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/JacksonConfig.java b/src/main/java/com/gxwebsoft/common/core/config/JacksonConfig.java
new file mode 100644
index 0000000..eebe6c5
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/JacksonConfig.java
@@ -0,0 +1,26 @@
+package com.gxwebsoft.common.core.config;
+
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Jackson配置类
+ * 确保JSR310模块被正确注册
+ *
+ * @author WebSoft
+ * @since 2025-01-12
+ */
+@Configuration
+public class JacksonConfig {
+
+ /**
+ * 确保JavaTimeModule被注册
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ public JavaTimeModule javaTimeModule() {
+ return new JavaTimeModule();
+ }
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/LocalDateTimeDeserializer.java b/src/main/java/com/gxwebsoft/common/core/config/LocalDateTimeDeserializer.java
new file mode 100644
index 0000000..52ddd0a
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/LocalDateTimeDeserializer.java
@@ -0,0 +1,29 @@
+package com.gxwebsoft.common.core.config;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * LocalDateTime自定义反序列化器
+ *
+ * @author WebSoft
+ * @since 2025-01-12
+ */
+public class LocalDateTimeDeserializer extends JsonDeserializer {
+
+ private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+ @Override
+ public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+ String value = p.getValueAsString();
+ if (value != null && !value.isEmpty()) {
+ return LocalDateTime.parse(value, FORMATTER);
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/LocalDateTimeSerializer.java b/src/main/java/com/gxwebsoft/common/core/config/LocalDateTimeSerializer.java
new file mode 100644
index 0000000..d3849e7
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/LocalDateTimeSerializer.java
@@ -0,0 +1,27 @@
+package com.gxwebsoft.common.core.config;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * LocalDateTime自定义序列化器
+ *
+ * @author WebSoft
+ * @since 2025-01-12
+ */
+public class LocalDateTimeSerializer extends JsonSerializer {
+
+ private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+ @Override
+ public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+ if (value != null) {
+ gen.writeString(value.format(FORMATTER));
+ }
+ }
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/MqttProperties.java b/src/main/java/com/gxwebsoft/common/core/config/MqttProperties.java
new file mode 100644
index 0000000..cfc882d
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/MqttProperties.java
@@ -0,0 +1,72 @@
+package com.gxwebsoft.common.core.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * MQTT配置属性
+ *
+ * @author 科技小王子
+ * @since 2025-07-02
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "mqtt")
+public class MqttProperties {
+
+ /**
+ * 是否启用MQTT服务
+ */
+ private boolean enabled = false;
+
+ /**
+ * MQTT服务器地址
+ */
+ private String host = "tcp://127.0.0.1:1883";
+
+ /**
+ * 用户名
+ */
+ private String username = "";
+
+ /**
+ * 密码
+ */
+ private String password = "";
+
+ /**
+ * 客户端ID前缀
+ */
+ private String clientIdPrefix = "mqtt_client_";
+
+ /**
+ * 订阅主题
+ */
+ private String topic = "/SW_GPS/#";
+
+ /**
+ * QoS等级
+ */
+ private int qos = 2;
+
+ /**
+ * 连接超时时间(秒)
+ */
+ private int connectionTimeout = 10;
+
+ /**
+ * 心跳间隔(秒)
+ */
+ private int keepAliveInterval = 20;
+
+ /**
+ * 是否自动重连
+ */
+ private boolean autoReconnect = true;
+
+ /**
+ * 是否清除会话
+ */
+ private boolean cleanSession = false;
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java b/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..b497f29
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java
@@ -0,0 +1,138 @@
+package com.gxwebsoft.common.core.config;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
+import com.gxwebsoft.common.core.utils.RedisUtil;
+import com.gxwebsoft.common.system.entity.User;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
+import net.sf.jsqlparser.expression.NullValue;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+/**
+ * MybatisPlus配置
+ *
+ * @author WebSoft
+ * @since 2018-02-22 11:29:28
+ */
+@Configuration
+public class MybatisPlusConfig {
+ @Resource
+ private RedisUtil redisUtil;
+
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+
+ // 多租户插件配置
+ TenantLineHandler tenantLineHandler = new TenantLineHandler() {
+ @Override
+ public Expression getTenantId() {
+ String tenantId = null;
+ try {
+ // 从Spring上下文获取当前请求
+ HttpServletRequest request = getCurrentRequest();
+ if (request != null) {
+ // 从请求头拿ID
+ tenantId = request.getHeader("tenantId");
+ if(tenantId != null){
+ return new LongValue(tenantId);
+ }
+ // 从域名拿ID
+ String Domain = request.getHeader("Domain");
+ if (StrUtil.isNotBlank(Domain)) {
+ String key = "Domain:" + Domain;
+ tenantId = redisUtil.get(key);
+ if(tenantId != null){
+ System.out.println("从域名拿TID = " + tenantId);
+ return new LongValue(tenantId);
+ }
+ }
+ }
+ } catch (Exception e) {
+ // 忽略异常,使用默认逻辑
+ }
+ return getLoginUserTenantId();
+ }
+
+ @Override
+ public boolean ignoreTable(String tableName) {
+
+ // 系统级别的表始终忽略租户隔离
+ return Arrays.asList(
+ "sys_tenant",
+ "sys_dictionary",
+ "sys_dictionary_data",
+ "apps_test_data",
+ "cms_lang"
+// "hjm_car",
+// "hjm_fence"
+// "cms_website"
+// "sys_user"
+// "cms_domain"
+// "shop_order_goods",
+// "shop_goods"
+// "shop_users",
+// "shop_order" // 移除shop_order,改为通过注解控制
+// "shop_order_info",
+// "booking_user_invoice"
+ ).contains(tableName);
+ }
+ };
+ TenantLineInnerInterceptor tenantLineInnerInterceptor = new TenantLineInnerInterceptor(tenantLineHandler);
+ interceptor.addInnerInterceptor(tenantLineInnerInterceptor);
+
+ // 分页插件配置
+ PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
+ paginationInnerInterceptor.setMaxLimit(2000L);
+ interceptor.addInnerInterceptor(paginationInnerInterceptor);
+
+ return interceptor;
+ }
+
+ /**
+ * 获取当前登录用户的租户id
+ *
+ * @return Integer
+ */
+ public Expression getLoginUserTenantId() {
+ try {
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ if (authentication != null) {
+ Object object = authentication.getPrincipal();
+ if (object instanceof User) {
+ return new LongValue(((User) object).getTenantId());
+ }
+ }
+ } catch (Exception e) {
+ System.out.println(e.getMessage());
+ }
+ return new NullValue();
+ }
+
+ /**
+ * 获取当前HTTP请求
+ */
+ private HttpServletRequest getCurrentRequest() {
+ try {
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+ return attributes != null ? attributes.getRequest() : null;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/RestTemplateConfig.java b/src/main/java/com/gxwebsoft/common/core/config/RestTemplateConfig.java
new file mode 100644
index 0000000..786798f
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/RestTemplateConfig.java
@@ -0,0 +1,29 @@
+package com.gxwebsoft.common.core.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+
+@Configuration
+public class RestTemplateConfig {
+
+ @Bean
+ public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
+ RestTemplate restTemplate = new RestTemplate(factory);
+ restTemplate.getMessageConverters().add(new HttpMessageConverter());
+ return restTemplate;
+ }
+ @Bean
+ public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
+ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+ // ms
+ factory.setReadTimeout(60000);
+ // ms
+ factory.setConnectTimeout(60000);
+
+ return factory;
+ }
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/SpringContextUtil.java b/src/main/java/com/gxwebsoft/common/core/config/SpringContextUtil.java
new file mode 100644
index 0000000..4e6d883
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/SpringContextUtil.java
@@ -0,0 +1,62 @@
+package com.gxwebsoft.common.core.config;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author ds
+ * @Date 2022-05-05
+ */
+@Component
+public class SpringContextUtil implements ApplicationContextAware {
+ /**
+ * spring的应用上下文
+ */
+ private static ApplicationContext applicationContext;
+
+ /**
+ * 初始化时将应用上下文设置进applicationContext
+ * @param applicationContext
+ * @throws BeansException
+ */
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ SpringContextUtil.applicationContext=applicationContext;
+ }
+
+ public static ApplicationContext getApplicationContext(){
+ return applicationContext;
+ }
+
+ /**
+ * 根据bean名称获取某个bean对象
+ *
+ * @param name bean名称
+ * @return Object
+ * @throws BeansException
+ */
+ public static Object getBean(String name) throws BeansException {
+ return applicationContext.getBean(name);
+ }
+
+ /**
+ * 根据bean的class获取某个bean对象
+ * @param beanClass
+ * @param
+ * @return
+ * @throws BeansException
+ */
+ public static T getBean(Class beanClass) throws BeansException {
+ return applicationContext.getBean(beanClass);
+ }
+
+ /**
+ * 获取spring.profiles.active
+ * @return
+ */
+ public static String getProfile(){
+ return getApplicationContext().getEnvironment().getActiveProfiles()[0];
+ }
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/SwaggerConfig.java b/src/main/java/com/gxwebsoft/common/core/config/SwaggerConfig.java
new file mode 100644
index 0000000..c63c2c7
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/SwaggerConfig.java
@@ -0,0 +1,111 @@
+package com.gxwebsoft.common.core.config;
+
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.security.SecurityRequirement;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import io.swagger.v3.oas.models.Components;
+import org.springdoc.core.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.Resource;
+
+/**
+ * SpringDoc OpenAPI 配置
+ *
+ * @author WebSoft
+ * @since 2018-02-22 11:29:05
+ */
+@Configuration
+public class SwaggerConfig {
+ @Resource
+ private ConfigProperties config;
+
+ /**
+ * 全局 OpenAPI 配置
+ */
+ @Bean
+ public OpenAPI customOpenAPI() {
+ return new OpenAPI()
+ .info(new Info()
+ .title(config.getSwaggerTitle())
+ .description(config.getSwaggerDescription())
+ .version(config.getSwaggerVersion())
+ .contact(new Contact()
+ .name("科技小王子")
+ .url("https://www.gxwebsoft.com")
+ .email("170083662@qq.com"))
+ .termsOfService(config.getServerUrl() + "/system"))
+ .components(new Components()
+ .addSecuritySchemes("Authorization",
+ new SecurityScheme()
+ .type(SecurityScheme.Type.HTTP)
+ .scheme("bearer")
+ .bearerFormat("JWT")
+ .name("Authorization")
+ .description("JWT Authorization header using the Bearer scheme")))
+ .addSecurityItem(new SecurityRequirement().addList("Authorization"));
+ }
+
+ /**
+ * Common 模块分组
+ */
+ @Bean
+ public GroupedOpenApi commonApi() {
+ return GroupedOpenApi.builder()
+ .group("common")
+ .pathsToMatch("/api/common/**", "/api/system/**", "/api/user/**", "/api/role/**", "/api/menu/**")
+ .packagesToScan("com.gxwebsoft.common")
+ .build();
+ }
+
+ /**
+ * CMS 模块分组
+ */
+ @Bean
+ public GroupedOpenApi cmsApi() {
+ return GroupedOpenApi.builder()
+ .group("cms")
+ .pathsToMatch("/api/cms/**")
+ .packagesToScan("com.gxwebsoft.cms")
+ .build();
+ }
+
+ /**
+ * Shop 模块分组
+ */
+ @Bean
+ public GroupedOpenApi shopApi() {
+ return GroupedOpenApi.builder()
+ .group("shop")
+ .pathsToMatch("/api/shop/**")
+ .packagesToScan("com.gxwebsoft.shop")
+ .build();
+ }
+
+ /**
+ * OA 模块分组
+ */
+ @Bean
+ public GroupedOpenApi oaApi() {
+ return GroupedOpenApi.builder()
+ .group("oa")
+ .pathsToMatch("/api/oa/**")
+ .packagesToScan("com.gxwebsoft.oa")
+ .build();
+ }
+
+ /**
+ * 其他模块分组
+ */
+ @Bean
+ public GroupedOpenApi otherApi() {
+ return GroupedOpenApi.builder()
+ .group("other")
+ .pathsToMatch("/api/docs/**", "/api/project/**", "/api/pwl/**", "/api/bszx/**", "/api/hjm/**")
+ .packagesToScan("com.gxwebsoft.docs", "com.gxwebsoft.project", "com.gxwebsoft.pwl", "com.gxwebsoft.bszx", "com.gxwebsoft.hjm")
+ .build();
+ }
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/config/WebMvcConfig.java b/src/main/java/com/gxwebsoft/common/core/config/WebMvcConfig.java
new file mode 100644
index 0000000..2ed9d8b
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/config/WebMvcConfig.java
@@ -0,0 +1,31 @@
+package com.gxwebsoft.common.core.config;
+
+import com.gxwebsoft.common.core.Constants;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * WebMvc配置, 拦截器、资源映射等都在此配置
+ *
+ * @author WebSoft
+ * @since 2019-06-12 10:11:16
+ */
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+ /**
+ * 支持跨域访问
+ */
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedOriginPatterns("*")
+ .allowedHeaders("*")
+ .exposedHeaders(Constants.TOKEN_HEADER_NAME)
+ .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH")
+ .allowCredentials(true)
+ .maxAge(3600);
+ }
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/AppUserConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/AppUserConstants.java
new file mode 100644
index 0000000..538e295
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/AppUserConstants.java
@@ -0,0 +1,8 @@
+package com.gxwebsoft.common.core.constants;
+
+public class AppUserConstants {
+ // 成员角色
+ public static final Integer TRIAL = 10; // 体验成员
+ public static final Integer DEVELOPER = 20; // 开发者
+ public static final Integer ADMINISTRATOR = 30; // 管理员
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/ArticleConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/ArticleConstants.java
new file mode 100644
index 0000000..62a38cc
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/ArticleConstants.java
@@ -0,0 +1,6 @@
+package com.gxwebsoft.common.core.constants;
+
+public class ArticleConstants extends BaseConstants {
+ public static final String[] ARTICLE_STATUS = {"已发布","待审核","已驳回","违规内容"};
+ public static final String CACHE_KEY_ARTICLE = "Article:";
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/BalanceConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/BalanceConstants.java
new file mode 100644
index 0000000..6857250
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/BalanceConstants.java
@@ -0,0 +1,10 @@
+package com.gxwebsoft.common.core.constants;
+
+public class BalanceConstants {
+ // 余额变动场景
+ public static final Integer BALANCE_RECHARGE = 10; // 用户充值
+ public static final Integer BALANCE_USE = 20; // 用户消费
+ public static final Integer BALANCE_RE_LET = 21; // 续租
+ public static final Integer BALANCE_ADMIN = 30; // 管理员操作
+ public static final Integer BALANCE_REFUND = 40; // 订单退款
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/BaseConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/BaseConstants.java
new file mode 100644
index 0000000..66cf4c0
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/BaseConstants.java
@@ -0,0 +1,5 @@
+package com.gxwebsoft.common.core.constants;
+
+public class BaseConstants {
+ public static final String[] STATUS = {"未定义","显示","隐藏"};
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/OrderConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/OrderConstants.java
new file mode 100644
index 0000000..e866654
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/OrderConstants.java
@@ -0,0 +1,37 @@
+package com.gxwebsoft.common.core.constants;
+
+public class OrderConstants {
+ // 支付方式
+ public static final String PAY_METHOD_BALANCE = "10"; // 余额支付
+ public static final String PAY_METHOD_WX = "20"; // 微信支付
+ public static final String PAY_METHOD_ALIPAY = "30"; // 支付宝支付
+ public static final String PAY_METHOD_OTHER = "40"; // 其他支付
+
+ // 付款状态
+ public static final Integer PAY_STATUS_NO_PAY = 10; // 未付款
+ public static final Integer PAY_STATUS_SUCCESS = 20; // 已付款
+
+ // 发货状态
+ public static final Integer DELIVERY_STATUS_NO = 10; // 未发货
+ public static final Integer DELIVERY_STATUS_YES = 20; // 已发货
+ public static final Integer DELIVERY_STATUS_30 = 30; // 部分发货
+
+ // 收货状态
+ public static final Integer RECEIPT_STATUS_NO = 10; // 未收货
+ public static final Integer RECEIPT_STATUS_YES = 20; // 已收货
+ public static final Integer RECEIPT_STATUS_RETURN = 30; // 已退货
+
+ // 订单状态
+ public static final Integer ORDER_STATUS_DOING = 10; // 进行中
+ public static final Integer ORDER_STATUS_CANCEL = 20; // 已取消
+ public static final Integer ORDER_STATUS_TO_CANCEL = 21; // 待取消
+ public static final Integer ORDER_STATUS_COMPLETED = 30; // 已完成
+
+ // 订单结算状态
+ public static final Integer ORDER_SETTLED_YES = 1; // 已结算
+ public static final Integer ORDER_SETTLED_NO = 0; // 未结算
+
+
+
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/PlatformConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/PlatformConstants.java
new file mode 100644
index 0000000..896f8e3
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/PlatformConstants.java
@@ -0,0 +1,12 @@
+package com.gxwebsoft.common.core.constants;
+
+public class PlatformConstants {
+ public static final String MP_OFFICIAL = "MP-OFFICIAL"; // 微信公众号
+ public static final String MP_WEIXIN = "MP-WEIXIN"; // 微信小程序
+ public static final String MP_ALIPAY = "MP-ALIPAY"; // 支付宝小程序
+ public static final String WEB = "WEB"; // web(同H5)
+ public static final String H5 = "H5"; // H5(推荐使用 WEB)
+ public static final String APP = "APP"; // App
+ public static final String MP_BAIDU = "MP-BAIDU"; // 百度小程序
+ public static final String MP_TOUTIAO = "MP-TOUTIAO"; // 百度小程序
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/ProfitConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/ProfitConstants.java
new file mode 100644
index 0000000..2cb60fd
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/ProfitConstants.java
@@ -0,0 +1,9 @@
+package com.gxwebsoft.common.core.constants;
+
+public class ProfitConstants {
+ // 收益类型
+ public static final Integer PROFIT_TYPE10 = 10; // 推广收益
+ public static final Integer PROFIT_TYPE20 = 20; // 团队收益
+ public static final Integer PROFIT_TYPE30 = 30; // 门店收益
+ public static final Integer PROFIT_TYPE40 = 30; // 区域收益
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/QRCodeConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/QRCodeConstants.java
new file mode 100644
index 0000000..1b30868
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/QRCodeConstants.java
@@ -0,0 +1,10 @@
+package com.gxwebsoft.common.core.constants;
+
+public class QRCodeConstants {
+ // 二维码类型
+ public static final String USER_QRCODE = "user"; // 用户二维码
+ public static final String TASK_QRCODE = "task"; // 工单二维码
+ public static final String ARTICLE_QRCODE = "article"; // 文章二维码
+ public static final String GOODS_QRCODE = "goods"; // 商品二维码
+ public static final String DIY_QRCODE = "diy"; // 工单二维码
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/RedisConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/RedisConstants.java
new file mode 100644
index 0000000..68d8fef
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/RedisConstants.java
@@ -0,0 +1,47 @@
+package com.gxwebsoft.common.core.constants;
+
+public class RedisConstants {
+ // 短信验证码Key
+ public static final String SMS_CODE_KEY = "sms";
+ // 验证码过期时间
+ public static final Long SMS_CODE_TTL = 5L;
+ // 微信凭证access-token
+ public static final String ACCESS_TOKEN_KEY = "access-token";
+ // 空值防止击穿数据库
+ public static final Long CACHE_NULL_TTL = 2L;
+ // 商户信息
+ public static final String MERCHANT_KEY = "merchant";
+ // 添加商户定位点
+ public static final String MERCHANT_GEO_KEY = "merchant-geo";
+
+ // token
+ public static final String TOKEN_USER_ID = "cache:token:";
+ // 排行榜
+ public static final String USER_RANKING_BY_APPS = "userRankingByApps";
+ // 搜索历史
+ public static final String SEARCH_HISTORY = "searchHistory";
+ // 租户系统设置信息
+ public static final String TEN_ANT_SETTING_KEY = "setting";
+ // 排行榜Key
+ public static final String USER_RANKING_BY_APPS_5 = "cache5:userRankingByApps";
+
+
+
+ // 扫码登录相关key
+ public static final String QR_LOGIN_TOKEN_KEY = "qr-login:token:"; // 扫码登录token前缀
+ public static final Long QR_LOGIN_TOKEN_TTL = 300L; // 扫码登录token过期时间(5分钟)
+ public static final String QR_LOGIN_STATUS_PENDING = "pending"; // 等待扫码
+ public static final String QR_LOGIN_STATUS_SCANNED = "scanned"; // 已扫码
+ public static final String QR_LOGIN_STATUS_CONFIRMED = "confirmed"; // 已确认
+ public static final String QR_LOGIN_STATUS_EXPIRED = "expired"; // 已过期
+
+ // 哗啦啦key
+ public static final String getAllShop = "allShop";
+ public static final String getBaseInfo = "baseInfo";
+ public static final String getFoodClassCategory = "foodCategory";
+ public static final String getOpenFood = "openFood";
+ public static final String haulalaGeoKey = "cache10:hualala-geo";
+ public static final String HLL_CART_KEY = "hll-cart"; // hll-cart[shopId]:[userId]
+ public static final String HLL_CART_FOOD_KEY = "hll-cart-list"; // hll-cart-list[shopId]:[userId]
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/TaskConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/TaskConstants.java
new file mode 100644
index 0000000..42cec5e
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/TaskConstants.java
@@ -0,0 +1,22 @@
+package com.gxwebsoft.common.core.constants;
+
+public class TaskConstants {
+ // 工单进度
+ public static final Integer TOBEARRANGED = 0; // 待安排
+ public static final Integer PENDING = 1; // 待处理
+ public static final Integer PROCESSING = 2; // 处理中
+ public static final Integer TOBECONFIRMED = 3; // 待评价
+ public static final Integer COMPLETED = 4; // 已完成
+ public static final Integer CLOSED = 5; // 已关闭
+
+ // 工单状态
+ public static final Integer TASK_STATUS_0 = 0; // 待处理
+ public static final Integer TASK_STATUS_1 = 1; // 已完成
+
+ // 操作类型
+ public static final String ACTION_1 = "派单";
+ public static final String ACTION_2 = "已解决";
+ public static final String ACTION_3 = "关单";
+ public static final String ACTION_4 = "分享";
+ public static final String ACTION_5 = "编辑";
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/WebsiteConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/WebsiteConstants.java
new file mode 100644
index 0000000..a49f4ba
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/WebsiteConstants.java
@@ -0,0 +1,14 @@
+package com.gxwebsoft.common.core.constants;
+
+public class WebsiteConstants extends BaseConstants {
+ // 运行状态 0未开通 1运行中 2维护中 3已关闭 4已欠费停机 5违规关停
+ public static final String[] WEBSITE_STATUS_NAME = {"未开通","运行中","维护中","已关闭","已欠费停机","违规关停"};
+ // 状态图标
+ public static final String[] WEBSITE_STATUS_ICON = {"error","success","warning","error","error","error"};
+ // 关闭原因
+ public static final String[] WEBSITE_STATUS_TEXT = {"产品未开通","","系统升级维护","","已欠费停机","违规关停"};
+ // 跳转地址
+ public static final String[] WEBSITE_STATUS_URL = {"https://websoft.top","","","","https://websoft.top/user","https://websoft.top/user"};
+ // 跳转按钮文字
+ public static final String[] WEBSITE_STATUS_BTN_TEXT = {"立即开通","","","","立即续费","申请解封"};
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/constants/WxOfficialConstants.java b/src/main/java/com/gxwebsoft/common/core/constants/WxOfficialConstants.java
new file mode 100644
index 0000000..a025610
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/constants/WxOfficialConstants.java
@@ -0,0 +1,6 @@
+package com.gxwebsoft.common.core.constants;
+
+public class WxOfficialConstants {
+ // 获取 Access token
+ public static final String GET_ACCESS_TOKEN_API = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/exception/BusinessException.java b/src/main/java/com/gxwebsoft/common/core/exception/BusinessException.java
new file mode 100644
index 0000000..8e10e82
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/exception/BusinessException.java
@@ -0,0 +1,48 @@
+package com.gxwebsoft.common.core.exception;
+
+import com.gxwebsoft.common.core.Constants;
+
+/**
+ * 自定义业务异常
+ *
+ * @author WebSoft
+ * @since 2018-02-22 11:29:28
+ */
+public class BusinessException extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ private Integer code;
+
+ public BusinessException() {
+ this(Constants.RESULT_ERROR_MSG);
+ }
+
+ public BusinessException(String message) {
+ this(Constants.RESULT_ERROR_CODE, message);
+ }
+
+ public BusinessException(Integer code, String message) {
+ super(message);
+ this.code = code;
+ }
+
+ public BusinessException(Integer code, String message, Throwable cause) {
+ super(message, cause);
+ this.code = code;
+ }
+
+ public BusinessException(Integer code, String message, Throwable cause,
+ boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ this.code = code;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/exception/GlobalExceptionHandler.java b/src/main/java/com/gxwebsoft/common/core/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..7fb4c8c
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/exception/GlobalExceptionHandler.java
@@ -0,0 +1,89 @@
+package com.gxwebsoft.common.core.exception;
+
+import com.gxwebsoft.common.core.Constants;
+import com.gxwebsoft.common.core.utils.CommonUtil;
+import com.gxwebsoft.common.core.web.ApiResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import java.util.Set;
+
+/**
+ * 全局异常处理器
+ *
+ * @author WebSoft
+ * @since 2018-02-22 11:29:30
+ */
+@ControllerAdvice
+public class GlobalExceptionHandler {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+
+ @ResponseBody
+ @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+ public ApiResult> methodNotSupportedExceptionHandler(HttpRequestMethodNotSupportedException e,
+ HttpServletResponse response) {
+ CommonUtil.addCrossHeaders(response);
+ return new ApiResult<>(Constants.RESULT_ERROR_CODE, "请求方式不正确").setError(e.toString());
+ }
+
+ @ResponseBody
+ @ExceptionHandler(AccessDeniedException.class)
+ public ApiResult> accessDeniedExceptionHandler(AccessDeniedException e, HttpServletResponse response) {
+ CommonUtil.addCrossHeaders(response);
+ return new ApiResult<>(Constants.UNAUTHORIZED_CODE, Constants.UNAUTHORIZED_MSG).setError(e.toString());
+ }
+
+ @ResponseBody
+ @ExceptionHandler(BusinessException.class)
+ public ApiResult> businessExceptionHandler(BusinessException e, HttpServletResponse response) {
+ CommonUtil.addCrossHeaders(response);
+ return new ApiResult<>(e.getCode(), e.getMessage());
+ }
+
+ @ResponseBody
+ @ExceptionHandler(MethodArgumentNotValidException.class)
+ public ApiResult> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e, HttpServletResponse response) {
+ CommonUtil.addCrossHeaders(response);
+ FieldError fieldError = e.getBindingResult().getFieldError();
+ String message = fieldError != null ? fieldError.getDefaultMessage() : "参数验证失败";
+ return new ApiResult<>(Constants.RESULT_ERROR_CODE, message);
+ }
+
+ @ResponseBody
+ @ExceptionHandler(BindException.class)
+ public ApiResult> bindExceptionHandler(BindException e, HttpServletResponse response) {
+ CommonUtil.addCrossHeaders(response);
+ FieldError fieldError = e.getBindingResult().getFieldError();
+ String message = fieldError != null ? fieldError.getDefaultMessage() : "参数绑定失败";
+ return new ApiResult<>(Constants.RESULT_ERROR_CODE, message);
+ }
+
+ @ResponseBody
+ @ExceptionHandler(ConstraintViolationException.class)
+ public ApiResult> constraintViolationExceptionHandler(ConstraintViolationException e, HttpServletResponse response) {
+ CommonUtil.addCrossHeaders(response);
+ Set> violations = e.getConstraintViolations();
+ String message = violations.isEmpty() ? "参数验证失败" : violations.iterator().next().getMessage();
+ return new ApiResult<>(Constants.RESULT_ERROR_CODE, message);
+ }
+
+ @ResponseBody
+ @ExceptionHandler(Throwable.class)
+ public ApiResult> exceptionHandler(Throwable e, HttpServletResponse response) {
+ logger.error(e.getMessage(), e);
+ CommonUtil.addCrossHeaders(response);
+ return new ApiResult<>(Constants.RESULT_ERROR_CODE, Constants.RESULT_ERROR_MSG).setError(e.toString());
+ }
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/security/JwtAccessDeniedHandler.java b/src/main/java/com/gxwebsoft/common/core/security/JwtAccessDeniedHandler.java
new file mode 100644
index 0000000..66acb5c
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/security/JwtAccessDeniedHandler.java
@@ -0,0 +1,29 @@
+package com.gxwebsoft.common.core.security;
+
+import com.gxwebsoft.common.core.Constants;
+import com.gxwebsoft.common.core.utils.CommonUtil;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 没有访问权限异常处理
+ *
+ * @author WebSoft
+ * @since 2020-03-25 00:35:03
+ */
+@Component
+public class JwtAccessDeniedHandler implements AccessDeniedHandler {
+
+ @Override
+ public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e)
+ throws IOException, ServletException {
+ CommonUtil.responseError(response, Constants.UNAUTHORIZED_CODE, Constants.UNAUTHORIZED_MSG, e.getMessage());
+ }
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/security/JwtAuthenticationEntryPoint.java b/src/main/java/com/gxwebsoft/common/core/security/JwtAuthenticationEntryPoint.java
new file mode 100644
index 0000000..3be2908
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/security/JwtAuthenticationEntryPoint.java
@@ -0,0 +1,30 @@
+package com.gxwebsoft.common.core.security;
+
+import com.gxwebsoft.common.core.Constants;
+import com.gxwebsoft.common.core.utils.CommonUtil;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 没有登录异常处理
+ *
+ * @author WebSoft
+ * @since 2020-03-25 00:35:03
+ */
+@Component
+public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
+
+ @Override
+ public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)
+ throws IOException, ServletException {
+// CommonUtil.responseError(response, Constants.UNAUTHENTICATED_CODE, Constants.UNAUTHENTICATED_MSG,
+// e.getMessage());
+ }
+
+}
diff --git a/src/main/java/com/gxwebsoft/common/core/security/JwtAuthenticationFilter.java b/src/main/java/com/gxwebsoft/common/core/security/JwtAuthenticationFilter.java
new file mode 100644
index 0000000..e910c6d
--- /dev/null
+++ b/src/main/java/com/gxwebsoft/common/core/security/JwtAuthenticationFilter.java
@@ -0,0 +1,118 @@
+package com.gxwebsoft.common.core.security;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSONObject;
+import com.gxwebsoft.common.core.Constants;
+import com.gxwebsoft.common.core.config.ConfigProperties;
+import com.gxwebsoft.common.core.utils.CommonUtil;
+import com.gxwebsoft.common.core.utils.JSONUtil;
+import com.gxwebsoft.common.core.utils.RedisUtil;
+import com.gxwebsoft.common.core.utils.SignCheckUtil;
+import com.gxwebsoft.common.system.entity.Menu;
+import com.gxwebsoft.common.system.entity.User;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.ExpiredJwtException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.annotation.Resource;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 处理携带token的请求过滤器
+ *
+ * @author WebSoft
+ * @since 2020-03-30 20:48:05
+ */
+@Component
+public class JwtAuthenticationFilter extends OncePerRequestFilter {
+ @Resource
+ private ConfigProperties configProperties;
+ @Value("${spring.profiles.active}")
+ String active;
+ @Resource
+ private RedisUtil redisUtil;
+ // 是否读取用户信息
+ public static Boolean isReadUserInfo = true;
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
+ throws ServletException, IOException {
+ String access_token = JwtUtil.getAccessToken(request);
+ if (StrUtil.isNotBlank(access_token)) {
+ try {
+ // 解析token
+ Claims claims = JwtUtil.parseToken(access_token, configProperties.getTokenKey());
+ JwtSubject jwtSubject = JwtUtil.getJwtSubject(claims);
+
+ // 请求主服务器获取用户信息
+ if (isReadUserInfo) {
+ HashMap map = new HashMap<>();
+ map.put("username", jwtSubject.getUsername());
+ map.put("tenantId", jwtSubject.getTenantId());
+ // 链式构建请求
+ String result = HttpRequest.post(configProperties.getServerUrl() + "/auth/user")
+ .header("Authorization", access_token)
+ .header("Tenantid", jwtSubject.getTenantId().toString())
+ .body(JSONUtil.toJSONString(map))//表单内容
+ .timeout(20000)//超时,毫秒
+ .execute().body();
+
+ // 校验服务器域名白名单
+ final SignCheckUtil checkUtil = new SignCheckUtil();
+ String key = "WhiteDomain:" + jwtSubject.getTenantId();
+ List whiteDomains = redisUtil.get(key, List.class);
+ // 生产环境
+ if (active.equals("prod") && !checkUtil.checkWhiteDomains(whiteDomains, request.getServerName())) {
+ throw new UsernameNotFoundException("The requested domain name is not on the whitelist");
+ }
+
+ JSONObject jsonObject = JSONObject.parseObject(result);
+ if(jsonObject.getString("code").equals("401")){
+ throw new UsernameNotFoundException("Username not found");
+ }
+ final String data = jsonObject.getString("data");
+ final User user = JSONObject.parseObject(data, User.class);
+ List