From fe27d9988794717008b9c1457d71d2c8d4798e15 Mon Sep 17 00:00:00 2001
From: hypersense <18659922013@163.com>
Date: Mon, 24 Mar 2025 14:08:00 +0000
Subject: [PATCH 1/5] Initial commit
---
.gitignore | 29 +-
hypersense-access/pom.xml | 24 ++
.../hypersense/HyperSenseApplication.java | 17 +
.../auth/enums/CaptchaTypeEnum.java | 27 ++
.../hypersense/auth/model/CaptchaInfo.java | 24 ++
.../hypersense/auth/service/AuthService.java | 63 ++++
.../src/main/resources/application-dev.yml | 245 +++++++++++++
.../src/main/resources/application-prod.yml | 221 ++++++++++++
.../src/main/resources/application.yml | 11 +
.../src/main/resources/banner.txt | 16 +
.../src/main/resources/logback-spring.xml | 64 ++++
.../hypersense-common-bom/pom.xml | 70 ++++
.../hypersense-common-core/pom.xml | 64 ++++
.../core/annotation/DataPermission.java | 27 ++
.../common/core/annotation/Debounce.java | 24 ++
.../common/core/annotation/Log.java | 49 +++
.../common/core/annotation/ValidField.java | 35 ++
.../common/core/aspect/DebounceAspect.java | 99 +++++
.../core/constant/JwtClaimConstants.java | 29 ++
.../common/core/constant/RedisConstants.java | 60 ++++
.../core/constant/SecurityConstants.java | 24 ++
.../common/core/constant/SystemConstants.java | 30 ++
.../common/core/domain/model/KValue.java | 22 ++
.../common/core/domain/model/Option.java | 53 +++
.../core/domain/model/base/BaseEntity.java | 49 +++
.../core/domain/model/base/BasePageQuery.java | 27 ++
.../common/core/domain/model/base/BaseVo.java | 21 ++
.../core/domain/result/ExcelResult.java | 44 +++
.../common/core/domain/result/PageResult.java | 46 +++
.../common/core/domain/result/Result.java | 76 ++++
.../core/domain/result/base/IResultCode.java | 14 +
.../common/core/enums/DataScopeEnum.java | 31 ++
.../hypersense/common/core/enums/EnvEnum.java | 27 ++
.../common/core/enums/LogModuleEnum.java | 33 ++
.../common/core/enums/RequestMethodEnum.java | 58 +++
.../common/core/enums/ResultCode.java | 290 +++++++++++++++
.../common/core/enums/StatusEnum.java | 28 ++
.../common/core/enums/base/IBaseEnum.java | 85 +++++
.../core/exception/BusinessException.java | 46 +++
.../handler/GlobalExceptionHandler.java | 267 ++++++++++++++
.../common/core/utils/DateUtils.java | 59 +++
.../common/core/utils/ExcelUtils.java | 19 +
.../hypersense/common/core/utils/IPUtils.java | 138 +++++++
.../common/core/utils/ResponseUtils.java | 80 +++++
.../common/core/validator/FieldValidator.java | 34 ++
.../hypersense-common-desensitize/pom.xml | 18 +
.../hypersense-common-ratelimiter/pom.xml | 13 +
.../hypersense-common-security/pom.xml | 13 +
.../security/config/SecurityConfig.java | 149 ++++++++
.../sms/SmsAuthenticationProvider.java | 79 ++++
.../hypersense-common-tenant/pom.xml | 13 +
.../hypersense-common-translation/pom.xml | 13 +
.../hypersense-common-web/pom.xml | 14 +
.../hypersense-common-websocket/pom.xml | 14 +
hypersense-common/pom.xml | 26 ++
hypersense-modules/hypersense-system/pom.xml | 18 +
.../hypersense/system/enums/DictCodeEnum.java | 27 ++
.../hypersense/system/enums/MenuTypeEnum.java | 33 ++
.../system/enums/NoticePublishStatusEnum.java | 30 ++
.../system/enums/NoticeTargetEnum.java | 29 ++
.../system/event/UserConnectionEvent.java | 37 ++
.../system/listener/UserImportListener.java | 13 +
.../system/mapper/ConfigMapper.java | 16 +
.../hypersense/system/mapper/DeptMapper.java | 25 ++
.../system/mapper/DictDataMapper.java | 24 ++
.../hypersense/system/mapper/DictMapper.java | 36 ++
.../hypersense/system/mapper/LogMapper.java | 54 +++
.../hypersense/system/mapper/MenuMapper.java | 26 ++
.../system/mapper/NoticeMapper.java | 37 ++
.../hypersense/system/mapper/RoleMapper.java | 26 ++
.../system/mapper/RoleMenuMapper.java | 41 +++
.../hypersense/system/mapper/UserMapper.java | 84 +++++
.../system/mapper/UserNoticeMapper.java | 28 ++
.../system/mapper/UserRoleMapper.java | 22 ++
.../hypersense/system/model/bo/NoticeBO.java | 76 ++++
.../system/model/bo/RolePermsBO.java | 26 ++
.../hypersense/system/model/bo/UserBO.java | 71 ++++
.../system/model/bo/VisitCount.java | 23 ++
.../system/model/bo/VisitStatsBO.java | 28 ++
.../system/model/dto/NoticeDTO.java | 29 ++
.../system/model/dto/UserAuthInfo.java | 59 +++
.../system/model/dto/UserExportDTO.java | 43 +++
.../system/model/dto/UserImportDTO.java | 37 ++
.../system/model/entity/Config.java | 57 +++
.../hypersense/system/model/entity/Dept.java | 64 ++++
.../hypersense/system/model/entity/Dict.java | 45 +++
.../system/model/entity/DictData.java | 53 +++
.../hypersense/system/model/entity/Log.java | 106 ++++++
.../hypersense/system/model/entity/Menu.java | 112 ++++++
.../system/model/entity/Notice.java | 88 +++++
.../system/model/entity/Project.java | 60 ++++
.../hypersense/system/model/entity/Role.java | 58 +++
.../system/model/entity/RoleMenu.java | 32 ++
.../hypersense/system/model/entity/User.java | 83 +++++
.../system/model/entity/UserNotice.java | 53 +++
.../system/model/entity/UserRole.java | 32 ++
.../system/model/form/ConfigForm.java | 41 +++
.../system/model/form/DeptForm.java | 40 +++
.../system/model/form/DictDataForm.java | 38 ++
.../system/model/form/DictForm.java | 33 ++
.../system/model/form/EmailUpdateForm.java | 25 ++
.../system/model/form/MenuForm.java | 67 ++++
.../system/model/form/MobileUpdateForm.java | 25 ++
.../system/model/form/NoticeForm.java | 55 +++
.../system/model/form/PasswordUpdateForm.java | 22 ++
.../system/model/form/RoleForm.java | 39 ++
.../system/model/form/UserForm.java | 62 ++++
.../system/model/form/UserProfileForm.java | 38 ++
.../system/model/query/ArchivesQuery.java | 26 ++
.../system/model/query/ConfigPageQuery.java | 21 ++
.../system/model/query/DeptQuery.java | 22 ++
.../system/model/query/DictDataPageQuery.java | 24 ++
.../system/model/query/DictPageQuery.java | 25 ++
.../system/model/query/LogPageQuery.java | 27 ++
.../system/model/query/MenuQuery.java | 22 ++
.../system/model/query/NoticePageQuery.java | 36 ++
.../system/model/query/RolePageQuery.java | 32 ++
.../system/model/query/UserPageQuery.java | 47 +++
.../hypersense/system/model/vo/ConfigVO.java | 35 ++
.../hypersense/system/model/vo/DeptVO.java | 49 +++
.../system/model/vo/DictDataPageVO.java | 40 +++
.../system/model/vo/DictPageVO.java | 30 ++
.../hypersense/system/model/vo/DictVO.java | 45 +++
.../hypersense/system/model/vo/LogPageVO.java | 59 +++
.../hypersense/system/model/vo/MenuVO.java | 60 ++++
.../system/model/vo/NoticeDetailVO.java | 43 +++
.../system/model/vo/NoticePageVO.java | 61 ++++
.../system/model/vo/RolePageVO.java | 39 ++
.../hypersense/system/model/vo/RouteVO.java | 64 ++++
.../system/model/vo/UserInfoVO.java | 36 ++
.../system/model/vo/UserNoticePageVO.java | 42 +++
.../system/model/vo/UserPageVO.java | 54 +++
.../system/model/vo/UserProfileVO.java | 50 +++
.../system/model/vo/VisitStatsVO.java | 39 ++
.../system/model/vo/VisitTrendVO.java | 29 ++
.../system/service/ConfigService.java | 68 ++++
.../system/service/DeptService.java | 65 ++++
.../system/service/DictDataService.java | 68 ++++
.../system/service/DictService.java | 68 ++++
.../hypersense/system/service/LogService.java | 41 +++
.../system/service/MenuService.java | 75 ++++
hypersense-modules/pom.xml | 15 +
.../hypersense-shared-bom/pom.xml | 40 +++
.../hypersense-shared-codegen/pom.xml | 13 +
.../hypersense-shared-oss/pom.xml | 13 +
.../hypersense-shared-redis/pom.xml | 13 +
.../hypersense-shared-wechat/pom.xml | 13 +
hypersense-shared/pom.xml | 22 ++
pom.xml | 339 ++++++++++++++++++
149 files changed, 7376 insertions(+), 11 deletions(-)
create mode 100644 hypersense-access/pom.xml
create mode 100644 hypersense-access/src/main/java/tech/hypersense/HyperSenseApplication.java
create mode 100644 hypersense-access/src/main/java/tech/hypersense/auth/enums/CaptchaTypeEnum.java
create mode 100644 hypersense-access/src/main/java/tech/hypersense/auth/model/CaptchaInfo.java
create mode 100644 hypersense-access/src/main/java/tech/hypersense/auth/service/AuthService.java
create mode 100644 hypersense-access/src/main/resources/application-dev.yml
create mode 100644 hypersense-access/src/main/resources/application-prod.yml
create mode 100644 hypersense-access/src/main/resources/application.yml
create mode 100644 hypersense-access/src/main/resources/banner.txt
create mode 100644 hypersense-access/src/main/resources/logback-spring.xml
create mode 100644 hypersense-common/hypersense-common-bom/pom.xml
create mode 100644 hypersense-common/hypersense-common-core/pom.xml
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/DataPermission.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/Debounce.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/Log.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/ValidField.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/aspect/DebounceAspect.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/JwtClaimConstants.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/RedisConstants.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/SecurityConstants.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/SystemConstants.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/KValue.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/Option.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/base/BaseEntity.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/base/BasePageQuery.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/base/BaseVo.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/result/ExcelResult.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/result/PageResult.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/result/Result.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/result/base/IResultCode.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/enums/DataScopeEnum.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/enums/EnvEnum.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/enums/LogModuleEnum.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/enums/RequestMethodEnum.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/enums/ResultCode.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/enums/StatusEnum.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/enums/base/IBaseEnum.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/exception/BusinessException.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/exception/handler/GlobalExceptionHandler.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/utils/DateUtils.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/utils/ExcelUtils.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/utils/IPUtils.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/utils/ResponseUtils.java
create mode 100644 hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/validator/FieldValidator.java
create mode 100644 hypersense-common/hypersense-common-desensitize/pom.xml
create mode 100644 hypersense-common/hypersense-common-ratelimiter/pom.xml
create mode 100644 hypersense-common/hypersense-common-security/pom.xml
create mode 100644 hypersense-common/hypersense-common-security/src/main/java/tech/hypersense/common/security/config/SecurityConfig.java
create mode 100644 hypersense-common/hypersense-common-security/src/main/java/tech/hypersense/common/security/extension/sms/SmsAuthenticationProvider.java
create mode 100644 hypersense-common/hypersense-common-tenant/pom.xml
create mode 100644 hypersense-common/hypersense-common-translation/pom.xml
create mode 100644 hypersense-common/hypersense-common-web/pom.xml
create mode 100644 hypersense-common/hypersense-common-websocket/pom.xml
create mode 100644 hypersense-common/pom.xml
create mode 100644 hypersense-modules/hypersense-system/pom.xml
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/enums/DictCodeEnum.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/enums/MenuTypeEnum.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/enums/NoticePublishStatusEnum.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/enums/NoticeTargetEnum.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/event/UserConnectionEvent.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/listener/UserImportListener.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/ConfigMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/DeptMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/DictDataMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/DictMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/LogMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/MenuMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/NoticeMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/RoleMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/RoleMenuMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/UserMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/UserNoticeMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/mapper/UserRoleMapper.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/bo/NoticeBO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/bo/RolePermsBO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/bo/UserBO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/bo/VisitCount.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/bo/VisitStatsBO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/dto/NoticeDTO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/dto/UserAuthInfo.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/dto/UserExportDTO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/dto/UserImportDTO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/Config.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/Dept.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/Dict.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/DictData.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/Log.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/Menu.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/Notice.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/Project.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/Role.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/RoleMenu.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/User.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/UserNotice.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/entity/UserRole.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/ConfigForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/DeptForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/DictDataForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/DictForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/EmailUpdateForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/MenuForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/MobileUpdateForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/NoticeForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/PasswordUpdateForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/RoleForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/UserForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/form/UserProfileForm.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/ArchivesQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/ConfigPageQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/DeptQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/DictDataPageQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/DictPageQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/LogPageQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/MenuQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/NoticePageQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/RolePageQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/query/UserPageQuery.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/ConfigVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/DeptVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/DictDataPageVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/DictPageVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/DictVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/LogPageVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/MenuVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/NoticeDetailVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/NoticePageVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/RolePageVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/RouteVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/UserInfoVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/UserNoticePageVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/UserPageVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/UserProfileVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/VisitStatsVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/model/vo/VisitTrendVO.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/service/ConfigService.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/service/DeptService.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/service/DictDataService.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/service/DictService.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/service/LogService.java
create mode 100644 hypersense-modules/hypersense-system/src/main/java/tech/hypersense/system/service/MenuService.java
create mode 100644 hypersense-modules/pom.xml
create mode 100644 hypersense-shared/hypersense-shared-bom/pom.xml
create mode 100644 hypersense-shared/hypersense-shared-codegen/pom.xml
create mode 100644 hypersense-shared/hypersense-shared-oss/pom.xml
create mode 100644 hypersense-shared/hypersense-shared-redis/pom.xml
create mode 100644 hypersense-shared/hypersense-shared-wechat/pom.xml
create mode 100644 hypersense-shared/pom.xml
create mode 100644 pom.xml
diff --git a/.gitignore b/.gitignore
index 0e13eeb..125a2c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,18 @@
-target/
-pom.xml.tag
-pom.xml.releaseBackup
-pom.xml.versionsBackup
-pom.xml.next
-release.properties
-dependency-reduced-pom.xml
-buildNumber.properties
-.mvn/timing.properties
-# https://github.com/takari/maven-wrapper#usage-without-binary-jar
-.mvn/wrapper/maven-wrapper.jar
+# Created by .ignore support plugin (hsz.mobi)
+### Example sysUserDetails template template
+### Example sysUserDetails template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+target
+*.log
+logs
+.history
+
+
+docker/*/data/
+docker/minio/config
+docker/xxljob/logs
\ No newline at end of file
diff --git a/hypersense-access/pom.xml b/hypersense-access/pom.xml
new file mode 100644
index 0000000..da22e56
--- /dev/null
+++ b/hypersense-access/pom.xml
@@ -0,0 +1,24 @@
+
+ 4.0.0
+
+ tech.hypersense
+ hypersense-template
+ ${revision}
+
+ hypersense-access
+
+ 应用服务入口
+
+
+
+
+
+ com.mysql
+ mysql-connector-j
+
+
+
+
+
+
diff --git a/hypersense-access/src/main/java/tech/hypersense/HyperSenseApplication.java b/hypersense-access/src/main/java/tech/hypersense/HyperSenseApplication.java
new file mode 100644
index 0000000..b6808e9
--- /dev/null
+++ b/hypersense-access/src/main/java/tech/hypersense/HyperSenseApplication.java
@@ -0,0 +1,17 @@
+package tech.hypersense;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+
+@SpringBootApplication
+public class HyperSenseApplication {
+
+ public static void main(String[] args) {
+ SpringApplication application = new SpringApplication(HyperSenseApplication.class);
+ application.setApplicationStartup(new BufferingApplicationStartup(2048));
+ application.run(args);
+ System.out.println("✌(>‿◠)✌ HyperSense start complete ✌≧◔◡◔≦✌");
+ }
+}
diff --git a/hypersense-access/src/main/java/tech/hypersense/auth/enums/CaptchaTypeEnum.java b/hypersense-access/src/main/java/tech/hypersense/auth/enums/CaptchaTypeEnum.java
new file mode 100644
index 0000000..da30e86
--- /dev/null
+++ b/hypersense-access/src/main/java/tech/hypersense/auth/enums/CaptchaTypeEnum.java
@@ -0,0 +1,27 @@
+package tech.hypersense.auth.enums;
+
+/**
+ * @Author: HyperSense
+ * @CreateTime: 2025-03-25
+ * @Description: 验证码类型枚举
+ * @Version: 1.0
+ */
+public enum CaptchaTypeEnum {
+
+ /**
+ * 圆圈干扰验证码
+ */
+ CIRCLE,
+ /**
+ * GIF验证码
+ */
+ GIF,
+ /**
+ * 干扰线验证码
+ */
+ LINE,
+ /**
+ * 扭曲干扰验证码
+ */
+ SHEAR
+}
diff --git a/hypersense-access/src/main/java/tech/hypersense/auth/model/CaptchaInfo.java b/hypersense-access/src/main/java/tech/hypersense/auth/model/CaptchaInfo.java
new file mode 100644
index 0000000..ad664af
--- /dev/null
+++ b/hypersense-access/src/main/java/tech/hypersense/auth/model/CaptchaInfo.java
@@ -0,0 +1,24 @@
+package tech.hypersense.auth.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @Author: HyperSense
+ * @CreateTime: 2025-03-25
+ * @Description: 验证码信息
+ * @Version: 1.0
+ */
+@Schema(description = "验证码信息")
+@Data
+@Builder
+public class CaptchaInfo {
+
+ @Schema(description = "验证码缓存 Key")
+ private String captchaKey;
+
+ @Schema(description = "验证码图片Base64字符串")
+ private String captchaBase64;
+
+}
\ No newline at end of file
diff --git a/hypersense-access/src/main/java/tech/hypersense/auth/service/AuthService.java b/hypersense-access/src/main/java/tech/hypersense/auth/service/AuthService.java
new file mode 100644
index 0000000..49367ad
--- /dev/null
+++ b/hypersense-access/src/main/java/tech/hypersense/auth/service/AuthService.java
@@ -0,0 +1,63 @@
+//package tech.hypersense.auth.service;
+//
+///**
+// * @Author: HyperSense
+// * @CreateTime: 2025-03-25
+// * @Description: 认证服务接口
+// * @Version: 1.0
+// */
+//public interface AuthService {
+//
+// /**
+// * 登录
+// *
+// * @param username 用户名
+// * @param password 密码
+// * @return 登录结果
+// */
+// AuthenticationToken login(String username, String password);
+//
+// /**
+// * 登出
+// */
+// void logout();
+//
+// /**
+// * 获取验证码
+// *
+// * @return 验证码
+// */
+// CaptchaInfo getCaptcha();
+//
+// /**
+// * 刷新令牌
+// *
+// * @param refreshToken 刷新令牌
+// * @return 登录结果
+// */
+// AuthenticationToken refreshToken(String refreshToken);
+//
+// /**
+// * 微信小程序登录
+// *
+// * @param code 微信登录code
+// * @return 登录结果
+// */
+// AuthenticationToken loginByWechat(String code);
+//
+// /**
+// * 发送短信验证码
+// *
+// * @param mobile 手机号
+// */
+// void sendSmsLoginCode(String mobile);
+//
+// /**
+// * 短信验证码登录
+// *
+// * @param mobile 手机号
+// * @param code 验证码
+// * @return 登录结果
+// */
+// AuthenticationToken loginBySms(String mobile, String code);
+//}
diff --git a/hypersense-access/src/main/resources/application-dev.yml b/hypersense-access/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..c44b774
--- /dev/null
+++ b/hypersense-access/src/main/resources/application-dev.yml
@@ -0,0 +1,245 @@
+server:
+ port: 8989
+
+spring:
+ datasource:
+ type: com.alibaba.druid.pool.DruidDataSource
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/hypersense_blog?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
+ username: hypersense
+ password: hypersense
+ data:
+ redis:
+ database: 0
+ host: localhost
+ port: 6379
+ # 如果Redis 服务未设置密码,需要将password删掉或注释,而不是设置为空字符串
+# password: 123456
+ timeout: 10s
+ lettuce:
+ pool:
+ # 连接池最大连接数 默认8 ,负数表示没有限制
+ max-active: 8
+ # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1
+ max-wait: -1
+ # 连接池中的最大空闲连接 默认8
+ max-idle: 8
+ # 连接池中的最小空闲连接 默认0
+ min-idle: 0
+ main:
+ # SpringAI
+ banner-mode: off
+ ai:
+ openai:
+ base-url: https://api.siliconflow.cn/
+ api-key: sk-syrjaznwkfypnbxhvyakplapeycsuqvbenoqhggslbnlbhec
+ chat:
+ options:
+ model: Qwen/Qwen2.5-14B-Instruct
+# anthropic:
+# api-key: #这里换成你的api-key
+ mcp:
+ server:
+ enabled: true
+ name: archives-management-server
+ version: 1.0.0
+ type: SYNC
+ sse-message-endpoint: /mcp/message
+ cache:
+ enabled: false
+ # 缓存类型 redis、none(不使用缓存)
+ type: redis
+ # 缓存时间(单位:ms)
+ redis:
+ time-to-live: 3600000
+ # 缓存null值,防止缓存穿透
+ cache-null-values: true
+ caffeine:
+ spec: initialCapacity=50,maximumSize=1000,expireAfterWrite=600s
+ # 邮件配置
+ mail:
+ host: smtp.hypersense.tech
+ port: 587
+ username: your-email@example.com
+ password: 123456
+ properties:
+ mail:
+ smtp:
+ auth: true
+ starttls:
+ enable: true
+ # 邮件发送者
+ from: hypersense@yeah.net
+
+mybatis-plus:
+ mapper-locations: classpath*:/mapper/**/*.xml
+ global-config:
+ db-config:
+ # 主键ID类型
+ id-type: none
+ # 逻辑删除对应的全局属性名(注意:须是对象属性名,不能是表字段名,如 isDeleted 而非 is_deleted,否则逻辑删除失效)
+ logic-delete-field: isDeleted
+ # 逻辑删除-删除值
+ logic-delete-value: 1
+ # 逻辑删除-未删除值
+ logic-not-delete-value: 0
+ configuration:
+ # 驼峰下划线转换
+ map-underscore-to-camel-case: true
+ # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+# 安全配置
+security:
+ session:
+ type: jwt # 会话方式 [jwt|redis-token]
+ access-token-time-to-live: 3600 # 访问令牌 有效期(单位:秒),默认 1 小时,-1 表示永不过期
+ refresh-token-time-to-live: 604800 # 刷新令牌有效期(单位:秒),默认 7 天,-1 表示永不过期
+ jwt:
+ secret-key: SecretKey012345678901234567890123456789012345678901234567890123456789 # JWT密钥(HS256算法至少32字符)
+ redis-token:
+ allow-multi-login: false # 是否允许多设备登录
+ # 安全白名单路径(完全绕过安全过滤器)
+ ignore-urls:
+ - /api/v1/auth/login/** # 登录接口(账号密码登录、手机验证码登录和微信登录)
+ - /api/v1/auth/captcha # 验证码获取接口
+ - /api/v1/auth/refresh-token # 刷新令牌接口
+ - /ws/** # WebSocket接口
+ - /api/v1/blog/** # 博客查询展示页
+ - /api/chatbot
+ # 非安全端点路径(允许匿名访问的API)
+ unsecured-urls:
+ - ${springdoc.swagger-ui.path}
+ - /doc.html
+ - /swagger-ui/**
+ - /v3/api-docs/**
+ - /webjars/**
+ - /api/v1/blog/** # 博客查询展示页
+ - /api/chatbot
+
+# 文件存储配置
+oss:
+ # OSS 类型 (目前支持aliyun、minio、local)
+ type: minio
+ # MinIO 对象存储服务
+ minio:
+ # MinIO 服务地址
+ endpoint: http://150.158.18.177:9000
+ # 访问凭据
+ access-key: BWyx1QgREOYrIAw6SC3K
+ # 凭据密钥
+ secret-key: WeYdHxzDS4DksBBAjJXVcq8ns9eaTYyxsxWIJt15
+ # 存储桶名称
+ bucket-name: archives
+ # (可选) 自定义域名:配置后,文件 URL 会使用该域名格式
+ custom-domain:
+ # 阿里云OSS对象存储服务
+ aliyun:
+ # 服务Endpoint
+ endpoint: oss-cn-hangzhou.aliyuncs.com
+ # 访问凭据`
+ access-key-id: your-access-key-id
+ # 凭据密钥
+ access-key-secret: your-access-key-secret
+ # 存储桶名称
+ bucket-name: default
+ # 本地存储
+ local:
+ # 文件存储路径 请注意下,mac用户请使用 /Users/your-username/your-path/,否则会有权限问题,windows用户请使用 D:/your-path/
+ storage-path: /Users/theo/home/
+# 短信配置
+sms:
+ # 阿里云短信
+ aliyun:
+ accessKeyId: LTAI5tSMgfxxxxxxdiBJLyR
+ accessKeySecret: SoOWRqpjtS7xxxxxxZ2PZiMTJOVC
+ domain: dysmsapi.aliyuncs.com
+ regionId: cn-shanghai
+ signName: 氦闪技术
+ templates:
+ # 注册短信验证码模板
+ register: SMS_22xxx771
+ # 登录短信验证码模板
+ login: SMS_22xxx772
+ # 修改手机号短信验证码模板
+ change-mobile: SMS_22xxx773
+
+# springdoc配置: https://springdoc.org/properties.html
+springdoc:
+ swagger-ui:
+ path: /swagger-ui.html
+ operations-sorter: alpha
+ tags-sorter: alpha
+ api-docs:
+ path: /v3/api-docs
+ group-configs:
+ - group: '系统管理'
+ paths-to-match: "/**"
+ packages-to-scan:
+ - com.hypersense.boot.system.controller
+ - com.hypersense.boot.shared.auth.controller
+ - com.hypersense.boot.shared.file.controller
+ - com.hypersense.boot.shared.codegen.controller
+ default-flat-param-object: true
+
+# knife4j 接口文档配置
+knife4j:
+ # 是否开启 Knife4j 增强功能
+ enable: true # 设置为 true 表示开启增强功能
+ # 生产环境配置
+ production: false # 设置为 true 表示在生产环境中不显示文档,为 false 表示显示文档(通常在开发环境中使用)
+ setting:
+ language: zh_cn
+
+# xxl-job 定时任务配置
+xxl:
+ job:
+ # 定时任务开关
+ enabled: false
+ admin:
+ # 调度中心地址,多个逗号分隔
+ addresses: http://150.158.18.177:8080/xxl-job-admin
+ accessToken: default_token
+ # 执行器配置
+ executor:
+ appname: xxl-job-executor-${spring.application.name} # 执行器AppName
+ address: # 执行器注册地址,默认为空,多网卡时可手动设置
+ ip: # 执行器IP,默认为空,多网卡时可手动设置
+ port: 9999 # 执行器通讯端口
+ logpath: /data/applogs/xxl-job/jobhandler # 任务运行日志文件存储磁盘路径
+ logretentiondays: 30 # 日志保存天数,值大于3时生效
+
+# 验证码配置
+captcha:
+ # 验证码类型 circle-圆圈干扰验证码|gif-Gif验证码|line-干扰线验证码|shear-扭曲干扰验证码
+ type: circle
+ # 验证码宽度
+ width: 120
+ # 验证码高度
+ height: 40
+ # 验证码干扰元素个数
+ interfere-count: 2
+ # 文本透明度(0.0-1.0)
+ text-alpha: 0.8
+ # 验证码字符配置
+ code:
+ # 验证码字符类型 math-算术|random-随机字符
+ type: math
+ # 验证码字符长度,type=算术时,表示运算位数(1:个位数运算 2:十位数运算);type=随机字符时,表示字符个数
+ length: 1
+ # 验证码字体
+ font:
+ # 字体名称 Dialog|DialogInput|Monospaced|Serif|SansSerif
+ name: SansSerif
+ # 字体样式 0-普通|1-粗体|2-斜体
+ weight: 1
+ # 字体大小
+ size: 24
+ # 验证码有效期(秒)
+ expire-seconds: 120
+
+# 微信小程配置
+wx:
+ miniapp:
+ app-id: xxxxxx
+ app-secret: xxxxxx
diff --git a/hypersense-access/src/main/resources/application-prod.yml b/hypersense-access/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..b2ce9cd
--- /dev/null
+++ b/hypersense-access/src/main/resources/application-prod.yml
@@ -0,0 +1,221 @@
+server:
+ port: 8989
+
+spring:
+ datasource:
+ type: com.alibaba.druid.pool.DruidDataSource
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://150.158.18.177:3306/hypersense_blog?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
+ username: root
+ password: 123456
+ data:
+ redis:
+ database: 11
+ host: 150.158.18.177
+ port: 6379
+ password: 123456
+ timeout: 10s
+ lettuce:
+ pool:
+ # 连接池最大连接数 默认8 ,负数表示没有限制
+ max-active: 8
+ # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1
+ max-wait: -1
+ # 连接池中的最大空闲连接 默认8
+ max-idle: 8
+ # 连接池中的最小空闲连接 默认0
+ min-idle: 0
+ cache:
+ enabled: false
+ # 缓存类型 redis、none(不使用缓存)
+ type: redis
+ # 缓存时间(单位:ms)
+ redis:
+ time-to-live: 3600000
+ # 缓存null值,防止缓存穿透
+ cache-null-values: true
+ caffeine:
+ spec: initialCapacity=50,maximumSize=1000,expireAfterWrite=600s
+ # 邮件配置
+ mail:
+ host: smtp.youlai.tech
+ port: 587
+ username: your-email@example.com
+ password: 123456
+ properties:
+ mail:
+ smtp:
+ auth: true
+ starttls:
+ enable: true
+ # 邮件发送者
+ from: youlaitech@163.com
+mybatis-plus:
+ mapper-locations: classpath*:/mapper/**/*.xml
+ global-config:
+ db-config:
+ # 主键ID类型
+ id-type: none
+ # 逻辑删除对应的全局属性名(注意:须是对象属性名,不能是表字段名,如 isDeleted 而非 is_deleted,否则逻辑删除失效)
+ logic-delete-field: isDeleted
+ # 逻辑删除-删除值
+ logic-delete-value: 1
+ # 逻辑删除-未删除值
+ logic-not-delete-value: 0
+ configuration:
+ # 驼峰下划线转换
+ map-underscore-to-camel-case: true
+ # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+# 安全配置
+security:
+ session:
+ type: jwt # 会话方式 [jwt|redis-token]
+ access-token-time-to-live: 3600 # 访问令牌 有效期(单位:秒),默认 1 小时,-1 表示永不过期
+ refresh-token-time-to-live: 604800 # 刷新令牌有效期(单位:秒),默认 7 天,-1 表示永不过期
+ jwt:
+ secret-key: SecretKey012345678901234567890123456789012345678901234567890123456789 # JWT密钥(HS256算法至少32字符)
+ redis-token:
+ allow-multi-login: true # 是否允许多设备登录
+ # 安全白名单路径(完全绕过安全过滤器)
+ ignore-urls:
+ - /api/v1/auth/login/** # 登录接口(账号密码登录、手机验证码登录和微信登录)
+ - /api/v1/auth/captcha # 验证码获取接口
+ - /api/v1/auth/refresh-token # 刷新令牌接口
+ - /ws/** # WebSocket接口
+ - /api/v1/blog/** # 博客查询展示页
+ # 非安全端点路径(允许匿名访问的API)
+ unsecured-urls:
+ - ${springdoc.swagger-ui.path}
+ - /doc.html
+ - /swagger-ui/**
+ - /v3/api-docs/**
+ - /webjars/**
+ - /api/v1/blog/** # 博客查询展示页
+
+# 文件存储配置
+oss:
+ # OSS 类型 (目前支持aliyun、minio)
+ type: minio
+ # MinIO 对象存储服务
+ minio:
+ # 服务Endpoint
+ endpoint: http://150.158.18.177:9000
+ # 访问凭据
+ access-key: 69Vj5mYhO6W85n2hqwCc
+ # 凭据密钥
+ secret-key: 9bBEo5vKtaxFyfEVL7LbwamhKCwG9KNKhkGuQDL0
+ # 存储桶名称
+ bucket-name: hypersenseblog
+ # (可选)自定义域名,如果配置了域名,生成的文件URL是域名格式,未配置则URL则是IP格式 (eg: https://oss.youlai.tech)
+ custom-domain:
+ # 阿里云OSS对象存储服务
+ aliyun:
+ # 服务Endpoint
+ endpoint: oss-cn-hangzhou.aliyuncs.com
+ # 访问凭据
+ access-key-id: your-access-key-id
+ # 凭据密钥
+ access-key-secret: your-access-key-secret
+ # 存储桶名称
+ bucket-name: default
+ # 本地存储
+ local:
+ # 文件存储路径 请注意下,mac用户请使用 /Users/your-username/your-path/,否则会有权限问题,windows用户请使用 D:/your-path/
+ storage-path: /Users/theo/home/
+# 短信配置
+sms:
+ # 阿里云短信
+ aliyun:
+ accessKeyId: LTAI5tSMgfxxxxxxdiBJLyR
+ accessKeySecret: SoOWRqpjtS7xxxxxxZ2PZiMTJOVC
+ domain: dysmsapi.aliyuncs.com
+ regionId: cn-shanghai
+ signName: 有来技术
+ templates:
+ # 注册短信验证码模板
+ register: SMS_22xxx771
+ # 登录短信验证码模板
+ login: SMS_22xxx772
+ # 修改手机号短信验证码模板
+ change-mobile: SMS_22xxx773
+
+# springdoc配置: https://springdoc.org/properties.html
+springdoc:
+ swagger-ui:
+ path: /swagger-ui.html
+ operationsSorter: alpha
+ tags-sorter: alpha
+ api-docs:
+ path: /v3/api-docs
+ group-configs:
+ - group: '系统管理'
+ paths-to-match: "/**"
+ packages-to-scan:
+ - com.youlai.boot.system.controller
+ - com.youlai.boot.shared.auth.controller
+ - com.youlai.boot.shared.file.controller
+ - com.youlai.boot.shared.codegen.controller
+ default-flat-param-object: true
+
+# knife4j 接口文档配置
+knife4j:
+ # 是否开启 Knife4j 增强功能
+ enable: true # 设置为 true 表示开启增强功能
+ # 生产环境配置
+ production: false # 设置为 true 表示在生产环境中不显示文档,为 false 表示显示文档(通常在开发环境中使用)
+ setting:
+ language: zh_cn
+
+# xxl-job 定时任务配置
+xxl:
+ job:
+ # 定时任务开关
+ enabled: false
+ admin:
+ # 多个地址使用,分割
+ addresses: http://150.158.18.177:8686/xxl-job-admin
+ accessToken: default_token
+ executor:
+ appname: xxl-job-executor-${spring.application.name}
+ address:
+ ip:
+ port: 9999
+ logpath: /data/applogs/xxl-job/jobhandler
+ logretentiondays: 30
+
+# 验证码配置
+captcha:
+ # 验证码类型 circle-圆圈干扰验证码|gif-Gif验证码|line-干扰线验证码|shear-扭曲干扰验证码
+ type: circle
+ # 验证码宽度
+ width: 120
+ # 验证码高度
+ height: 40
+ # 验证码干扰元素个数
+ interfere-count: 2
+ # 文本透明度(0.0-1.0)
+ text-alpha: 0.8
+ # 验证码字符配置
+ code:
+ # 验证码字符类型 math-算术|random-随机字符
+ type: math
+ # 验证码字符长度,type=算术时,表示运算位数(1:个位数运算 2:十位数运算);type=随机字符时,表示字符个数
+ length: 1
+ # 验证码字体
+ font:
+ # 字体名称 Dialog|DialogInput|Monospaced|Serif|SansSerif
+ name: SansSerif
+ # 字体样式 0-普通|1-粗体|2-斜体
+ weight: 1
+ # 字体大小
+ size: 24
+ # 验证码有效期(秒)
+ expire-seconds: 120
+
+# 微信小程配置
+wx:
+ miniapp:
+ app-id: xxxxxx
+ app-secret: xxxxxx
\ No newline at end of file
diff --git a/hypersense-access/src/main/resources/application.yml b/hypersense-access/src/main/resources/application.yml
new file mode 100644
index 0000000..16e4c23
--- /dev/null
+++ b/hypersense-access/src/main/resources/application.yml
@@ -0,0 +1,11 @@
+spring:
+ application:
+ name: hypernse-boot
+ profiles:
+ active: dev
+ # config:
+ # import: classpath:codegen.yml
+
+# 在 banner.txt 中显示项目版本,使用 @project.version@ 从 pom.xml 获取
+project:
+ version: @project.version@
diff --git a/hypersense-access/src/main/resources/banner.txt b/hypersense-access/src/main/resources/banner.txt
new file mode 100644
index 0000000..f3c6f0a
--- /dev/null
+++ b/hypersense-access/src/main/resources/banner.txt
@@ -0,0 +1,16 @@
+${AnsiColor.BRIGHT_BLUE}
+ ██ ██ ████████
+░██ ░██ ██ ██ ██████ ██░░░░░░
+░██ ░██ ░░██ ██ ░██░░░██ █████ ██████░██ █████ ███████ ██████ █████
+░██████████ ░░███ ░██ ░██ ██░░░██░░██░░█░█████████ ██░░░██░░██░░░██ ██░░░░ ██░░░██
+░██░░░░░░██ ░██ ░██████ ░███████ ░██ ░ ░░░░░░░░██░███████ ░██ ░██░░█████ ░███████
+░██ ░██ ██ ░██░░░ ░██░░░░ ░██ ░██░██░░░░ ░██ ░██ ░░░░░██░██░░░░
+░██ ░██ ██ ░██ ░░██████░███ ████████ ░░██████ ███ ░██ ██████ ░░██████
+░░ ░░ ░░ ░░ ░░░░░░ ░░░ ░░░░░░░░ ░░░░░░ ░░░ ░░ ░░░░░░ ░░░░░░
+
+${AnsiColor.BRIGHT_BLUE}
+HyperSense Boot Version: ${project.version}
+Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
+氦闪官网: https://www.hypersense.tech/
+版权所属: 氦闪技术分享
+${AnsiColor.CYAN}
\ No newline at end of file
diff --git a/hypersense-access/src/main/resources/logback-spring.xml b/hypersense-access/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..a424b78
--- /dev/null
+++ b/hypersense-access/src/main/resources/logback-spring.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DEBUG
+
+
+ ${CONSOLE_LOG_PATTERN}
+ UTF-8
+
+
+
+
+
+
+ ${LOG_HOME}/log.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} -%5level ---[%15.15thread] %-40.40logger{39} : %msg%n%n
+ UTF-8
+
+
+
+
+ ${LOG_HOME}/%d{yyyy-MM-dd}.%i.log
+
+ 10MB
+
+ 30
+
+ 1GB
+
+
+
+ INFO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hypersense-common/hypersense-common-bom/pom.xml b/hypersense-common/hypersense-common-bom/pom.xml
new file mode 100644
index 0000000..9d60a11
--- /dev/null
+++ b/hypersense-common/hypersense-common-bom/pom.xml
@@ -0,0 +1,70 @@
+
+ 4.0.0
+
+ tech.hypersense
+ hypersense-common
+ ${revision}
+
+ hypersense-common-bom
+
+
+ hypersense-common-bom common模块依赖项
+
+
+
+ 1.0.0
+
+
+
+
+
+ tech.hypersense
+ hypersense-common-core
+ ${revision}
+
+
+
+ tech.hypersense
+ hypersense-common-web
+ ${revision}
+
+
+
+ tech.hypersense
+ hypersense-common-security
+ ${revision}
+
+
+
+ tech.hypersense
+ hypersense-common-websocket
+ ${revision}
+
+
+
+ tech.hypersense
+ hypersense-common-desensitize
+ ${revision}
+
+
+
+ tech.hypersense
+ hypersense-common-ratelimiter
+ ${revision}
+
+
+
+ tech.hypersense
+ hypersense-common-tenant
+ ${revision}
+
+
+
+ tech.hypersense
+ hypersense-common-translation
+ ${revision}
+
+
+
+
diff --git a/hypersense-common/hypersense-common-core/pom.xml b/hypersense-common/hypersense-common-core/pom.xml
new file mode 100644
index 0000000..6b6a3b5
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/pom.xml
@@ -0,0 +1,64 @@
+
+ 4.0.0
+
+ tech.hypersense
+ hypersense-common
+ ${revision}
+
+ hypersense-common-core
+
+ hypersense-common-core 核心模块
+
+
+
+
+
+ org.springframework
+ spring-context-support
+
+
+
+
+ org.springframework
+ spring-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+
+ jakarta.servlet
+ jakarta.servlet-api
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+
+
+
+ org.springframework.boot
+ spring-boot-properties-migrator
+ runtime
+
+
+
+
+
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/DataPermission.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/DataPermission.java
new file mode 100644
index 0000000..751c0e1
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/DataPermission.java
@@ -0,0 +1,27 @@
+package tech.hypersense.common.core.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @Author: HyperSense
+ * @CreateTime: 2025-03-25
+ * @Description: 数据权限注解
+ * @Version: 1.0
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.METHOD})
+public @interface DataPermission {
+
+ /**
+ * 数据权限 {@link com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor}
+ */
+ String deptAlias() default "";
+
+ String deptIdColumnName() default "dept_id";
+
+ String userAlias() default "";
+
+ String userIdColumnName() default "create_by";
+
+}
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/Debounce.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/Debounce.java
new file mode 100644
index 0000000..8f9485f
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/Debounce.java
@@ -0,0 +1,24 @@
+package tech.hypersense.common.core.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @Author: HyperSense
+ * @CreateTime: 2025-03-25
+ * @Description: 防止老年手抖导致重复提交注解
该注解用于方法上,防止在指定时间内的重复提交。 默认时间为5秒。
+ * @Version: 1.0
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+public @interface Debounce {
+
+ /**
+ * 锁过期时间(秒)
+ *
+ * 默认5秒内不允许重复提交
+ */
+ int expire() default 5;
+
+}
\ No newline at end of file
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/Log.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/Log.java
new file mode 100644
index 0000000..245a050
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/Log.java
@@ -0,0 +1,49 @@
+package tech.hypersense.common.core.annotation;
+
+import tech.hypersense.common.core.enums.LogModuleEnum;
+
+import java.lang.annotation.*;
+
+/**
+ * @Author: HyperSense
+ * @CreateTime: 2025-03-25
+ * @Description: 日志注解
+ * @Version: 1.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Documented
+public @interface Log {
+
+ /**
+ * 日志描述
+ *
+ * @return 日志描述
+ */
+ String value() default "";
+
+ /**
+ * 日志模块
+ *
+ * @return 日志模块
+ */
+
+ LogModuleEnum module();
+
+ /**
+ * 是否记录请求参数
+ *
+ * @return 是否记录请求参数
+ */
+ boolean params() default true;
+
+ /**
+ * 是否记录响应结果
+ *
+ * 响应结果默认不记录,避免日志过大
+ * @return 是否记录响应结果
+ */
+ boolean result() default false;
+
+
+}
\ No newline at end of file
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/ValidField.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/ValidField.java
new file mode 100644
index 0000000..848bb10
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/annotation/ValidField.java
@@ -0,0 +1,35 @@
+package tech.hypersense.common.core.annotation;
+
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+import tech.hypersense.common.core.validator.FieldValidator;
+
+import java.lang.annotation.*;
+
+/**
+ * @Author: HyperSense
+ * @CreateTime: 2025-03-25
+ * @Description: 用于验证字段值是否合法的注解
+ * @Version: 1.0
+ */
+@Documented
+@Constraint(validatedBy = FieldValidator.class)
+@Target({ElementType.FIELD, ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ValidField {
+
+ /**
+ * 验证失败时的错误信息。
+ */
+ String message() default "非法字段";
+
+ Class>[] groups() default {};
+
+ Class extends Payload>[] payload() default {};
+
+ /**
+ * 允许的合法值列表。
+ */
+ String[] allowedValues();
+
+}
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/aspect/DebounceAspect.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/aspect/DebounceAspect.java
new file mode 100644
index 0000000..5fb224f
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/aspect/DebounceAspect.java
@@ -0,0 +1,99 @@
+package tech.hypersense.common.core.aspect;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import tech.hypersense.common.core.annotation.Debounce;
+import tech.hypersense.common.core.constant.RedisConstants;
+import tech.hypersense.common.core.constant.SecurityConstants;
+import tech.hypersense.common.core.enums.ResultCode;
+import tech.hypersense.common.core.exception.BusinessException;
+import tech.hypersense.common.core.utils.IPUtils;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author: HyperSense
+ * @CreateTime: 2025-03-25
+ * @Description: 防抖切面
+ * @Version: 1.0
+ */
+@Aspect
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class DebounceAspect {
+
+ private final RedissonClient redissonClient;
+
+ /**
+ * 防重复提交切点
+ */
+ @Pointcut("@annotation(debounce)")
+ public void repeatSubmitPointCut(Debounce debounce) {
+ }
+
+ /**
+ * 环绕通知:处理防重复提交逻辑
+ */
+ @Around(value = "repeatSubmitPointCut(debounce)", argNames = "pjp,debounce")
+ public Object handleRepeatSubmit(ProceedingJoinPoint pjp, Debounce debounce) throws Throwable {
+ String lockKey = buildLockKey();
+
+ int expire = debounce.expire();
+ RLock lock = redissonClient.getLock(lockKey);
+
+ boolean locked = lock.tryLock(0, expire, TimeUnit.SECONDS);
+ if (!locked) {
+ throw new BusinessException(ResultCode.USER_DUPLICATE_REQUEST);
+ }
+ return pjp.proceed();
+ }
+
+ /**
+ * 生成防重复提交锁的 key
+ * @return 锁的 key
+ */
+ private String buildLockKey() {
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ // 用户唯一标识
+ String userIdentifier = getUserIdentifier(request);
+ // 请求唯一标识 = 请求方法 + 请求路径 + 请求参数(严谨的做法)
+ String requestIdentifier = StrUtil.join(":", request.getMethod(), request.getRequestURI());
+ return StrUtil.format(RedisConstants.Lock.RESUBMIT, userIdentifier, requestIdentifier);
+ }
+
+ /**
+ * 获取用户唯一标识
+ * 1. 从请求头中获取 Token,使用 SHA-256 加密 Token 作为用户唯一标识
+ * 2. 如果 Token 为空,使用 IP 作为用户唯一标识
+ *
+ * @param request 请求对象
+ * @return 用户唯一标识
+ */
+ private String getUserIdentifier(HttpServletRequest request) {
+ // 用户身份唯一标识
+ String userIdentifier;
+ // 从请求头中获取 Token
+ String tokenHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
+ if (StrUtil.isNotBlank(tokenHeader) && tokenHeader.startsWith(SecurityConstants.BEARER_TOKEN_PREFIX)) {
+ String rawToken = tokenHeader.substring(SecurityConstants.BEARER_TOKEN_PREFIX.length()); // 去掉 Bearer 后的 Token
+ userIdentifier = DigestUtil.sha256Hex(rawToken); // 使用 SHA-256 加密 Token 作为用户唯一标识
+ } else {
+ userIdentifier = IPUtils.getIpAddr(request); // 使用 IP 作为用户唯一标识
+ }
+ return userIdentifier;
+ }
+}
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/JwtClaimConstants.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/JwtClaimConstants.java
new file mode 100644
index 0000000..a43a00e
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/JwtClaimConstants.java
@@ -0,0 +1,29 @@
+package tech.hypersense.common.core.constant;
+/**
+*@Author: HyperSense
+*@CreateTime: 2025-03-25
+*@Description: JWT Claims声明常量
JWT Claims 属于 Payload 的一部分,包含了一些实体(通常指的用户)的状态和额外的元数据。
+*@Version: 1.0
+*/
+public interface JwtClaimConstants {
+
+ /**
+ * 用户ID
+ */
+ String USER_ID = "userId";
+
+ /**
+ * 部门ID
+ */
+ String DEPT_ID = "deptId";
+
+ /**
+ * 数据权限
+ */
+ String DATA_SCOPE = "dataScope";
+
+ /**
+ * 权限(角色Code)集合
+ */
+ String AUTHORITIES = "authorities";
+}
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/RedisConstants.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/RedisConstants.java
new file mode 100644
index 0000000..453cba3
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/RedisConstants.java
@@ -0,0 +1,60 @@
+package tech.hypersense.common.core.constant;
+/**
+*@Author: HyperSense
+*@CreateTime: 2025-03-25
+*@Description: Redis 常量
+*@Version: 1.0
+*/
+public interface RedisConstants {
+
+
+ /**
+ * 限流相关键
+ */
+ interface RateLimiter {
+ String IP = "rate_limiter:ip:{}"; // IP限流(示例:rate_limiter:ip:192.168.1.1)
+ }
+
+ /**
+ * 分布式锁相关键
+ */
+ interface Lock {
+ String RESUBMIT = "lock:resubmit:{}:{}"; // 防重复提交(示例:lock:resubmit:userIdentifier:requestIdentifier)
+ }
+
+ /**
+ * 认证模块
+ */
+ interface Auth {
+ // 存储访问令牌对应的用户信息(accessToken -> OnlineUser)
+ String ACCESS_TOKEN_USER = "auth:token:access:{}";
+ // 存储刷新令牌对应的用户信息(refreshToken -> OnlineUser)
+ String REFRESH_TOKEN_USER = "auth:token:refresh:{}";
+ // 用户与访问令牌的映射(userId -> accessToken)
+ String USER_ACCESS_TOKEN = "auth:user:access:{}";
+ // 用户与刷新令牌的映射(userId -> refreshToken
+ String USER_REFRESH_TOKEN = "auth:user:refresh:{}";
+ // 黑名单 Token(用于退出登录或注销)
+ String BLACKLIST_TOKEN = "auth:token:blacklist:{}";
+ }
+
+ /**
+ * 验证码模块
+ */
+ interface Captcha {
+ String IMAGE_CODE = "captcha:image:{}"; // 图形验证码
+ String SMS_LOGIN_CODE = "captcha:sms_login:{}"; // 登录短信验证码
+ String SMS_REGISTER_CODE = "captcha:sms_register:{}";// 注册短信验证码
+ String MOBILE_CODE = "captcha:mobile:{}"; // 绑定、更换手机验证码
+ String EMAIL_CODE = "captcha:email:{}"; // 邮箱验证码
+ }
+
+ /**
+ * 系统模块
+ */
+ interface System {
+ String CONFIG = "system:config"; // 系统配置
+ String ROLE_PERMS = "system:role:perms"; // 系统角色和权限映射
+ }
+
+}
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/SecurityConstants.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/SecurityConstants.java
new file mode 100644
index 0000000..57e2d46
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/SecurityConstants.java
@@ -0,0 +1,24 @@
+package tech.hypersense.common.core.constant;
+/**
+*@Author: HyperSense
+*@CreateTime: 2025-03-25
+*@Description: 安全模块常量
+*@Version: 1.0
+*/
+public interface SecurityConstants {
+
+ /**
+ * 登录路径
+ */
+ String LOGIN_PATH = "/api/v1/auth/login";
+
+ /**
+ * JWT Token 前缀
+ */
+ String BEARER_TOKEN_PREFIX = "Bearer ";
+
+ /**
+ * 角色前缀,用于区分 authorities 角色和权限, ROLE_* 角色 、没有前缀的是权限
+ */
+ String ROLE_PREFIX = "ROLE_";
+}
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/SystemConstants.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/SystemConstants.java
new file mode 100644
index 0000000..f287e9a
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/constant/SystemConstants.java
@@ -0,0 +1,30 @@
+package tech.hypersense.common.core.constant;
+/**
+*@Author: HyperSense
+*@CreateTime: 2025-03-25
+*@Description: 系统常量
+*@Version: 1.0
+*/
+public interface SystemConstants {
+
+ /**
+ * 根节点ID
+ */
+ Long ROOT_NODE_ID = 0L;
+
+ /**
+ * 系统默认密码
+ */
+ String DEFAULT_PASSWORD = "123456";
+
+ /**
+ * 超级管理员角色编码
+ */
+ String ROOT_ROLE_CODE = "ROOT";
+
+
+ /**
+ * 系统配置 IP的QPS限流的KEY
+ */
+ String SYSTEM_CONFIG_IP_QPS_LIMIT_KEY = "IP_QPS_THRESHOLD_LIMIT";
+}
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/KValue.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/KValue.java
new file mode 100644
index 0000000..1784198
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/KValue.java
@@ -0,0 +1,22 @@
+package tech.hypersense.common.core.domain.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * @Author: HyperSense
+ * @CreateTime: 2025-03-25
+ * @Description: 键值对
+ * @Version: 1.0
+ */
+public class KValue {
+ public KValue(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ @Schema(description = "选项的值")
+ private String key;
+
+ @Schema(description = "选项的标签")
+ private String value;
+}
diff --git a/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/Option.java b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/Option.java
new file mode 100644
index 0000000..97b577c
--- /dev/null
+++ b/hypersense-common/hypersense-common-core/src/main/java/tech/hypersense/common/core/domain/model/Option.java
@@ -0,0 +1,53 @@
+package tech.hypersense.common.core.domain.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @Author: HyperSense
+ * @CreateTime: 2025-03-25
+ * @Description: 下拉选项对象
+ * @Version: 1.0
+ */
+@Schema(description ="下拉选项对象")
+@Data
+@NoArgsConstructor
+public class Option {
+
+ public Option(T value, String label) {
+ this.value = value;
+ this.label = label;
+ }
+
+ public Option(T value, String label, List