From 80dd406f8c0b9f9a6b4a82187ce2116d9f20cb99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=9E=E7=A0=81-=E6=96=B9=E6=99=93=E8=BE=89?= Date: Thu, 5 Feb 2026 09:55:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EOpenApi=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3=20+=20=E5=AD=A6?= =?UTF-8?q?=E7=94=9F=E5=AE=8C=E6=95=B4=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=20+=20UI=E6=96=87=E6=A1=88=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. OpenApi新增接口: - /open/api/student/listFull: 学生列表完整数据(不脱敏) - /open/api/base/school/*: 学校查询接口(直接调用内部Service) - /open/api/base/grade/*: 年级查询接口 - /open/api/base/class/*: 班级查询接口 2. 新增OpenApi专用VO: - OpenSchoolVo, OpenGradeVo, OpenClassVo 3. 数据库脚本: - V1.0.3__open_api_dict.sql: 接口字典数据 4. 前端文案优化: - 将"教育身份"统一改为"任教信息" --- .cursor/rules/pangu-project.mdc | 4 +- .../java/org/dromara/DromaraApplication.java | 2 +- .../dromara/DromaraServletInitializer.java | 2 +- .../web/controller/AuthController.java | 2 +- .../web/controller/CaptchaController.java | 2 +- .../web/controller/IndexController.java | 2 +- .../org/dromara/web/domain/vo/CaptchaVo.java | 2 +- .../dromara/web/domain/vo/LoginTenantVo.java | 2 +- .../org/dromara/web/domain/vo/LoginVo.java | 2 +- .../dromara/web/domain/vo/TenantListVo.java | 2 +- .../web/listener/UserActionListener.java | 2 +- .../dromara/web/service/IAuthStrategy.java | 2 +- .../dromara/web/service/SysLoginService.java | 2 +- .../web/service/SysRegisterService.java | 2 +- .../web/service/impl/EmailAuthStrategy.java | 2 +- .../service/impl/PasswordAuthStrategy.java | 2 +- .../web/service/impl/SmsAuthStrategy.java | 2 +- .../web/service/impl/SocialAuthStrategy.java | 2 +- .../web/service/impl/XcxAuthStrategy.java | 2 +- .../src/main/resources/application.yml | 2 + .../java/org/dromara/test/AssertUnitTest.java | 2 +- .../java/org/dromara/test/DemoUnitTest.java | 2 +- .../java/org/dromara/test/ParamUnitTest.java | 2 +- .../java/org/dromara/test/TagUnitTest.java | 2 +- .../common/core/config/ApplicationConfig.java | 2 +- .../common/core/config/ThreadPoolConfig.java | 2 +- .../common/core/config/ValidatorConfig.java | 2 +- .../common/core/constant/CacheConstants.java | 2 +- .../common/core/constant/CacheNames.java | 2 +- .../common/core/constant/Constants.java | 2 +- .../common/core/constant/GlobalConstants.java | 2 +- .../common/core/constant/HttpStatus.java | 2 +- .../common/core/constant/RegexConstants.java | 2 +- .../common/core/constant/SystemConstants.java | 2 +- .../common/core/constant/TenantConstants.java | 2 +- .../org/dromara/common/core/domain/R.java | 2 +- .../core/domain/dto/CompleteTaskDTO.java | 2 +- .../common/core/domain/dto/DeptDTO.java | 2 +- .../common/core/domain/dto/DictDataDTO.java | 2 +- .../common/core/domain/dto/DictTypeDTO.java | 2 +- .../common/core/domain/dto/FlowCopyDTO.java | 2 +- .../domain/dto/FlowInstanceBizExtDTO.java | 2 +- .../common/core/domain/dto/OssDTO.java | 2 +- .../common/core/domain/dto/PostDTO.java | 2 +- .../common/core/domain/dto/RoleDTO.java | 2 +- .../core/domain/dto/StartProcessDTO.java | 2 +- .../domain/dto/StartProcessReturnDTO.java | 2 +- .../core/domain/dto/TaskAssigneeDTO.java | 2 +- .../common/core/domain/dto/UserDTO.java | 2 +- .../common/core/domain/dto/UserOnlineDTO.java | 2 +- .../core/domain/event/ProcessDeleteEvent.java | 2 +- .../core/domain/event/ProcessEvent.java | 2 +- .../core/domain/event/ProcessTaskEvent.java | 2 +- .../core/domain/model/EmailLoginBody.java | 2 +- .../common/core/domain/model/LoginBody.java | 2 +- .../common/core/domain/model/LoginUser.java | 2 +- .../core/domain/model/PasswordLoginBody.java | 2 +- .../core/domain/model/RegisterBody.java | 2 +- .../core/domain/model/SmsLoginBody.java | 2 +- .../core/domain/model/SocialLoginBody.java | 2 +- .../core/domain/model/TaskAssigneeBody.java | 2 +- .../core/domain/model/XcxLoginBody.java | 2 +- .../core/domain/model/XcxLoginUser.java | 2 +- .../common/core/enums/BusinessStatusEnum.java | 2 +- .../dromara/common/core/enums/DeviceType.java | 2 +- .../dromara/common/core/enums/LoginType.java | 2 +- .../dromara/common/core/enums/UserStatus.java | 2 +- .../dromara/common/core/enums/UserType.java | 2 +- .../core/exception/ServiceException.java | 2 +- .../common/core/exception/SseException.java | 2 +- .../core/exception/base/BaseException.java | 2 +- .../core/exception/file/FileException.java | 2 +- .../FileNameLengthLimitExceededException.java | 2 +- .../file/FileSizeLimitExceededException.java | 2 +- .../core/exception/user/CaptchaException.java | 2 +- .../user/CaptchaExpireException.java | 2 +- .../core/exception/user/UserException.java | 2 +- .../core/factory/RegexPatternPoolFactory.java | 2 +- .../factory/YmlPropertySourceFactory.java | 2 +- .../common/core/service/ConfigService.java | 2 +- .../common/core/service/DeptService.java | 2 +- .../common/core/service/DictService.java | 2 +- .../common/core/service/OssService.java | 2 +- .../core/service/PermissionService.java | 2 +- .../common/core/service/PostService.java | 2 +- .../common/core/service/RoleService.java | 2 +- .../core/service/TaskAssigneeService.java | 2 +- .../common/core/service/UserService.java | 2 +- .../common/core/service/WorkflowService.java | 2 +- .../dromara/common/core/utils/DateUtils.java | 2 +- .../common/core/utils/DesensitizedUtils.java | 2 +- .../common/core/utils/MapstructUtils.java | 2 +- .../common/core/utils/MessageUtils.java | 2 +- .../dromara/common/core/utils/NetUtils.java | 2 +- .../common/core/utils/ObjectUtils.java | 2 +- .../common/core/utils/ServletUtils.java | 2 +- .../common/core/utils/SpringUtils.java | 2 +- .../common/core/utils/StreamUtils.java | 2 +- .../common/core/utils/StringUtils.java | 2 +- .../common/core/utils/TreeBuildUtils.java | 2 +- .../common/core/utils/ValidatorUtils.java | 2 +- .../common/core/utils/file/FileUtils.java | 2 +- .../common/core/utils/file/MimeTypeUtils.java | 2 +- .../common/core/utils/ip/AddressUtils.java | 2 +- .../common/core/utils/ip/RegionUtils.java | 2 +- .../core/utils/reflect/ReflectUtils.java | 2 +- .../common/core/utils/regex/RegexUtils.java | 2 +- .../core/utils/regex/RegexValidator.java | 2 +- .../common/core/utils/sql/SqlUtil.java | 2 +- .../common/core/validate/AddGroup.java | 2 +- .../common/core/validate/EditGroup.java | 2 +- .../common/core/validate/QueryGroup.java | 2 +- .../core/validate/dicts/DictPattern.java | 2 +- .../validate/dicts/DictPatternValidator.java | 2 +- .../core/validate/enumd/EnumPattern.java | 2 +- .../validate/enumd/EnumPatternValidator.java | 2 +- .../java/org/dromara/common/core/xss/Xss.java | 2 +- .../dromara/common/core/xss/XssValidator.java | 2 +- .../common/doc/config/SpringDocConfig.java | 4 +- .../properties/SpringDocProperties.java | 2 +- .../common/encrypt/annotation/ApiEncrypt.java | 2 +- .../encrypt/annotation/EncryptField.java | 2 +- .../config/ApiDecryptAutoConfiguration.java | 2 +- .../config/EncryptorAutoConfiguration.java | 2 +- .../common/encrypt/core/EncryptContext.java | 2 +- .../common/encrypt/core/EncryptorManager.java | 2 +- .../common/encrypt/core/IEncryptor.java | 2 +- .../core/encryptor/AbstractEncryptor.java | 2 +- .../encrypt/core/encryptor/AesEncryptor.java | 2 +- .../core/encryptor/Base64Encryptor.java | 2 +- .../encrypt/core/encryptor/RsaEncryptor.java | 2 +- .../encrypt/core/encryptor/Sm2Encryptor.java | 2 +- .../encrypt/core/encryptor/Sm4Encryptor.java | 2 +- .../common/encrypt/enumd/AlgorithmType.java | 2 +- .../common/encrypt/enumd/EncodeType.java | 2 +- .../common/encrypt/filter/CryptoFilter.java | 2 +- .../filter/DecryptRequestBodyWrapper.java | 2 +- .../filter/EncryptResponseBodyWrapper.java | 2 +- .../MybatisDecryptInterceptor.java | 2 +- .../MybatisEncryptInterceptor.java | 2 +- .../properties/ApiDecryptProperties.java | 2 +- .../properties/EncryptorProperties.java | 2 +- .../common/encrypt/utils/EncryptUtils.java | 2 +- .../common/excel/annotation/CellMerge.java | 2 +- .../excel/annotation/ExcelDictFormat.java | 2 +- .../excel/annotation/ExcelDynamicOptions.java | 2 +- .../excel/annotation/ExcelEnumFormat.java | 2 +- .../excel/annotation/ExcelNotation.java | 2 +- .../excel/annotation/ExcelRequired.java | 2 +- .../excel/convert/ExcelBigNumberConvert.java | 2 +- .../excel/convert/ExcelDictConvert.java | 2 +- .../excel/convert/ExcelEnumConvert.java | 2 +- .../common/excel/core/CellMergeHandler.java | 2 +- .../common/excel/core/CellMergeStrategy.java | 2 +- .../excel/core/DefaultExcelListener.java | 4 +- .../common/excel/core/DefaultExcelResult.java | 4 +- .../common/excel/core/DropDownOptions.java | 2 +- .../common/excel/core/ExcelDownHandler.java | 2 +- .../common/excel/core/ExcelListener.java | 2 +- .../excel/core/ExcelOptionsProvider.java | 2 +- .../common/excel/core/ExcelResult.java | 2 +- .../excel/handler/DataWriteHandler.java | 2 +- .../dromara/common/excel/utils/ExcelUtil.java | 2 +- .../excel/utils/ExcelWriterWrapper.java | 2 +- .../idempotent/annotation/RepeatSubmit.java | 2 +- .../aspectj/RepeatSubmitAspect.java | 2 +- .../idempotent/config/IdempotentConfig.java | 2 +- .../common/job/config/SnailJobConfig.java | 2 +- .../common/json/config/JacksonConfig.java | 2 +- .../json/handler/BigNumberSerializer.java | 2 +- .../json/handler/CustomDateDeserializer.java | 2 +- .../dromara/common/json/utils/JsonUtils.java | 2 +- .../common/json/validate/JsonPattern.java | 2 +- .../json/validate/JsonPatternValidator.java | 2 +- .../common/json/validate/JsonType.java | 2 +- .../dromara/common/log/annotation/Log.java | 2 +- .../dromara/common/log/aspect/LogAspect.java | 2 +- .../common/log/enums/BusinessStatus.java | 2 +- .../common/log/enums/BusinessType.java | 2 +- .../common/log/enums/OperatorType.java | 2 +- .../common/log/event/LogininforEvent.java | 2 +- .../common/log/event/OperLogEvent.java | 2 +- .../common/mail/config/MailConfig.java | 2 +- .../config/properties/MailProperties.java | 2 +- .../common/mybatis/annotation/DataColumn.java | 2 +- .../mybatis/annotation/DataPermission.java | 2 +- .../mybatis/aspect/DataPermissionAdvice.java | 2 +- .../aspect/DataPermissionPointcut.java | 2 +- .../aspect/DataPermissionPointcutAdvisor.java | 2 +- .../mybatis/config/MybatisPlusConfig.java | 2 +- .../mybatis/core/domain/BaseEntity.java | 2 +- .../mybatis/core/mapper/BaseMapperPlus.java | 2 +- .../common/mybatis/core/page/PageQuery.java | 2 +- .../mybatis/core/page/TableDataInfo.java | 2 +- .../common/mybatis/enums/DataBaseType.java | 2 +- .../common/mybatis/enums/DataScopeType.java | 2 +- .../handler/InjectionMetaObjectHandler.java | 2 +- .../handler/MybatisExceptionHandler.java | 2 +- .../handler/PlusDataPermissionHandler.java | 2 +- .../handler/PlusPostInitTableInfoHandler.java | 2 +- .../common/mybatis/helper/DataBaseHelper.java | 2 +- .../mybatis/helper/DataPermissionHelper.java | 2 +- .../PlusDataPermissionInterceptor.java | 2 +- .../common/mybatis/utils/IdGeneratorUtil.java | 2 +- .../common/oss/constant/OssConstant.java | 2 +- .../dromara/common/oss/core/OssClient.java | 2 +- .../common/oss/core/WriteOutSubscriber.java | 2 +- .../common/oss/entity/UploadResult.java | 2 +- .../common/oss/enums/AccessPolicyType.java | 2 +- .../common/oss/exception/OssException.java | 2 +- .../common/oss/factory/OssFactory.java | 2 +- .../common/oss/properties/OssProperties.java | 2 +- .../ratelimiter/annotation/RateLimiter.java | 2 +- .../aspectj/RateLimiterAspect.java | 2 +- .../ratelimiter/config/RateLimiterConfig.java | 2 +- .../common/ratelimiter/enums/LimitType.java | 2 +- .../common/redis/config/CacheConfig.java | 2 +- .../common/redis/config/RedisConfig.java | 2 +- .../config/properties/RedissonProperties.java | 2 +- .../redis/handler/KeyPrefixHandler.java | 2 +- .../redis/handler/RedisExceptionHandler.java | 2 +- .../redis/manager/CaffeineCacheDecorator.java | 2 +- .../redis/manager/PlusSpringCacheManager.java | 2 +- .../common/redis/utils/CacheUtils.java | 2 +- .../common/redis/utils/QueueUtils.java | 2 +- .../common/redis/utils/RedisUtils.java | 2 +- .../common/redis/utils/SequenceUtils.java | 2 +- .../common/satoken/config/SaTokenConfig.java | 2 +- .../satoken/core/dao/PlusSaTokenDao.java | 2 +- .../core/service/SaPermissionImpl.java | 2 +- .../handler/SaTokenExceptionHandler.java | 2 +- .../common/satoken/utils/LoginHelper.java | 2 +- .../security/config/SecurityConfig.java | 3 +- .../config/properties/SecurityProperties.java | 2 +- .../security/handler/AllUrlHandler.java | 2 +- .../sensitive/annotation/Sensitive.java | 2 +- .../sensitive/core/SensitiveService.java | 2 +- .../sensitive/core/SensitiveStrategy.java | 2 +- .../sensitive/handler/SensitiveHandler.java | 2 +- .../sms/config/SmsAutoConfiguration.java | 2 +- .../common/sms/core/dao/PlusSmsDao.java | 4 +- .../sms/handler/SmsExceptionHandler.java | 2 +- .../AbstractAuthWeChatEnterpriseRequest.java | 2 +- .../oauth/request/AuthDingTalkV2Request.java | 2 +- .../config/SocialAutoConfiguration.java | 2 +- .../SocialLoginConfigProperties.java | 2 +- .../config/properties/SocialProperties.java | 2 +- .../common/social/gitea/AuthGiteaRequest.java | 2 +- .../common/social/gitea/AuthGiteaSource.java | 2 +- .../social/maxkey/AuthMaxKeyRequest.java | 2 +- .../social/maxkey/AuthMaxKeySource.java | 2 +- .../social/topiam/AuthTopIamRequest.java | 2 +- .../social/topiam/AuthTopIamSource.java | 2 +- .../common/social/utils/SocialUtils.java | 2 +- .../sse/config/SseAutoConfiguration.java | 2 +- .../common/sse/config/SseProperties.java | 2 +- .../common/sse/controller/SseController.java | 2 +- .../common/sse/core/SseEmitterManager.java | 2 +- .../dromara/common/sse/dto/SseMessageDto.java | 2 +- .../common/sse/listener/SseTopicListener.java | 2 +- .../common/sse/utils/SseMessageUtils.java | 2 +- .../common/tenant/config/TenantConfig.java | 2 +- .../common/tenant/core/TenantEntity.java | 2 +- .../common/tenant/core/TenantSaTokenDao.java | 2 +- .../tenant/exception/TenantException.java | 2 +- .../tenant/handle/PlusTenantLineHandler.java | 2 +- .../tenant/handle/TenantKeyPrefixHandler.java | 2 +- .../common/tenant/helper/TenantHelper.java | 2 +- .../manager/TenantSpringCacheManager.java | 2 +- .../tenant/properties/TenantProperties.java | 2 +- .../translation/annotation/Translation.java | 2 +- .../annotation/TranslationType.java | 2 +- .../translation/config/TranslationConfig.java | 2 +- .../translation/constant/TransConstant.java | 2 +- .../core/TranslationInterface.java | 2 +- .../TranslationBeanSerializerModifier.java | 2 +- .../core/handler/TranslationHandler.java | 2 +- .../core/impl/DeptNameTranslationImpl.java | 2 +- .../core/impl/DictTypeTranslationImpl.java | 2 +- .../core/impl/NicknameTranslationImpl.java | 2 +- .../core/impl/OssUrlTranslationImpl.java | 2 +- .../core/impl/UserNameTranslationImpl.java | 2 +- .../common/web/config/CaptchaConfig.java | 2 +- .../common/web/config/FilterConfig.java | 2 +- .../dromara/common/web/config/I18nConfig.java | 2 +- .../common/web/config/ResourcesConfig.java | 2 +- .../common/web/config/UndertowConfig.java | 2 +- .../config/properties/CaptchaProperties.java | 2 +- .../web/config/properties/XssProperties.java | 2 +- .../common/web/core/BaseController.java | 2 +- .../common/web/core/I18nLocaleResolver.java | 2 +- .../common/web/core/WaveAndCircleCaptcha.java | 2 +- .../common/web/filter/RepeatableFilter.java | 2 +- .../web/filter/RepeatedlyRequestWrapper.java | 2 +- .../dromara/common/web/filter/XssFilter.java | 2 +- .../filter/XssHttpServletRequestWrapper.java | 2 +- .../web/handler/GlobalExceptionHandler.java | 2 +- .../PlusWebInvokeTimeInterceptor.java | 2 +- .../websocket/config/WebSocketConfig.java | 2 +- .../properties/WebSocketProperties.java | 2 +- .../constant/WebSocketConstants.java | 2 +- .../websocket/dto/WebSocketMessageDto.java | 2 +- .../handler/PlusWebSocketHandler.java | 2 +- .../holder/WebSocketSessionHolder.java | 2 +- .../interceptor/PlusWebSocketInterceptor.java | 2 +- .../listener/WebSocketTopicListener.java | 2 +- .../websocket/utils/WebSocketUtils.java | 2 +- .../admin/MonitorAdminApplication.java | 2 +- .../monitor/admin/config/SecurityConfig.java | 2 +- .../admin/notifier/CustomNotifier.java | 2 +- .../server/starter/filter/SecurityConfig.java | 2 +- .../snailjob/SnailJobServerApplication.java | 2 +- .../pangu-business/sql/README_导入说明.md | 216 +++ .../pangu-business/sql/check_and_import.sh | 245 ++++ .../pangu-business/sql/open_api_dict_data.sql | 6 + .../pangu-business/sql/快速导入.txt | 47 + .../controller/PgApiDictController.java | 101 ++ .../application/domain/PgApplication.java | 7 + .../application/mapper/PgAppApiMapper.java | 13 + .../service/IPgApiDictService.java | 39 +- .../service/IPgApplicationService.java | 15 + .../service/impl/PgApiDictServiceImpl.java | 60 + .../impl/PgApplicationServiceImpl.java | 74 +- .../openapi/config/ApiAuthInterceptor.java | 100 ++ .../openapi/config/OpenApiWebMvcConfig.java | 24 + .../controller/OpenApiBaseController.java | 245 ++++ .../controller/OpenApiStudentController.java | 94 ++ .../pangu/openapi/domain/vo/OpenClassVo.java | 31 + .../pangu/openapi/domain/vo/OpenGradeVo.java | 31 + .../pangu/openapi/domain/vo/OpenSchoolVo.java | 40 + .../openapi/domain/vo/OpenStudentVo.java | 61 + .../service/IOpenApiStudentService.java | 46 + .../impl/OpenApiStudentServiceImpl.java | 190 +++ .../pangu/openapi/utils/DataMaskUtil.java | 72 + .../pangu/student/mapper/PgStudentMapper.java | 24 + .../mapper/application/PgAppApiMapper.xml | 24 + .../demo/controller/MailSendController.java | 2 +- .../demo/controller/RedisCacheController.java | 2 +- .../demo/controller/RedisLockController.java | 2 +- .../controller/RedisPubSubController.java | 2 +- .../RedisRateLimiterController.java | 2 +- .../demo/controller/SmsController.java | 2 +- .../controller/Swagger3DemoController.java | 2 +- .../demo/controller/TestBatchController.java | 2 +- .../demo/controller/TestDemoController.java | 2 +- .../controller/TestEncryptController.java | 2 +- .../demo/controller/TestExcelController.java | 2 +- .../demo/controller/TestI18nController.java | 2 +- .../controller/TestSensitiveController.java | 2 +- .../demo/controller/TestTreeController.java | 2 +- .../demo/controller/WebSocketController.java | 2 +- .../queue/BoundedQueueController.java | 2 +- .../queue/DelayedQueueController.java | 2 +- .../demo/controller/queue/PriorityDemo.java | 2 +- .../queue/PriorityQueueController.java | 2 +- .../org/dromara/demo/domain/TestDemo.java | 2 +- .../org/dromara/demo/domain/TestTree.java | 2 +- .../dromara/demo/domain/bo/TestDemoBo.java | 2 +- .../demo/domain/bo/TestDemoImportVo.java | 2 +- .../dromara/demo/domain/bo/TestTreeBo.java | 2 +- .../dromara/demo/domain/vo/ExportDemoVo.java | 2 +- .../dromara/demo/domain/vo/TestDemoVo.java | 2 +- .../dromara/demo/domain/vo/TestTreeVo.java | 2 +- .../demo/listener/ExportDemoListener.java | 2 +- .../demo/mapper/TestDemoEncryptMapper.java | 2 +- .../dromara/demo/mapper/TestDemoMapper.java | 2 +- .../dromara/demo/mapper/TestTreeMapper.java | 2 +- .../demo/service/IExportExcelService.java | 2 +- .../demo/service/ITestDemoService.java | 2 +- .../demo/service/ITestTreeService.java | 2 +- .../service/impl/ExportExcelServiceImpl.java | 2 +- .../service/impl/TestDemoServiceImpl.java | 2 +- .../service/impl/TestTreeServiceImpl.java | 2 +- .../dromara/generator/config/GenConfig.java | 2 +- .../config/MyBatisDataSourceMonitor.java | 2 +- .../generator/constant/GenConstants.java | 2 +- .../generator/controller/GenController.java | 2 +- .../dromara/generator/domain/GenTable.java | 2 +- .../generator/domain/GenTableColumn.java | 2 +- .../mapper/GenTableColumnMapper.java | 2 +- .../generator/mapper/GenTableMapper.java | 2 +- .../service/GenTableServiceImpl.java | 2 +- .../generator/service/IGenTableService.java | 2 +- .../org/dromara/generator/util/GenUtils.java | 2 +- .../generator/util/VelocityInitializer.java | 2 +- .../dromara/generator/util/VelocityUtils.java | 2 +- .../dromara/job/snailjob/AlipayBillTask.java | 2 +- .../dromara/job/snailjob/SummaryBillTask.java | 2 +- .../job/snailjob/TestAnnoJobExecutor.java | 2 +- .../job/snailjob/TestBroadcastJob.java | 2 +- .../job/snailjob/TestClassJobExecutor.java | 2 +- .../job/snailjob/TestMapJobAnnotation.java | 2 +- .../snailjob/TestMapReduceAnnotation1.java | 2 +- .../job/snailjob/TestStaticShardingJob.java | 2 +- .../dromara/job/snailjob/WechatBillTask.java | 2 +- .../controller/monitor/CacheController.java | 2 +- .../monitor/SysLogininforController.java | 2 +- .../monitor/SysOperlogController.java | 2 +- .../monitor/SysUserOnlineController.java | 2 +- .../system/SysClientController.java | 2 +- .../system/SysConfigController.java | 2 +- .../controller/system/SysDeptController.java | 2 +- .../system/SysDictDataController.java | 2 +- .../system/SysDictTypeController.java | 2 +- .../controller/system/SysMenuController.java | 2 +- .../system/SysNoticeController.java | 2 +- .../system/SysOssConfigController.java | 4 +- .../controller/system/SysOssController.java | 2 +- .../controller/system/SysPostController.java | 2 +- .../system/SysProfileController.java | 2 +- .../controller/system/SysRoleController.java | 2 +- .../system/SysSocialController.java | 2 +- .../system/SysTenantController.java | 2 +- .../system/SysTenantPackageController.java | 2 +- .../controller/system/SysUserController.java | 2 +- .../org/dromara/system/domain/SysCache.java | 2 +- .../org/dromara/system/domain/SysClient.java | 2 +- .../org/dromara/system/domain/SysConfig.java | 2 +- .../org/dromara/system/domain/SysDept.java | 2 +- .../dromara/system/domain/SysDictData.java | 2 +- .../dromara/system/domain/SysDictType.java | 2 +- .../dromara/system/domain/SysLogininfor.java | 2 +- .../org/dromara/system/domain/SysMenu.java | 2 +- .../org/dromara/system/domain/SysNotice.java | 2 +- .../org/dromara/system/domain/SysOperLog.java | 2 +- .../org/dromara/system/domain/SysOss.java | 2 +- .../dromara/system/domain/SysOssConfig.java | 2 +- .../org/dromara/system/domain/SysOssExt.java | 2 +- .../org/dromara/system/domain/SysPost.java | 2 +- .../org/dromara/system/domain/SysRole.java | 2 +- .../dromara/system/domain/SysRoleDept.java | 2 +- .../dromara/system/domain/SysRoleMenu.java | 2 +- .../org/dromara/system/domain/SysSocial.java | 2 +- .../org/dromara/system/domain/SysTenant.java | 2 +- .../system/domain/SysTenantPackage.java | 2 +- .../org/dromara/system/domain/SysUser.java | 2 +- .../dromara/system/domain/SysUserOnline.java | 2 +- .../dromara/system/domain/SysUserPost.java | 2 +- .../dromara/system/domain/SysUserRole.java | 2 +- .../dromara/system/domain/bo/SysClientBo.java | 2 +- .../dromara/system/domain/bo/SysConfigBo.java | 2 +- .../dromara/system/domain/bo/SysDeptBo.java | 2 +- .../system/domain/bo/SysDictDataBo.java | 2 +- .../system/domain/bo/SysDictTypeBo.java | 2 +- .../system/domain/bo/SysLogininforBo.java | 2 +- .../dromara/system/domain/bo/SysMenuBo.java | 2 +- .../dromara/system/domain/bo/SysNoticeBo.java | 2 +- .../system/domain/bo/SysOperLogBo.java | 2 +- .../dromara/system/domain/bo/SysOssBo.java | 2 +- .../system/domain/bo/SysOssConfigBo.java | 4 +- .../dromara/system/domain/bo/SysPostBo.java | 2 +- .../dromara/system/domain/bo/SysRoleBo.java | 2 +- .../dromara/system/domain/bo/SysSocialBo.java | 2 +- .../dromara/system/domain/bo/SysTenantBo.java | 2 +- .../system/domain/bo/SysTenantPackageBo.java | 2 +- .../dromara/system/domain/bo/SysUserBo.java | 2 +- .../system/domain/bo/SysUserProfileBo.java | 2 +- .../org/dromara/system/domain/vo/MetaVo.java | 2 +- .../system/domain/vo/ProfileUserVo.java | 2 +- .../dromara/system/domain/vo/RouterVo.java | 2 +- .../dromara/system/domain/vo/SysClientVo.java | 2 +- .../dromara/system/domain/vo/SysConfigVo.java | 2 +- .../dromara/system/domain/vo/SysDeptVo.java | 2 +- .../system/domain/vo/SysDictDataVo.java | 2 +- .../system/domain/vo/SysDictTypeVo.java | 2 +- .../system/domain/vo/SysLogininforVo.java | 2 +- .../dromara/system/domain/vo/SysMenuVo.java | 2 +- .../dromara/system/domain/vo/SysNoticeVo.java | 2 +- .../system/domain/vo/SysOperLogVo.java | 2 +- .../system/domain/vo/SysOssConfigVo.java | 4 +- .../system/domain/vo/SysOssUploadVo.java | 2 +- .../dromara/system/domain/vo/SysOssVo.java | 2 +- .../dromara/system/domain/vo/SysPostVo.java | 2 +- .../dromara/system/domain/vo/SysRoleVo.java | 2 +- .../dromara/system/domain/vo/SysSocialVo.java | 2 +- .../system/domain/vo/SysTenantPackageVo.java | 2 +- .../dromara/system/domain/vo/SysTenantVo.java | 2 +- .../system/domain/vo/SysUserExportVo.java | 2 +- .../system/domain/vo/SysUserImportVo.java | 2 +- .../system/domain/vo/SysUserInfoVo.java | 2 +- .../dromara/system/domain/vo/SysUserVo.java | 2 +- .../dromara/system/domain/vo/UserInfoVo.java | 2 +- .../listener/SysUserImportListener.java | 2 +- .../system/mapper/SysClientMapper.java | 2 +- .../system/mapper/SysConfigMapper.java | 2 +- .../dromara/system/mapper/SysDeptMapper.java | 2 +- .../system/mapper/SysDictDataMapper.java | 2 +- .../system/mapper/SysDictTypeMapper.java | 2 +- .../system/mapper/SysLogininforMapper.java | 2 +- .../dromara/system/mapper/SysMenuMapper.java | 2 +- .../system/mapper/SysNoticeMapper.java | 2 +- .../system/mapper/SysOperLogMapper.java | 2 +- .../system/mapper/SysOssConfigMapper.java | 4 +- .../dromara/system/mapper/SysOssMapper.java | 2 +- .../dromara/system/mapper/SysPostMapper.java | 2 +- .../system/mapper/SysRoleDeptMapper.java | 2 +- .../dromara/system/mapper/SysRoleMapper.java | 2 +- .../system/mapper/SysRoleMenuMapper.java | 2 +- .../system/mapper/SysSocialMapper.java | 2 +- .../system/mapper/SysTenantMapper.java | 2 +- .../system/mapper/SysTenantPackageMapper.java | 2 +- .../dromara/system/mapper/SysUserMapper.java | 2 +- .../system/mapper/SysUserPostMapper.java | 2 +- .../system/mapper/SysUserRoleMapper.java | 2 +- .../runner/SystemApplicationRunner.java | 2 +- .../system/service/ISysClientService.java | 2 +- .../system/service/ISysConfigService.java | 2 +- .../system/service/ISysDataScopeService.java | 2 +- .../system/service/ISysDeptService.java | 2 +- .../system/service/ISysDictDataService.java | 2 +- .../system/service/ISysDictTypeService.java | 2 +- .../system/service/ISysLogininforService.java | 2 +- .../system/service/ISysMenuService.java | 2 +- .../system/service/ISysNoticeService.java | 2 +- .../system/service/ISysOperLogService.java | 2 +- .../system/service/ISysOssConfigService.java | 4 +- .../system/service/ISysOssService.java | 2 +- .../system/service/ISysPermissionService.java | 2 +- .../system/service/ISysPostService.java | 2 +- .../system/service/ISysRoleService.java | 2 +- .../system/service/ISysSocialService.java | 2 +- .../service/ISysTenantPackageService.java | 2 +- .../system/service/ISysTenantService.java | 2 +- .../system/service/ISysUserService.java | 2 +- .../service/impl/SysClientServiceImpl.java | 2 +- .../service/impl/SysConfigServiceImpl.java | 2 +- .../service/impl/SysDataScopeServiceImpl.java | 2 +- .../service/impl/SysDeptServiceImpl.java | 2 +- .../service/impl/SysDictDataServiceImpl.java | 2 +- .../service/impl/SysDictTypeServiceImpl.java | 2 +- .../impl/SysLogininforServiceImpl.java | 2 +- .../service/impl/SysMenuServiceImpl.java | 2 +- .../service/impl/SysNoticeServiceImpl.java | 2 +- .../service/impl/SysOperLogServiceImpl.java | 2 +- .../service/impl/SysOssConfigServiceImpl.java | 4 +- .../service/impl/SysOssServiceImpl.java | 2 +- .../impl/SysPermissionServiceImpl.java | 2 +- .../service/impl/SysPostServiceImpl.java | 2 +- .../service/impl/SysRoleServiceImpl.java | 2 +- .../service/impl/SysSensitiveServiceImpl.java | 2 +- .../service/impl/SysSocialServiceImpl.java | 2 +- .../impl/SysTaskAssigneeServiceImpl.java | 2 +- .../impl/SysTenantPackageServiceImpl.java | 2 +- .../service/impl/SysTenantServiceImpl.java | 2 +- .../service/impl/SysUserServiceImpl.java | 2 +- .../workflow/common/ConditionalOnEnable.java | 2 +- .../common/constant/FlowConstant.java | 2 +- .../common/enums/ButtonPermissionEnum.java | 2 +- .../common/enums/CopySettingEnum.java | 2 +- .../common/enums/MessageTypeEnum.java | 2 +- .../workflow/common/enums/NodeExtEnum.java | 2 +- .../common/enums/TaskAssigneeEnum.java | 2 +- .../common/enums/TaskAssigneeType.java | 2 +- .../workflow/common/enums/TaskStatusEnum.java | 2 +- .../workflow/common/enums/VariablesEnum.java | 2 +- .../workflow/config/WarmFlowConfig.java | 2 +- .../controller/FlwCategoryController.java | 2 +- .../controller/FlwDefinitionController.java | 2 +- .../controller/FlwInstanceController.java | 2 +- .../controller/FlwSpelController.java | 2 +- .../controller/FlwTaskController.java | 2 +- .../controller/TestLeaveController.java | 2 +- .../dromara/workflow/domain/FlowCategory.java | 2 +- .../workflow/domain/FlowInstanceBizExt.java | 2 +- .../org/dromara/workflow/domain/FlowSpel.java | 2 +- .../dromara/workflow/domain/TestLeave.java | 2 +- .../workflow/domain/bo/BackProcessBo.java | 2 +- .../workflow/domain/bo/CompleteTaskBo.java | 2 +- .../workflow/domain/bo/FlowCancelBo.java | 2 +- .../workflow/domain/bo/FlowCategoryBo.java | 2 +- .../workflow/domain/bo/FlowCopyBo.java | 2 +- .../workflow/domain/bo/FlowInstanceBo.java | 2 +- .../workflow/domain/bo/FlowInvalidBo.java | 2 +- .../workflow/domain/bo/FlowNextNodeBo.java | 2 +- .../workflow/domain/bo/FlowSpelBo.java | 2 +- .../workflow/domain/bo/FlowTaskBo.java | 2 +- .../workflow/domain/bo/FlowTerminationBo.java | 2 +- .../workflow/domain/bo/FlowUrgeTaskBo.java | 2 +- .../workflow/domain/bo/FlowVariableBo.java | 2 +- .../workflow/domain/bo/StartProcessBo.java | 2 +- .../workflow/domain/bo/TaskOperationBo.java | 2 +- .../workflow/domain/bo/TestLeaveBo.java | 2 +- .../domain/vo/ButtonPermissionVo.java | 2 +- .../workflow/domain/vo/FlowCategoryVo.java | 2 +- .../workflow/domain/vo/FlowCopyVo.java | 2 +- .../workflow/domain/vo/FlowDefinitionVo.java | 2 +- .../workflow/domain/vo/FlowHisTaskVo.java | 2 +- .../workflow/domain/vo/FlowInstanceVo.java | 2 +- .../workflow/domain/vo/FlowSpelVo.java | 2 +- .../workflow/domain/vo/FlowTaskVo.java | 2 +- .../dromara/workflow/domain/vo/NodeExtVo.java | 2 +- .../workflow/domain/vo/TestLeaveVo.java | 2 +- .../handler/FlowProcessEventHandler.java | 2 +- .../handler/WorkflowPermissionHandler.java | 2 +- .../listener/WorkflowGlobalListener.java | 2 +- .../workflow/mapper/FlwCategoryMapper.java | 2 +- .../mapper/FlwInstanceBizExtMapper.java | 2 +- .../workflow/mapper/FlwInstanceMapper.java | 2 +- .../workflow/mapper/FlwSpelMapper.java | 2 +- .../workflow/mapper/FlwTaskMapper.java | 2 +- .../workflow/mapper/TestLeaveMapper.java | 2 +- .../workflow/rule/SpelRuleComponent.java | 2 +- .../workflow/service/IFlwCategoryService.java | 2 +- .../workflow/service/IFlwCommonService.java | 2 +- .../service/IFlwDefinitionService.java | 2 +- .../workflow/service/IFlwInstanceService.java | 2 +- .../workflow/service/IFlwNodeExtService.java | 2 +- .../workflow/service/IFlwSpelService.java | 2 +- .../service/IFlwTaskAssigneeService.java | 2 +- .../workflow/service/IFlwTaskService.java | 2 +- .../workflow/service/ITestLeaveService.java | 2 +- .../impl/CategoryNameTranslationImpl.java | 2 +- .../service/impl/FlwCategoryServiceImpl.java | 2 +- .../service/impl/FlwChartExtServiceImpl.java | 2 +- .../service/impl/FlwCommonServiceImpl.java | 2 +- .../impl/FlwDefinitionServiceImpl.java | 2 +- .../service/impl/FlwInstanceServiceImpl.java | 2 +- .../service/impl/FlwNodeExtServiceImpl.java | 2 +- .../service/impl/FlwSpelServiceImpl.java | 2 +- .../impl/FlwTaskAssigneeServiceImpl.java | 2 +- .../service/impl/FlwTaskServiceImpl.java | 2 +- .../service/impl/TestLeaveServiceImpl.java | 2 +- .../service/impl/WorkflowServiceImpl.java | 2 +- docs/05-模块技术方案/会员管理/快速开始.md | 8 +- docs/05-模块技术方案/学校管理/快速开始.md | 8 +- .../开放API-学生列表授权-技术设计方案.md | 152 ++ .../开放API-学生列表授权-调用测试说明.md | 114 ++ .../开放API-学生列表授权-需求设计方案.md | 113 ++ docs/06-测试文档/UI自动化测试报告_v1.0.md | 2 +- docs/06-测试文档/最终交付测试报告_v2.0.md | 4 +- docs/06-测试文档/测试数据说明_v1.0.md | 2 +- docs/多Agent协同开发指南.md | 16 +- docs/应用管理-需求与技术设计方案.md | 1226 +++++++++++++++++ docs/应用管理使用说明.md | 118 ++ docs/应用管理技术方案.md | 417 ++++++ docs/开放接口实现说明.md | 382 +++++ docs/接口清单.md | 8 + docs/接口清单.pdf | Bin 0 -> 414135 bytes frontend/src/api/pangu/apiDict.js | 68 + .../application/components/AppDialog.vue | 61 +- frontend/src/views/application/index.vue | 97 +- frontend/src/views/business/apiDict/index.vue | 319 +++++ .../src/views/business/application/index.vue | 15 +- .../member/components/EducationDialog.vue | 8 +- .../member/components/MemberDialog.vue | 32 +- .../student/components/StudentDialog.vue | 15 +- scripts/openapi-student-list-test.sh | 37 + scripts/sql/V1.0.3__open_api_dict.sql | 44 + scripts/test/OpenApiClient.php | 238 ++++ scripts/test/README.md | 335 +++++ scripts/test/index.html | 365 +++++ scripts/test/openapi-student-list-test.php | 210 +++ scripts/test/quickstart.php | 64 + scripts/test/使用说明.txt | 188 +++ 654 files changed, 6976 insertions(+), 716 deletions(-) create mode 100644 backend/pangu-modules/pangu-business/sql/README_导入说明.md create mode 100755 backend/pangu-modules/pangu-business/sql/check_and_import.sh create mode 100644 backend/pangu-modules/pangu-business/sql/open_api_dict_data.sql create mode 100644 backend/pangu-modules/pangu-business/sql/快速导入.txt create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApiDictController.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/config/ApiAuthInterceptor.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/config/OpenApiWebMvcConfig.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiBaseController.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiStudentController.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenClassVo.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenGradeVo.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenSchoolVo.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenStudentVo.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/service/IOpenApiStudentService.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/service/impl/OpenApiStudentServiceImpl.java create mode 100644 backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/utils/DataMaskUtil.java create mode 100644 backend/pangu-modules/pangu-business/src/main/resources/mapper/application/PgAppApiMapper.xml create mode 100644 docs/05-模块技术方案/开放API-学生列表授权-技术设计方案.md create mode 100644 docs/05-模块技术方案/开放API-学生列表授权-调用测试说明.md create mode 100644 docs/05-模块技术方案/开放API-学生列表授权-需求设计方案.md create mode 100644 docs/应用管理-需求与技术设计方案.md create mode 100644 docs/应用管理使用说明.md create mode 100644 docs/应用管理技术方案.md create mode 100644 docs/开放接口实现说明.md create mode 100644 docs/接口清单.pdf create mode 100644 frontend/src/api/pangu/apiDict.js create mode 100644 frontend/src/views/business/apiDict/index.vue create mode 100755 scripts/openapi-student-list-test.sh create mode 100644 scripts/sql/V1.0.3__open_api_dict.sql create mode 100755 scripts/test/OpenApiClient.php create mode 100644 scripts/test/README.md create mode 100644 scripts/test/index.html create mode 100755 scripts/test/openapi-student-list-test.php create mode 100755 scripts/test/quickstart.php create mode 100644 scripts/test/使用说明.txt diff --git a/.cursor/rules/pangu-project.mdc b/.cursor/rules/pangu-project.mdc index 868305d..5dd6225 100644 --- a/.cursor/rules/pangu-project.mdc +++ b/.cursor/rules/pangu-project.mdc @@ -6,9 +6,9 @@ alwaysApply: true # 盘古用户平台(Pangu User Platform)项目规范 -> **项目路径**:`/Users/felix/hbxhWorkSpace/pangu-user-platform` +> **项目路径**:`/Users/felix/pgWorkSpace/pangu-user-platform` > -> **重要声明**:本规范仅适用于 pangu-user-platform 项目,不受外部工程目录(如 `/Users/felix/hbxhWorkSpace/.cursorrules`)中其他规范的影响。当本规范与外部规范冲突时,以本规范为准。 +> **重要声明**:本规范仅适用于 pangu-user-platform 项目,不受外部工程目录(如 `/Users/felix/pgWorkSpace/.cursorrules`)中其他规范的影响。当本规范与外部规范冲突时,以本规范为准。 ## 作者规范(必须遵守) diff --git a/backend/pangu-admin/src/main/java/org/dromara/DromaraApplication.java b/backend/pangu-admin/src/main/java/org/dromara/DromaraApplication.java index 8ef33fe..5c339d7 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/DromaraApplication.java +++ b/backend/pangu-admin/src/main/java/org/dromara/DromaraApplication.java @@ -7,7 +7,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt /** * 启动程序 * - * @author Lion Li + * @author pangu */ @SpringBootApplication diff --git a/backend/pangu-admin/src/main/java/org/dromara/DromaraServletInitializer.java b/backend/pangu-admin/src/main/java/org/dromara/DromaraServletInitializer.java index 066a683..e13310c 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/DromaraServletInitializer.java +++ b/backend/pangu-admin/src/main/java/org/dromara/DromaraServletInitializer.java @@ -6,7 +6,7 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer /** * web容器中进行部署 * - * @author Lion Li + * @author pangu */ public class DromaraServletInitializer extends SpringBootServletInitializer { diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/controller/AuthController.java b/backend/pangu-admin/src/main/java/org/dromara/web/controller/AuthController.java index c448a60..b3a9ef8 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -58,7 +58,7 @@ import java.util.concurrent.TimeUnit; /** * 认证 * - * @author Lion Li + * @author pangu */ @Slf4j @SaIgnore diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/backend/pangu-admin/src/main/java/org/dromara/web/controller/CaptchaController.java index 2586add..9ba3db1 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/controller/CaptchaController.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/controller/CaptchaController.java @@ -40,7 +40,7 @@ import java.util.LinkedHashMap; /** * 验证码操作处理 * - * @author Lion Li + * @author pangu */ @SaIgnore @Slf4j diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/controller/IndexController.java b/backend/pangu-admin/src/main/java/org/dromara/web/controller/IndexController.java index d26e0e1..0563d90 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/controller/IndexController.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/controller/IndexController.java @@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RestController; /** * 首页 * - * @author Lion Li + * @author pangu */ @SaIgnore @RequiredArgsConstructor diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java b/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java index 664df1e..ef28737 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java @@ -5,7 +5,7 @@ import lombok.Data; /** * 验证码信息 * - * @author Michelle.Chung + * @author pangu */ @Data public class CaptchaVo { diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java b/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java index 0a83ace..3b4139f 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java @@ -7,7 +7,7 @@ import java.util.List; /** * 登录租户对象 * - * @author Michelle.Chung + * @author pangu */ @Data public class LoginTenantVo { diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java b/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java index 834afe5..e1cf31f 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java @@ -6,7 +6,7 @@ import lombok.Data; /** * 登录验证信息 * - * @author Michelle.Chung + * @author pangu */ @Data public class LoginVo { diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java b/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java index db9c271..7294e5b 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java @@ -7,7 +7,7 @@ import lombok.Data; /** * 租户列表 * - * @author Lion Li + * @author pangu */ @Data @AutoMapper(target = SysTenantVo.class) diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/listener/UserActionListener.java b/backend/pangu-admin/src/main/java/org/dromara/web/listener/UserActionListener.java index 6c8accb..1a4e071 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/listener/UserActionListener.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/listener/UserActionListener.java @@ -27,7 +27,7 @@ import java.time.Duration; /** * 用户行为 侦听器的实现 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Component diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java b/backend/pangu-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java index a75b913..07f1540 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java @@ -10,7 +10,7 @@ import org.dromara.web.domain.vo.LoginVo; /** * 授权策略 * - * @author Michelle.Chung + * @author pangu */ public interface IAuthStrategy { diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/backend/pangu-admin/src/main/java/org/dromara/web/service/SysLoginService.java index 41a802b..4dd6af4 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -43,7 +43,7 @@ import java.util.function.Supplier; /** * 登录校验方法 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Slf4j diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/service/SysRegisterService.java b/backend/pangu-admin/src/main/java/org/dromara/web/service/SysRegisterService.java index 5a3351d..b3b818d 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/service/SysRegisterService.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/service/SysRegisterService.java @@ -27,7 +27,7 @@ import org.springframework.stereotype.Service; /** * 注册校验方法 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java index e4315dc..7b81bd6 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java @@ -33,7 +33,7 @@ import org.springframework.stereotype.Service; /** * 邮件认证策略 * - * @author Michelle.Chung + * @author pangu */ @Slf4j @Service("email" + IAuthStrategy.BASE_NAME) diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java index abf590b..8ce5961 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -36,7 +36,7 @@ import org.springframework.stereotype.Service; /** * 密码认证策略 * - * @author Michelle.Chung + * @author pangu */ @Slf4j @Service("password" + IAuthStrategy.BASE_NAME) diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java index 597a601..58f9e52 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java @@ -33,7 +33,7 @@ import org.springframework.stereotype.Service; /** * 短信认证策略 * - * @author Michelle.Chung + * @author pangu */ @Slf4j @Service("sms" + IAuthStrategy.BASE_NAME) diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java index e01666e..2333557 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java @@ -36,7 +36,7 @@ import java.util.Optional; /** * 第三方授权策略 * - * @author thiszhc is 三三 + * @author pangu */ @Slf4j @Service("social" + IAuthStrategy.BASE_NAME) diff --git a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java index f223dd8..b831b79 100644 --- a/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java +++ b/backend/pangu-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java @@ -29,7 +29,7 @@ import org.springframework.stereotype.Service; /** * 小程序认证策略 * - * @author Michelle.Chung + * @author pangu */ @Slf4j @Service("xcx" + IAuthStrategy.BASE_NAME) diff --git a/backend/pangu-admin/src/main/resources/application.yml b/backend/pangu-admin/src/main/resources/application.yml index 4bb5591..6c5fcf5 100644 --- a/backend/pangu-admin/src/main/resources/application.yml +++ b/backend/pangu-admin/src/main/resources/application.yml @@ -125,6 +125,8 @@ security: # H5公开接口 - /h5/auth/** - /h5/base/** + # 开放API(应用签名鉴权,不走登录) + - /open/api/** # 多租户配置 tenant: diff --git a/backend/pangu-admin/src/test/java/org/dromara/test/AssertUnitTest.java b/backend/pangu-admin/src/test/java/org/dromara/test/AssertUnitTest.java index dba2323..c8f9651 100644 --- a/backend/pangu-admin/src/test/java/org/dromara/test/AssertUnitTest.java +++ b/backend/pangu-admin/src/test/java/org/dromara/test/AssertUnitTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; /** * 断言单元测试案例 * - * @author Lion Li + * @author pangu */ @DisplayName("断言单元测试案例") public class AssertUnitTest { diff --git a/backend/pangu-admin/src/test/java/org/dromara/test/DemoUnitTest.java b/backend/pangu-admin/src/test/java/org/dromara/test/DemoUnitTest.java index 2d11a10..606dbd6 100644 --- a/backend/pangu-admin/src/test/java/org/dromara/test/DemoUnitTest.java +++ b/backend/pangu-admin/src/test/java/org/dromara/test/DemoUnitTest.java @@ -10,7 +10,7 @@ import java.util.concurrent.TimeUnit; /** * 单元测试案例 * - * @author Lion Li + * @author pangu */ @SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件 @DisplayName("单元测试案例") diff --git a/backend/pangu-admin/src/test/java/org/dromara/test/ParamUnitTest.java b/backend/pangu-admin/src/test/java/org/dromara/test/ParamUnitTest.java index 1db51df..2fa0468 100644 --- a/backend/pangu-admin/src/test/java/org/dromara/test/ParamUnitTest.java +++ b/backend/pangu-admin/src/test/java/org/dromara/test/ParamUnitTest.java @@ -17,7 +17,7 @@ import java.util.stream.Stream; /** * 带参数单元测试案例 * - * @author Lion Li + * @author pangu */ @DisplayName("带参数单元测试案例") public class ParamUnitTest { diff --git a/backend/pangu-admin/src/test/java/org/dromara/test/TagUnitTest.java b/backend/pangu-admin/src/test/java/org/dromara/test/TagUnitTest.java index b50afa6..7a80a4f 100644 --- a/backend/pangu-admin/src/test/java/org/dromara/test/TagUnitTest.java +++ b/backend/pangu-admin/src/test/java/org/dromara/test/TagUnitTest.java @@ -6,7 +6,7 @@ import org.springframework.boot.test.context.SpringBootTest; /** * 标签单元测试案例 * - * @author Lion Li + * @author pangu */ @SpringBootTest @DisplayName("标签单元测试案例") diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java index d9f70e4..ac974b7 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java @@ -7,7 +7,7 @@ import org.springframework.scheduling.annotation.EnableAsync; /** * 程序注解配置 * - * @author Lion Li + * @author pangu */ @AutoConfiguration @EnableAspectJAutoProxy diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java index 1cc3bd6..d0416a7 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java @@ -13,7 +13,7 @@ import java.util.concurrent.*; /** * 线程池配置 * - * @author Lion Li + * @author pangu **/ @Slf4j @AutoConfiguration diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java index ddcd836..88b2239 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java @@ -13,7 +13,7 @@ import java.util.Properties; /** * 校验框架配置类 * - * @author Lion Li + * @author pangu */ @AutoConfiguration(before = ValidationAutoConfiguration.class) public class ValidatorConfig { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java index ceb8370..21c8161 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java @@ -3,7 +3,7 @@ package org.dromara.common.core.constant; /** * 缓存的key 常量 * - * @author Lion Li + * @author pangu */ public interface CacheConstants { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index c38f39b..921b1cf 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -12,7 +12,7 @@ package org.dromara.common.core.constant; *

* 例子: test#60s、test#0#60s、test#0#1m#1000、test#1h#0#500、test#1h#0#500#0 * - * @author Lion Li + * @author pangu */ public interface CacheNames { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/Constants.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/Constants.java index 0c6671a..53894cc 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/Constants.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/Constants.java @@ -3,7 +3,7 @@ package org.dromara.common.core.constant; /** * 通用常量信息 * - * @author ruoyi + * @author pangu */ public interface Constants { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java index 5352b11..242861e 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java @@ -3,7 +3,7 @@ package org.dromara.common.core.constant; /** * 全局的key常量 (业务无关的key) * - * @author Lion Li + * @author pangu */ public interface GlobalConstants { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java index 85566e8..65a83b1 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java @@ -3,7 +3,7 @@ package org.dromara.common.core.constant; /** * 返回状态码 * - * @author Lion Li + * @author pangu */ public interface HttpStatus { /** diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java index f1e04f7..b38aea3 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java @@ -7,7 +7,7 @@ import cn.hutool.core.lang.RegexPool; *

* 常用正则表达式集合,更多正则见: https://any86.github.io/any-rule/ * - * @author Feng + * @author pangu */ public interface RegexConstants extends RegexPool { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java index e38d9fd..9b63b84 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java @@ -3,7 +3,7 @@ package org.dromara.common.core.constant; /** * 系统常量信息 * - * @author Lion Li + * @author pangu */ public interface SystemConstants { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java index 33ce0cf..ff7eb9d 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java @@ -3,7 +3,7 @@ package org.dromara.common.core.constant; /** * 租户常量信息 * - * @author Lion Li + * @author pangu */ public interface TenantConstants { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/R.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/R.java index be85805..ed44f88 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/R.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/R.java @@ -10,7 +10,7 @@ import java.io.Serializable; /** * 响应信息主体 * - * @author Lion Li + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java index 21a561e..d97b658 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java @@ -12,7 +12,7 @@ import java.util.Objects; /** * 办理任务请求对象 * - * @author may + * @author pangu */ @Data public class CompleteTaskDTO implements Serializable { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java index 7b748b0..b40f70d 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 部门 * - * @author AprilWind + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DictDataDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DictDataDTO.java index dff1a75..316d2b9 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DictDataDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DictDataDTO.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 字典数据DTO * - * @author AprilWind + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DictTypeDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DictTypeDTO.java index 43ab142..5913117 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DictTypeDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/DictTypeDTO.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 字典类型DTO * - * @author AprilWind + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java index 2f20b21..2826923 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 抄送 * - * @author may + * @author pangu */ @Data public class FlowCopyDTO implements Serializable { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowInstanceBizExtDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowInstanceBizExtDTO.java index d22937b..71706ea 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowInstanceBizExtDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowInstanceBizExtDTO.java @@ -8,7 +8,7 @@ import java.io.Serializable; /** * 流程实例业务扩展对象 * - * @author may + * @author pangu * @date 2025-08-05 */ @Data diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java index 463821c..9f48fb1 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * OSS对象 * - * @author Lion Li + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/PostDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/PostDTO.java index 7536ee3..6718c71 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/PostDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/PostDTO.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 岗位 * - * @author AprilWind + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java index d14ffbb..fbb02de 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 角色 * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java index fa35657..270057f 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java @@ -13,7 +13,7 @@ import java.util.Objects; /** * 启动流程对象 * - * @author may + * @author pangu */ @Data public class StartProcessDTO implements Serializable { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessReturnDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessReturnDTO.java index 9bcbd12..bee8961 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessReturnDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessReturnDTO.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 启动流程返回对象 * - * @author Lion Li + * @author pangu */ @Data public class StartProcessReturnDTO implements Serializable { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java index 78fb40e..0d07bf0 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java @@ -14,7 +14,7 @@ import java.util.stream.Collectors; /** * 任务受让人 * - * @author AprilWind + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/UserDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/UserDTO.java index 393a0f0..76f16a9 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/UserDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/UserDTO.java @@ -11,7 +11,7 @@ import java.util.Date; /** * 用户 * - * @author Michelle.Chung + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java index 43d8c3c..5e8f94b 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 当前在线会话 * - * @author ruoyi + * @author pangu */ @Data diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessDeleteEvent.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessDeleteEvent.java index d570c31..2cd4de9 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessDeleteEvent.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessDeleteEvent.java @@ -8,7 +8,7 @@ import java.io.Serializable; /** * 删除流程监听 * - * @author AprilWind + * @author pangu */ @Data public class ProcessDeleteEvent implements Serializable { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java index d830dbe..e49c07e 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java @@ -9,7 +9,7 @@ import java.util.Map; /** * 总体流程监听 * - * @author may + * @author pangu */ @Data public class ProcessEvent implements Serializable { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java index 0984727..43d0bbc 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java @@ -9,7 +9,7 @@ import java.util.Map; /** * 流程任务监听 * - * @author may + * @author pangu */ @Data public class ProcessTaskEvent implements Serializable { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java index ffde8c6..a33874e 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java @@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode; /** * 邮件登录对象 * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java index 63bee0d..3378b6f 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 用户登录对象 * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java index 338d4d7..d0e7da0 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java @@ -13,7 +13,7 @@ import java.util.Set; /** * 登录用户身份权限 * - * @author Lion Li + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java index 143c959..4233345 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java @@ -8,7 +8,7 @@ import org.hibernate.validator.constraints.Length; /** * 密码登录对象 * - * @author Lion Li + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java index 3f23249..45badca 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java @@ -8,7 +8,7 @@ import org.hibernate.validator.constraints.Length; /** * 用户注册对象 * - * @author Lion Li + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java index a878348..9e4f077 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; /** * 短信登录对象 * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java index 0d1b121..4b04fdc 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; /** * 三方登录对象 * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java index 0cbed2f..f7b97e3 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 任务受让人 * - * @author AprilWind + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginBody.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginBody.java index 518fe2e..fdf0e07 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginBody.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginBody.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; /** * 三方登录对象 * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java index e5f3d6c..38ac9e2 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java @@ -9,7 +9,7 @@ import java.io.Serial; /** * 小程序登录用户身份权限 * - * @author Lion Li + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index c1660ee..f1b245f 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -15,7 +15,7 @@ import java.util.stream.Collectors; /** * 业务状态枚举 * - * @author may + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java index 1667ac7..1896a3f 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java @@ -6,7 +6,7 @@ import lombok.Getter; /** * 设备类型 * - * @author Lion Li + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java index f9cac66..eb0a4df 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java @@ -6,7 +6,7 @@ import lombok.Getter; /** * 登录类型 * - * @author Lion Li + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java index be7e44d..4d36e52 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java @@ -6,7 +6,7 @@ import lombok.Getter; /** * 用户状态 * - * @author ruoyi + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/UserType.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/UserType.java index 636988f..f085452 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/UserType.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/enums/UserType.java @@ -7,7 +7,7 @@ import org.dromara.common.core.utils.StringUtils; /** * 用户类型 * - * @author Lion Li + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java index 90f5752..0599f75 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java @@ -11,7 +11,7 @@ import java.io.Serial; /** * 业务异常(支持占位符 {} ) * - * @author ruoyi + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/SseException.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/SseException.java index a76e16d..3e9f868 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/SseException.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/SseException.java @@ -10,7 +10,7 @@ import java.io.Serial; /** * sse 特制异常 * - * @author LionLi + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/base/BaseException.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/base/BaseException.java index 40ce01b..1a77c08 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/base/BaseException.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/base/BaseException.java @@ -12,7 +12,7 @@ import java.io.Serial; /** * 基础异常 * - * @author ruoyi + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileException.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileException.java index d374fc0..8f78908 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileException.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileException.java @@ -7,7 +7,7 @@ import java.io.Serial; /** * 文件信息异常类 * - * @author ruoyi + * @author pangu */ public class FileException extends BaseException { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java index af98124..53335bf 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java @@ -5,7 +5,7 @@ import java.io.Serial; /** * 文件名称超长限制异常类 * - * @author ruoyi + * @author pangu */ public class FileNameLengthLimitExceededException extends FileException { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java index 1eb8d40..3ba0c32 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java @@ -5,7 +5,7 @@ import java.io.Serial; /** * 文件名大小限制异常类 * - * @author ruoyi + * @author pangu */ public class FileSizeLimitExceededException extends FileException { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java index 43824e0..0e7688c 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java @@ -5,7 +5,7 @@ import java.io.Serial; /** * 验证码错误异常类 * - * @author ruoyi + * @author pangu */ public class CaptchaException extends UserException { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java index f4b8cac..8181be0 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java @@ -5,7 +5,7 @@ import java.io.Serial; /** * 验证码失效异常类 * - * @author ruoyi + * @author pangu */ public class CaptchaExpireException extends UserException { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java index 024fed6..abdae14 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java @@ -7,7 +7,7 @@ import java.io.Serial; /** * 用户信息异常类 * - * @author ruoyi + * @author pangu */ public class UserException extends BaseException { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java index fd907d2..8a2cb1f 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java @@ -10,7 +10,7 @@ import java.util.regex.Pattern; *

初始化的时候将正则表达式加入缓存池当中

*

提高正则表达式的性能,避免重复编译相同的正则表达式

* - * @author 21001 + * @author pangu */ public class RegexPatternPoolFactory extends PatternPool { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java index af61b90..a3a6432 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java @@ -12,7 +12,7 @@ import java.io.IOException; /** * yml 配置源工厂 * - * @author Lion Li + * @author pangu */ public class YmlPropertySourceFactory extends DefaultPropertySourceFactory { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java index 9ae52c7..9644065 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java @@ -9,7 +9,7 @@ import java.util.List; /** * 通用 参数配置服务 * - * @author Lion Li + * @author pangu */ public interface ConfigService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/DeptService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/DeptService.java index 725718a..b5e094f 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/DeptService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/DeptService.java @@ -8,7 +8,7 @@ import java.util.Map; /** * 通用 部门服务 * - * @author Lion Li + * @author pangu */ public interface DeptService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/DictService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/DictService.java index d80395c..47cfdc5 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/DictService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/DictService.java @@ -9,7 +9,7 @@ import java.util.Map; /** * 通用 字典服务 * - * @author Lion Li + * @author pangu */ public interface DictService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/OssService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/OssService.java index 1a52de0..dfdc8dd 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/OssService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/OssService.java @@ -7,7 +7,7 @@ import java.util.List; /** * 通用 OSS服务 * - * @author Lion Li + * @author pangu */ public interface OssService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java index d7db79a..c9e4de6 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java @@ -5,7 +5,7 @@ import java.util.Set; /** * 用户权限处理 * - * @author Lion Li + * @author pangu */ public interface PermissionService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/PostService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/PostService.java index 58c68d6..d91b010 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/PostService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/PostService.java @@ -6,7 +6,7 @@ import java.util.Map; /** * 通用 岗位服务 * - * @author AprilWind + * @author pangu */ public interface PostService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/RoleService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/RoleService.java index d2805b7..3929b4a 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/RoleService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/RoleService.java @@ -6,7 +6,7 @@ import java.util.Map; /** * 通用 角色服务 * - * @author AprilWind + * @author pangu */ public interface RoleService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java index 9af6691..604c371 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/TaskAssigneeService.java @@ -6,7 +6,7 @@ import org.dromara.common.core.domain.model.TaskAssigneeBody; /** * 工作流设计器获取任务执行人 * - * @author Lion Li + * @author pangu */ public interface TaskAssigneeService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/UserService.java index eefeef0..947b093 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -8,7 +8,7 @@ import java.util.Map; /** * 通用 用户服务 * - * @author Lion Li + * @author pangu */ public interface UserService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java index 8efeb76..ddc70b1 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java @@ -10,7 +10,7 @@ import java.util.Map; /** * 通用 工作流服务 * - * @author may + * @author pangu */ public interface WorkflowService { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java index 6c45085..5e922a3 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java @@ -16,7 +16,7 @@ import java.util.concurrent.TimeUnit; /** * 时间工具类 * - * @author ruoyi + * @author pangu */ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { private static final String[] PARSE_PATTERNS = { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/DesensitizedUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/DesensitizedUtils.java index 8a2ffcf..9aebafb 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/DesensitizedUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/DesensitizedUtils.java @@ -8,7 +8,7 @@ import lombok.NoArgsConstructor; /** * 脱敏工具类 * - * @author AprilWind + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DesensitizedUtils extends DesensitizedUtil { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java index b6acff7..b5de1c3 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java @@ -15,7 +15,7 @@ import java.util.Map; *

参考文档:mapstruct-plus

* * - * @author Michelle.Chung + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class MapstructUtils { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java index 48dfc08..8d7caaa 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java @@ -9,7 +9,7 @@ import org.springframework.context.i18n.LocaleContextHolder; /** * 获取i18n资源文件 * - * @author Lion Li + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class MessageUtils { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java index 72fdf40..7dc304b 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java @@ -14,7 +14,7 @@ import java.net.UnknownHostException; /** * 增强网络相关工具类 * - * @author 秋辞未寒 + * @author pangu */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ObjectUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ObjectUtils.java index 199fd82..fc58a39 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ObjectUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ObjectUtils.java @@ -9,7 +9,7 @@ import java.util.function.Function; /** * 对象工具类 * - * @author 秋辞未寒 + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ObjectUtils extends ObjectUtil { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java index 509026f..dc83df3 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java @@ -27,7 +27,7 @@ import java.util.Map; /** * 客户端工具类,提供获取请求参数、响应处理、头部信息等常用操作 * - * @author ruoyi + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ServletUtils extends JakartaServletUtil { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java index 169c6e2..5e7af64 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Component; /** * spring工具类 * - * @author Lion Li + * @author pangu */ @Component public final class SpringUtils extends SpringUtil { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java index c5487c0..611a36f 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java @@ -14,7 +14,7 @@ import java.util.stream.Collectors; /** * stream 流工具类 * - * @author Lion Li + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class StreamUtils { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java index 6eac2fc..ed1e05f 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java @@ -14,7 +14,7 @@ import java.util.stream.Collectors; /** * 字符串工具类 * - * @author Lion Li + * @author pangu */ public class StringUtils extends org.apache.commons.lang3.StringUtils { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java index 5f60ebf..7ce6bb3 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java @@ -18,7 +18,7 @@ import java.util.stream.Stream; /** * 扩展 hutool TreeUtil 封装系统树构建 * - * @author Lion Li + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class TreeBuildUtils extends TreeUtil { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java index 06b8fd6..16624dc 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java @@ -11,7 +11,7 @@ import java.util.Set; /** * Validator 校验框架工具 * - * @author Lion Li + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ValidatorUtils { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java index 573b207..13cd0fe 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java @@ -11,7 +11,7 @@ import java.nio.charset.StandardCharsets; /** * 文件处理工具类 * - * @author Lion Li + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class FileUtils extends FileUtil { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java index 23fa2cf..85e527b 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java @@ -3,7 +3,7 @@ package org.dromara.common.core.utils.file; /** * 媒体类型工具类 * - * @author ruoyi + * @author pangu */ public class MimeTypeUtils { public static final String IMAGE_PNG = "image/png"; diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java index fe36d9c..c51f5a8 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java @@ -10,7 +10,7 @@ import org.dromara.common.core.utils.StringUtils; /** * 获取地址类 * - * @author Lion Li + * @author pangu */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java index 5c74a83..c3c8e0d 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java @@ -16,7 +16,7 @@ import java.time.Duration; * 参考地址:ip2region xdb java 查询客户端实现 * xdb数据库文件下载:ip2region data * - * @author 秋辞未寒 + * @author pangu */ @Slf4j public class RegionUtils { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/reflect/ReflectUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/reflect/ReflectUtils.java index 367e8c9..f7ece8a 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/reflect/ReflectUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/reflect/ReflectUtils.java @@ -10,7 +10,7 @@ import java.lang.reflect.Method; /** * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. * - * @author Lion Li + * @author pangu */ @SuppressWarnings("rawtypes") @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java index 6dde129..eff9f1d 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java @@ -7,7 +7,7 @@ import org.dromara.common.core.constant.RegexConstants; /** * 正则相关工具类 * - * @author Feng + * @author pangu */ public final class RegexUtils extends ReUtil { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java index c0dda20..a6a8fcc 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java @@ -10,7 +10,7 @@ import java.util.regex.Pattern; * 正则字段校验器 * 主要验证字段非空、是否为满足指定格式等 * - * @author Feng + * @author pangu */ public class RegexValidator extends Validator { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java index 1020c81..02fc367 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java @@ -7,7 +7,7 @@ import org.dromara.common.core.utils.StringUtils; /** * sql操作工具类 * - * @author ruoyi + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class SqlUtil { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/AddGroup.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/AddGroup.java index 0275899..3cd7c46 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/AddGroup.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/AddGroup.java @@ -3,7 +3,7 @@ package org.dromara.common.core.validate; /** * 校验分组 add * - * @author Lion Li + * @author pangu */ public interface AddGroup { } diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java index 77c5040..8e76d87 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java @@ -3,7 +3,7 @@ package org.dromara.common.core.validate; /** * 校验分组 edit * - * @author Lion Li + * @author pangu */ public interface EditGroup { } diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java index 02a0ac2..47a4245 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java @@ -3,7 +3,7 @@ package org.dromara.common.core.validate; /** * 校验分组 query * - * @author Lion Li + * @author pangu */ public interface QueryGroup { } diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java index 73fc4c4..36f2170 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java @@ -11,7 +11,7 @@ import java.lang.annotation.Target; /** * 字典项校验注解 * - * @author AprilWind + * @author pangu */ @Constraint(validatedBy = DictPatternValidator.class) @Target({ElementType.FIELD, ElementType.PARAMETER}) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java index 558a343..b0ea707 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java @@ -9,7 +9,7 @@ import org.dromara.common.core.utils.StringUtils; /** * 自定义字典值校验器 * - * @author AprilWind + * @author pangu */ public class DictPatternValidator implements ConstraintValidator { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPattern.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPattern.java index 3d4adb9..e4aa59c 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPattern.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPattern.java @@ -11,7 +11,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * 自定义枚举校验 * - * @author 秋辞未寒 + * @author pangu * @date 2024-12-09 */ @Documented diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java index e63f44a..79672fb 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java @@ -8,7 +8,7 @@ import org.dromara.common.core.utils.reflect.ReflectUtils; /** * 自定义枚举校验注解实现 * - * @author 秋辞未寒 + * @author pangu * @date 2024-12-09 */ public class EnumPatternValidator implements ConstraintValidator { diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/xss/Xss.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/xss/Xss.java index eed495f..6c574c5 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/xss/Xss.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/xss/Xss.java @@ -10,7 +10,7 @@ import java.lang.annotation.Target; /** * 自定义xss校验注解 * - * @author Lion Li + * @author pangu */ @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) diff --git a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java index 9c32563..c5a08d2 100644 --- a/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java +++ b/backend/pangu-common/pangu-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java @@ -9,7 +9,7 @@ import jakarta.validation.ConstraintValidatorContext; /** * 自定义xss校验注解实现 * - * @author Lion Li + * @author pangu */ public class XssValidator implements ConstraintValidator { diff --git a/backend/pangu-common/pangu-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java b/backend/pangu-common/pangu-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java index 35b6ce9..b916707 100644 --- a/backend/pangu-common/pangu-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java +++ b/backend/pangu-common/pangu-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java @@ -32,7 +32,7 @@ import java.util.Set; /** * 接口文档配置 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @AutoConfiguration(before = SpringDocConfiguration.class) @@ -115,7 +115,7 @@ public class SpringDocConfig { /** * 单独使用一个类便于判断 解决springdoc路径拼接重复问题 * - * @author Lion Li + * @author pangu */ static class PlusPaths extends Paths { diff --git a/backend/pangu-common/pangu-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java b/backend/pangu-common/pangu-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java index eae3b4c..0a1c25c 100644 --- a/backend/pangu-common/pangu-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java +++ b/backend/pangu-common/pangu-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java @@ -15,7 +15,7 @@ import java.util.List; /** * swagger 配置属性 * - * @author Lion Li + * @author pangu */ @Data @ConfigurationProperties(prefix = "springdoc") diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java index 7f52de8..bd1feee 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java @@ -5,7 +5,7 @@ import java.lang.annotation.*; /** * 强制加密注解 * - * @author Michelle.Chung + * @author pangu */ @Documented @Target({ElementType.METHOD}) diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java index d357d72..97310ba 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java @@ -8,7 +8,7 @@ import java.lang.annotation.*; /** * 字段加密注解 * - * @author 老马 + * @author pangu */ @Documented @Inherited diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java index 38b22f3..b133189 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java @@ -13,7 +13,7 @@ import org.springframework.context.annotation.Bean; /** * api 解密自动配置 * - * @author wdhcr + * @author pangu */ @AutoConfiguration @EnableConfigurationProperties(ApiDecryptProperties.class) diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java index fbc4e52..9147cae 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java @@ -16,7 +16,7 @@ import org.springframework.context.annotation.Bean; /** * 加解密配置 * - * @author 老马 + * @author pangu * @version 4.6.0 */ @AutoConfiguration(after = MybatisPlusAutoConfiguration.class) diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptContext.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptContext.java index 2f02eaf..1f295ea 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptContext.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptContext.java @@ -7,7 +7,7 @@ import lombok.Data; /** * 加密上下文 用于encryptor传递必要的参数。 * - * @author 老马 + * @author pangu * @version 4.6.0 */ @Data diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java index 5e2c731..13d6ec6 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java @@ -28,7 +28,7 @@ import java.util.stream.Collectors; /** * 加密管理类 * - * @author 老马 + * @author pangu * @version 4.6.0 */ @Slf4j diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java index dbc4420..c276dd7 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java @@ -6,7 +6,7 @@ import org.dromara.common.encrypt.enumd.EncodeType; /** * 加解者 * - * @author 老马 + * @author pangu * @version 4.6.0 */ public interface IEncryptor { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java index 858d229..75577a6 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java @@ -6,7 +6,7 @@ import org.dromara.common.encrypt.core.IEncryptor; /** * 所有加密执行者的基类 * - * @author 老马 + * @author pangu * @version 4.6.0 */ public abstract class AbstractEncryptor implements IEncryptor { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AesEncryptor.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AesEncryptor.java index e4dc597..38c234b 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AesEncryptor.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AesEncryptor.java @@ -8,7 +8,7 @@ import org.dromara.common.encrypt.utils.EncryptUtils; /** * AES算法实现 * - * @author 老马 + * @author pangu * @version 4.6.0 */ public class AesEncryptor extends AbstractEncryptor { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Base64Encryptor.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Base64Encryptor.java index 0028548..c36a8ed 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Base64Encryptor.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Base64Encryptor.java @@ -8,7 +8,7 @@ import org.dromara.common.encrypt.utils.EncryptUtils; /** * Base64算法实现 * - * @author 老马 + * @author pangu * @version 4.6.0 */ public class Base64Encryptor extends AbstractEncryptor { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java index 5f03a4b..12d4ad1 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java @@ -10,7 +10,7 @@ import org.dromara.common.encrypt.utils.EncryptUtils; /** * RSA算法实现 * - * @author 老马 + * @author pangu * @version 4.6.0 */ public class RsaEncryptor extends AbstractEncryptor { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java index aec5d82..151b9b3 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java @@ -9,7 +9,7 @@ import org.dromara.common.encrypt.utils.EncryptUtils; /** * sm2算法实现 * - * @author 老马 + * @author pangu * @version 4.6.0 */ public class Sm2Encryptor extends AbstractEncryptor { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm4Encryptor.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm4Encryptor.java index adaf674..de86266 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm4Encryptor.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm4Encryptor.java @@ -8,7 +8,7 @@ import org.dromara.common.encrypt.utils.EncryptUtils; /** * sm4算法实现 * - * @author 老马 + * @author pangu * @version 4.6.0 */ public class Sm4Encryptor extends AbstractEncryptor { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java index 26ee1ee..c7900a1 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java @@ -7,7 +7,7 @@ import org.dromara.common.encrypt.core.encryptor.*; /** * 算法名称 * - * @author 老马 + * @author pangu * @version 4.6.0 */ @Getter diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java index f471221..7ba8706 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java @@ -3,7 +3,7 @@ package org.dromara.common.encrypt.enumd; /** * 编码类型 * - * @author 老马 + * @author pangu * @version 4.6.0 */ public enum EncodeType { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java index 79d58da..fb330b7 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java @@ -22,7 +22,7 @@ import java.io.IOException; /** * Crypto 过滤器 * - * @author wdhcr + * @author pangu */ public class CryptoFilter implements Filter { private final ApiDecryptProperties properties; diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java index 98f4bc7..2397675 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java @@ -18,7 +18,7 @@ import java.nio.charset.StandardCharsets; /** * 解密请求参数工具类 * - * @author wdhcr + * @author pangu */ public class DecryptRequestBodyWrapper extends HttpServletRequestWrapper { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java index 78e06ff..90c8e63 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java @@ -13,7 +13,7 @@ import java.nio.charset.StandardCharsets; /** * 加密响应参数包装类 * - * @author Michelle.Chung + * @author pangu */ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper { diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java index d5faae7..fb0bdbc 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java @@ -23,7 +23,7 @@ import java.util.*; /** * 出参解密拦截器 * - * @author 老马 + * @author pangu * @version 4.6.0 */ @Slf4j diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java index bcc2f4c..07e3cdb 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java @@ -25,7 +25,7 @@ import java.util.*; /** * 入参加密拦截器 * - * @author 老马 + * @author pangu * @version 4.6.0 */ @Slf4j diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java index 6aadb3e..2729cb1 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java @@ -5,7 +5,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; /** * api解密属性配置类 - * @author wdhcr + * @author pangu */ @Data @ConfigurationProperties(prefix = "api-decrypt") diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java index ba445c1..aa0dcc3 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java @@ -8,7 +8,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; /** * 加解密属性配置类 * - * @author 老马 + * @author pangu * @version 4.6.0 */ @Data diff --git a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java index ff0fbc8..58118e1 100644 --- a/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java +++ b/backend/pangu-common/pangu-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java @@ -16,7 +16,7 @@ import java.util.Map; /** * 安全相关工具类 * - * @author 老马 + * @author pangu */ public class EncryptUtils { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java index 6b9211b..8c26215 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java @@ -9,7 +9,7 @@ import java.lang.annotation.*; * * 需搭配 {@link CellMergeStrategy} 策略使用 * - * @author Lion Li + * @author pangu */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java index 5c51842..bd0056e 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java @@ -7,7 +7,7 @@ import java.lang.annotation.*; /** * 字典格式化 * - * @author Lion Li + * @author pangu */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDynamicOptions.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDynamicOptions.java index c26bd68..825fee0 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDynamicOptions.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDynamicOptions.java @@ -7,7 +7,7 @@ import java.lang.annotation.*; /** * Excel动态下拉选项注解 * - * @author Angus + * @author pangu */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java index 290379d..349a249 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java @@ -5,7 +5,7 @@ import java.lang.annotation.*; /** * 枚举格式化 * - * @author Liang + * @author pangu */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java index ed42371..8b15e77 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java @@ -7,7 +7,7 @@ import java.lang.annotation.Target; /** * 批注 此注解仅用于单表头 不支持多层级表头 - * @author guzhouyanyu + * @author pangu */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java index ca8083b..9522791 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java @@ -9,7 +9,7 @@ import java.lang.annotation.Target; /** * 是否必填 此注解仅用于单表头 不支持多层级表头 - * @author guzhouyanyu + * @author pangu */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java index b88c3e4..8e5363c 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java @@ -16,7 +16,7 @@ import java.math.BigDecimal; * 大数值转换 * Excel 数值长度位15位 大于15位的数值转换位字符串 * - * @author Lion Li + * @author pangu */ @Slf4j public class ExcelBigNumberConvert implements Converter { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java index c54816f..2c45f94 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java @@ -21,7 +21,7 @@ import java.lang.reflect.Field; /** * 字典格式化转换处理 * - * @author Lion Li + * @author pangu */ @Slf4j public class ExcelDictConvert implements Converter { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java index 5723e61..192406c 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java @@ -20,7 +20,7 @@ import java.util.Map; /** * 枚举格式化转换处理 * - * @author Liang + * @author pangu */ @Slf4j public class ExcelEnumConvert implements Converter { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeHandler.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeHandler.java index 6a1a3a7..e61f6a9 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeHandler.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeHandler.java @@ -17,7 +17,7 @@ import java.util.*; /** * 单元格合并处理器 * - * @author Lion Li + * @author pangu */ public class CellMergeHandler { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java index 64d8c77..b736e25 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java @@ -16,7 +16,7 @@ import java.util.List; /** * 列值重复合并策略 * - * @author Lion Li + * @author pangu */ @Slf4j public class CellMergeStrategy extends AbstractMergeStrategy implements SheetWriteHandler { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java index e715c5f..ab296df 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java @@ -19,8 +19,8 @@ import java.util.Set; /** * Excel 导入监听 * - * @author Yjoioooo - * @author Lion Li + * @author pangu + * @author pangu */ @Slf4j @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelResult.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelResult.java index 7373e12..15c821f 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelResult.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelResult.java @@ -9,8 +9,8 @@ import java.util.List; /** * 默认excel返回对象 * - * @author Yjoioooo - * @author Lion Li + * @author pangu + * @author pangu */ public class DefaultExcelResult implements ExcelResult { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DropDownOptions.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DropDownOptions.java index 7cdb5c5..cc23549 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DropDownOptions.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/DropDownOptions.java @@ -18,7 +18,7 @@ import java.util.stream.Collectors; *

Excel下拉可选项

* 注意:为确保下拉框解析正确,传值务必使用createOptionValue()做为值的拼接 * - * @author Emil.Zhang + * @author pangu */ @Data @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java index 05c79c4..4a9cf14 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java @@ -35,7 +35,7 @@ import java.util.*; *

* 即只有前1000行的数据可以用下拉框,超出的自行通过限制数据量的形式,第二次输出 * - * @author Emil.Zhang + * @author pangu */ @Slf4j public class ExcelDownHandler implements SheetWriteHandler { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java index 957b307..e72f473 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java @@ -5,7 +5,7 @@ import cn.idev.excel.read.listener.ReadListener; /** * Excel 导入监听 * - * @author Lion Li + * @author pangu */ public interface ExcelListener extends ReadListener { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelOptionsProvider.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelOptionsProvider.java index 85f939a..7514cde 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelOptionsProvider.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelOptionsProvider.java @@ -5,7 +5,7 @@ import java.util.Set; /** * Excel下拉选项数据提供接口 * - * @author Angus + * @author pangu */ public interface ExcelOptionsProvider { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java index 0c2a418..1b0706c 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java @@ -5,7 +5,7 @@ import java.util.List; /** * excel返回对象 * - * @author Lion Li + * @author pangu */ public interface ExcelResult { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java index 3770f80..89aedf6 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java @@ -24,7 +24,7 @@ import java.util.Map; /** * 批注、必填 * - * @author guzhouyanyu + * @author pangu */ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index 74dbccb..4ff8bbe 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -32,7 +32,7 @@ import java.util.function.Consumer; /** * Excel相关处理 * - * @author Lion Li + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ExcelUtil { diff --git a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelWriterWrapper.java b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelWriterWrapper.java index 396f371..114b0d3 100644 --- a/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelWriterWrapper.java +++ b/backend/pangu-common/pangu-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelWriterWrapper.java @@ -17,7 +17,7 @@ import java.util.function.Supplier; *
* 提供了一组与 ExcelWriter 一一对应的写出方法,避免直接提供 ExcelWriter 而导致的一些不可控问题(比如提前关闭了IO流等) * - * @author 秋辞未寒 + * @author pangu * @see ExcelWriter */ public record ExcelWriterWrapper(ExcelWriter excelWriter) { diff --git a/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java b/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java index 42ae802..831ffd7 100644 --- a/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java +++ b/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java @@ -6,7 +6,7 @@ import java.util.concurrent.TimeUnit; /** * 自定义注解防止表单重复提交 * - * @author Lion Li + * @author pangu */ @Inherited @Target(ElementType.METHOD) diff --git a/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java b/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java index 5a27e91..9530070 100644 --- a/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java +++ b/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java @@ -31,7 +31,7 @@ import java.util.StringJoiner; /** * 防止重复提交(参考美团GTIS防重系统) * - * @author Lion Li + * @author pangu */ @Aspect public class RepeatSubmitAspect { diff --git a/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/config/IdempotentConfig.java b/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/config/IdempotentConfig.java index fcb9d03..77987cf 100644 --- a/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/config/IdempotentConfig.java +++ b/backend/pangu-common/pangu-common-idempotent/src/main/java/org/dromara/common/idempotent/config/IdempotentConfig.java @@ -8,7 +8,7 @@ import org.springframework.data.redis.connection.RedisConfiguration; /** * 幂等功能配置 * - * @author Lion Li + * @author pangu */ @AutoConfiguration(after = RedisConfiguration.class) public class IdempotentConfig { diff --git a/backend/pangu-common/pangu-common-job/src/main/java/org/dromara/common/job/config/SnailJobConfig.java b/backend/pangu-common/pangu-common-job/src/main/java/org/dromara/common/job/config/SnailJobConfig.java index cba3753..432383c 100644 --- a/backend/pangu-common/pangu-common-job/src/main/java/org/dromara/common/job/config/SnailJobConfig.java +++ b/backend/pangu-common/pangu-common-job/src/main/java/org/dromara/common/job/config/SnailJobConfig.java @@ -15,7 +15,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; /** * 启动定时任务 * - * @author opensnail + * @author pangu * @date 2024-05-17 */ @AutoConfiguration diff --git a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java index 0392573..539be3a 100644 --- a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java +++ b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java @@ -23,7 +23,7 @@ import java.util.TimeZone; /** * jackson 配置 * - * @author Lion Li + * @author pangu */ @Slf4j @AutoConfiguration(before = JacksonAutoConfiguration.class) diff --git a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java index 8752353..ddaf367 100644 --- a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java +++ b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java @@ -10,7 +10,7 @@ import java.io.IOException; /** * 超出 JS 最大最小值 处理 * - * @author Lion Li + * @author pangu */ @JacksonStdImpl public class BigNumberSerializer extends NumberSerializer { diff --git a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java index 21c6a6a..8a00e84 100644 --- a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java +++ b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 自定义 Date 类型反序列化处理器(支持多种格式) * - * @author AprilWind + * @author pangu */ public class CustomDateDeserializer extends JsonDeserializer { diff --git a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java index 837e15d..7acbee6 100644 --- a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java +++ b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java @@ -20,7 +20,7 @@ import java.util.List; /** * JSON 工具类 * - * @author 芋道源码 + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class JsonUtils { diff --git a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonPattern.java b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonPattern.java index 9b9538f..32b45a1 100644 --- a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonPattern.java +++ b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonPattern.java @@ -8,7 +8,7 @@ import java.lang.annotation.*; /** * JSON 格式校验注解 * - * @author AprilWind + * @author pangu */ @Documented @Target({ElementType.METHOD, ElementType.FIELD}) diff --git a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonPatternValidator.java b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonPatternValidator.java index 8747fa3..386a3c5 100644 --- a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonPatternValidator.java +++ b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonPatternValidator.java @@ -8,7 +8,7 @@ import org.dromara.common.json.utils.JsonUtils; /** * JSON 格式校验器 * - * @author AprilWind + * @author pangu */ public class JsonPatternValidator implements ConstraintValidator { diff --git a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonType.java b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonType.java index 6ac53e4..2311eca 100644 --- a/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonType.java +++ b/backend/pangu-common/pangu-common-json/src/main/java/org/dromara/common/json/validate/JsonType.java @@ -6,7 +6,7 @@ import lombok.Getter; /** * JSON 类型枚举 * - * @author AprilWind + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/annotation/Log.java b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/annotation/Log.java index 2dced97..c8c6615 100644 --- a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/annotation/Log.java +++ b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/annotation/Log.java @@ -8,7 +8,7 @@ import java.lang.annotation.*; /** * 自定义操作日志记录注解 * - * @author ruoyi + * @author pangu */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java index 2c22811..d01557a 100644 --- a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java +++ b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java @@ -33,7 +33,7 @@ import java.util.*; /** * 操作日志记录处理 * - * @author Lion Li + * @author pangu */ @Slf4j @Aspect diff --git a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/BusinessStatus.java b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/BusinessStatus.java index d303dc3..0256acb 100644 --- a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/BusinessStatus.java +++ b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/BusinessStatus.java @@ -3,7 +3,7 @@ package org.dromara.common.log.enums; /** * 操作状态 * - * @author ruoyi + * @author pangu */ public enum BusinessStatus { /** diff --git a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/BusinessType.java b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/BusinessType.java index 2d25ebb..7c73d60 100644 --- a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/BusinessType.java +++ b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/BusinessType.java @@ -3,7 +3,7 @@ package org.dromara.common.log.enums; /** * 业务操作类型 * - * @author ruoyi + * @author pangu */ public enum BusinessType { /** diff --git a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java index de9328b..043e11e 100644 --- a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java +++ b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java @@ -3,7 +3,7 @@ package org.dromara.common.log.enums; /** * 操作人类别 * - * @author ruoyi + * @author pangu */ public enum OperatorType { /** diff --git a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java index 938eaad..5d1ab2e 100644 --- a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java +++ b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java @@ -10,7 +10,7 @@ import java.io.Serializable; /** * 登录事件 * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java index 0386192..1271dfe 100644 --- a/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java +++ b/backend/pangu-common/pangu-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java @@ -9,7 +9,7 @@ import java.util.Date; /** * 操作日志事件 * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-common/pangu-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java b/backend/pangu-common/pangu-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java index 0ea3007..fc10757 100644 --- a/backend/pangu-common/pangu-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java +++ b/backend/pangu-common/pangu-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java @@ -10,7 +10,7 @@ import org.springframework.context.annotation.Bean; /** * JavaMail 配置 * - * @author Michelle.Chung + * @author pangu */ @AutoConfiguration @EnableConfigurationProperties(MailProperties.class) diff --git a/backend/pangu-common/pangu-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java b/backend/pangu-common/pangu-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java index e44aa3d..e7d44b3 100644 --- a/backend/pangu-common/pangu-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java +++ b/backend/pangu-common/pangu-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java @@ -6,7 +6,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; /** * JavaMail 配置属性 * - * @author Michelle.Chung + * @author pangu */ @Data @ConfigurationProperties(prefix = "mail") diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java index 2879b9d..cee69d0 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java @@ -8,7 +8,7 @@ import java.lang.annotation.*; * 一个注解只能对应一个模板 *

* - * @author Lion Li + * @author pangu * @version 3.5.0 */ @Target(ElementType.METHOD) diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java index f5f22d5..2f4151a 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java @@ -5,7 +5,7 @@ import java.lang.annotation.*; /** * 数据权限组注解,用于标记数据权限配置数组 * - * @author Lion Li + * @author pangu * @version 3.5.0 */ @Target({ElementType.METHOD, ElementType.TYPE}) diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAdvice.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAdvice.java index 54d5ad4..841a1e9 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAdvice.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAdvice.java @@ -12,7 +12,7 @@ import java.lang.reflect.Proxy; /** * 数据权限注解Advice * - * @author 秋辞未寒 + * @author pangu */ @Slf4j public class DataPermissionAdvice implements MethodInterceptor { diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionPointcut.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionPointcut.java index 4b7d945..910aacb 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionPointcut.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionPointcut.java @@ -10,7 +10,7 @@ import java.lang.reflect.Proxy; /** * 数据权限匹配切点 * - * @author 秋辞未寒 + * @author pangu */ @Slf4j @SuppressWarnings("all") diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionPointcutAdvisor.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionPointcutAdvisor.java index 351288c..ac48072 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionPointcutAdvisor.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionPointcutAdvisor.java @@ -7,7 +7,7 @@ import org.springframework.aop.support.AbstractPointcutAdvisor; /** * 数据权限注解切面定义 * - * @author 秋辞未寒 + * @author pangu */ @SuppressWarnings("all") public class DataPermissionPointcutAdvisor extends AbstractPointcutAdvisor { diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java index b088257..511c955 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java @@ -27,7 +27,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; /** * mybatis-plus配置类(下方注释有插件介绍) * - * @author Lion Li + * @author pangu */ @Role(BeanDefinition.ROLE_INFRASTRUCTURE) @EnableTransactionManagement(proxyTargetClass = true) diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java index 13a7941..fdfa848 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java @@ -15,7 +15,7 @@ import java.util.Map; /** * Entity基类 * - * @author Lion Li + * @author pangu */ @Data public class BaseEntity implements Serializable { diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java index 24557ed..6617a2d 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java @@ -25,7 +25,7 @@ import java.util.function.Function; * * @param table 泛型 * @param vo 泛型 - * @author Lion Li + * @author pangu * @since 2021-05-13 */ @SuppressWarnings("unchecked") diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java index 1d5c3c9..4058220 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java @@ -18,7 +18,7 @@ import java.util.List; /** * 分页查询实体类 * - * @author Lion Li + * @author pangu */ @Data public class PageQuery implements Serializable { diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java index 1fe2b3e..c6b6e6c 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java @@ -13,7 +13,7 @@ import java.util.List; /** * 表格分页数据对象 * - * @author Lion Li + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java index 2d5244b..4a011c9 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java @@ -7,7 +7,7 @@ import org.dromara.common.core.utils.StringUtils; /** * 数据库类型 * - * @author Lion Li + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java index 02a5f48..81e2cd7 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java @@ -18,7 +18,7 @@ import org.dromara.common.mybatis.helper.DataPermissionHelper; * 如需扩展服务,可以通过 ISysDataScopeService 自行编写 *

* - * @author Lion Li + * @author pangu * @version 3.5.0 */ @Getter diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java index 38f7247..7fb373e 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -16,7 +16,7 @@ import java.util.Date; /** * MP注入处理器 * - * @author Lion Li + * @author pangu * @date 2021/4/25 */ @Slf4j diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java index 094785b..6d56bd1 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; /** * Mybatis异常处理器 * - * @author Lion Li + * @author pangu */ @Slf4j @RestControllerAdvice diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index 5c2ca98..1cd3b20 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -32,7 +32,7 @@ import java.util.function.Function; /** * 数据权限过滤 * - * @author Lion Li + * @author pangu * @version 3.5.0 */ @Slf4j diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusPostInitTableInfoHandler.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusPostInitTableInfoHandler.java index 60ca20b..9488977 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusPostInitTableInfoHandler.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusPostInitTableInfoHandler.java @@ -11,7 +11,7 @@ import org.dromara.common.core.utils.reflect.ReflectUtils; * 修改表信息初始化方式 * 目前用于全局修改是否使用逻辑删除 * - * @author Lion Li + * @author pangu */ public class PlusPostInitTableInfoHandler implements PostInitTableInfoHandler { diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java index 84a8a5c..171a4ed 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java @@ -18,7 +18,7 @@ import java.util.List; /** * 数据库助手 * - * @author Lion Li + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DataBaseHelper { diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java index 8963648..32c9d93 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -19,7 +19,7 @@ import java.util.function.Supplier; /** * 数据权限助手 * - * @author Lion Li + * @author pangu * @version 3.5.0 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java index b37d96e..438a1d8 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java @@ -29,7 +29,7 @@ import java.util.List; /** * 数据权限拦截器 * - * @author Lion Li + * @author pangu * @version 3.5.0 */ @Slf4j diff --git a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/utils/IdGeneratorUtil.java b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/utils/IdGeneratorUtil.java index 33b3f1c..6025e9a 100644 --- a/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/utils/IdGeneratorUtil.java +++ b/backend/pangu-common/pangu-common-mybatis/src/main/java/org/dromara/common/mybatis/utils/IdGeneratorUtil.java @@ -9,7 +9,7 @@ import org.dromara.common.core.utils.SpringUtils; /** * ID 生成工具类 * - * @author AprilWind + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class IdGeneratorUtil { diff --git a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/constant/OssConstant.java b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/constant/OssConstant.java index 9d8db93..5c82aea 100644 --- a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/constant/OssConstant.java +++ b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/constant/OssConstant.java @@ -8,7 +8,7 @@ import java.util.List; /** * 对象存储常量 * - * @author Lion Li + * @author pangu */ public interface OssConstant { diff --git a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java index 14fc4dc..0930b0e 100644 --- a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java +++ b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java @@ -43,7 +43,7 @@ import java.util.function.Consumer; * S3 存储协议 所有兼容S3协议的云厂商均支持 * 阿里云 腾讯云 七牛云 minio * - * @author AprilWind + * @author pangu */ @Slf4j public class OssClient { diff --git a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/core/WriteOutSubscriber.java b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/core/WriteOutSubscriber.java index d3a9841..09bd039 100644 --- a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/core/WriteOutSubscriber.java +++ b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/core/WriteOutSubscriber.java @@ -5,7 +5,7 @@ import java.io.IOException; /** * 写出订阅器 * - * @author 秋辞未寒 + * @author pangu */ @FunctionalInterface public interface WriteOutSubscriber { diff --git a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/entity/UploadResult.java b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/entity/UploadResult.java index 81a18e6..50c0349 100644 --- a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/entity/UploadResult.java +++ b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/entity/UploadResult.java @@ -6,7 +6,7 @@ import lombok.Data; /** * 上传返回体 * - * @author Lion Li + * @author pangu */ @Data @Builder diff --git a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/enums/AccessPolicyType.java b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/enums/AccessPolicyType.java index 45b13be..0dbb661 100644 --- a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/enums/AccessPolicyType.java +++ b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/enums/AccessPolicyType.java @@ -8,7 +8,7 @@ import software.amazon.awssdk.services.s3.model.ObjectCannedACL; /** * 桶访问策略配置 * - * @author 陈賝 + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/exception/OssException.java b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/exception/OssException.java index 52e9623..0e595b4 100644 --- a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/exception/OssException.java +++ b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/exception/OssException.java @@ -5,7 +5,7 @@ import java.io.Serial; /** * OSS异常类 * - * @author Lion Li + * @author pangu */ public class OssException extends RuntimeException { diff --git a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java index 3da1ba5..19a5e1f 100644 --- a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java +++ b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java @@ -18,7 +18,7 @@ import java.util.concurrent.locks.ReentrantLock; /** * 文件上传Factory * - * @author Lion Li + * @author pangu */ @Slf4j public class OssFactory { diff --git a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/properties/OssProperties.java b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/properties/OssProperties.java index cb37206..f6992e9 100644 --- a/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/properties/OssProperties.java +++ b/backend/pangu-common/pangu-common-oss/src/main/java/org/dromara/common/oss/properties/OssProperties.java @@ -5,7 +5,7 @@ import lombok.Data; /** * OSS对象存储 配置属性 * - * @author Lion Li + * @author pangu */ @Data public class OssProperties { diff --git a/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java b/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java index 79272d4..a1716e1 100644 --- a/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java +++ b/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java @@ -7,7 +7,7 @@ import java.lang.annotation.*; /** * 限流注解 * - * @author Lion Li + * @author pangu */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java b/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java index 2d6d82e..6833e45 100644 --- a/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java +++ b/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java @@ -30,7 +30,7 @@ import java.lang.reflect.Method; /** * 限流处理 * - * @author Lion Li + * @author pangu */ @Slf4j @Aspect diff --git a/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/config/RateLimiterConfig.java b/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/config/RateLimiterConfig.java index 4b7e5b7..0265e1c 100644 --- a/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/config/RateLimiterConfig.java +++ b/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/config/RateLimiterConfig.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.RedisConfiguration; /** - * @author guangxin + * @author pangu * @date 2023/1/18 */ @AutoConfiguration(after = RedisConfiguration.class) diff --git a/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/enums/LimitType.java b/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/enums/LimitType.java index b7f059f..a294714 100644 --- a/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/enums/LimitType.java +++ b/backend/pangu-common/pangu-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/enums/LimitType.java @@ -3,7 +3,7 @@ package org.dromara.common.ratelimiter.enums; /** * 限流类型 * - * @author ruoyi + * @author pangu */ public enum LimitType { diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/CacheConfig.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/CacheConfig.java index d57ba4e..463a698 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/CacheConfig.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/CacheConfig.java @@ -13,7 +13,7 @@ import java.util.concurrent.TimeUnit; /** * 缓存配置 * - * @author Lion Li + * @author pangu */ @AutoConfiguration @EnableCaching diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java index 4c39196..8dc9122 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java @@ -30,7 +30,7 @@ import java.util.TimeZone; /** * redis配置 * - * @author Lion Li + * @author pangu */ @Slf4j @AutoConfiguration diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java index ebec786..52b377b 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java @@ -9,7 +9,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; /** * Redisson 配置属性 * - * @author Lion Li + * @author pangu */ @Data @ConfigurationProperties(prefix = "redisson") diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java index 3bf3e34..8d199f2 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/handler/KeyPrefixHandler.java @@ -6,7 +6,7 @@ import org.redisson.api.NameMapper; /** * redis缓存key前缀处理 * - * @author ye + * @author pangu * @date 2022/7/14 17:44 * @since 4.3.0 */ diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/handler/RedisExceptionHandler.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/handler/RedisExceptionHandler.java index 5e904f3..a4fe58a 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/handler/RedisExceptionHandler.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/handler/RedisExceptionHandler.java @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; /** * Redis异常处理器 * - * @author AprilWind + * @author pangu */ @Slf4j @RestControllerAdvice diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java index 8662c53..8ff21d9 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java @@ -8,7 +8,7 @@ import java.util.concurrent.Callable; /** * Cache 装饰器模式(用于扩展 Caffeine 一级缓存) * - * @author LionLi + * @author pangu */ public class CaffeineCacheDecorator implements Cache { diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java index 8428ef7..2de71e2 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java @@ -39,7 +39,7 @@ import java.util.concurrent.ConcurrentMap; * 修改 RedissonSpringCacheManager 源码 * 重写 cacheName 处理方法 支持多参数 * - * @author Nikita Koksharov + * @author pangu * */ @SuppressWarnings("unchecked") diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java index 865ffa5..b2da919 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java @@ -9,7 +9,7 @@ import org.springframework.cache.CacheManager; /** * 缓存操作工具类 * - * @author Michelle.Chung + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) @SuppressWarnings(value = {"unchecked"}) diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java index 5b1c7f7..bcacd28 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java @@ -14,7 +14,7 @@ import java.util.function.Function; * 轻量级队列 重量级数据量 请使用 MQ * 要求 redis 5.X 以上 * - * @author Lion Li + * @author pangu * @version 3.6.0 新增 * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java index c433bff..135c2ad 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java @@ -18,7 +18,7 @@ import java.util.stream.Stream; /** * redis 工具类 * - * @author Lion Li + * @author pangu * @version 3.1.0 新增 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java index a3d0bad..9e8d693 100644 --- a/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java +++ b/backend/pangu-common/pangu-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java @@ -18,7 +18,7 @@ import java.time.temporal.TemporalAccessor; /** * 发号器工具类 * - * @author 秋辞未寒 + * @author pangu * @date 2024-12-10 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java index 61c6b9a..d03ea36 100644 --- a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java +++ b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java @@ -15,7 +15,7 @@ import org.springframework.context.annotation.PropertySource; /** * sa-token 配置 * - * @author Lion Li + * @author pangu */ @AutoConfiguration @PropertySource(value = "classpath:common-satoken.yml", factory = YmlPropertySourceFactory.class) diff --git a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java index 14abf89..d6c9416 100644 --- a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java +++ b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; *

* SaTokenDaoBySessionFollowObject 是 SaTokenDao 子集简化了session方法处理 * - * @author Lion Li + * @author pangu */ public class PlusSaTokenDao implements SaTokenDaoBySessionFollowObject { diff --git a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java index c9f8c8c..25b55f3 100644 --- a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java +++ b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java @@ -17,7 +17,7 @@ import java.util.List; /** * sa-token 权限管理实现类 * - * @author Lion Li + * @author pangu */ public class SaPermissionImpl implements StpInterface { diff --git a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/handler/SaTokenExceptionHandler.java b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/handler/SaTokenExceptionHandler.java index a45af89..ae1dd91 100644 --- a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/handler/SaTokenExceptionHandler.java +++ b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/handler/SaTokenExceptionHandler.java @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; /** * SaToken异常处理器 * - * @author Lion Li + * @author pangu */ @Slf4j @RestControllerAdvice diff --git a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index 730bae2..8fcf5f9 100644 --- a/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/backend/pangu-common/pangu-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -26,7 +26,7 @@ import java.util.Set; * 多用户体系 针对 多种用户类型 但权限控制不一致 * 可以组成 多用户类型表与多设备类型 分别控制权限 * - * @author Lion Li + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class LoginHelper { diff --git a/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java b/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java index 655b0ee..8f81b1e 100644 --- a/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java +++ b/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java @@ -29,7 +29,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * 权限安全配置 * - * @author Lion Li + * @author pangu */ @Slf4j @@ -47,6 +47,7 @@ public class SecurityConfig implements WebMvcConfigurer { */ @Override public void addInterceptors(InterceptorRegistry registry) { + log.info(">>> SecurityConfig 排除路径配置: {}", java.util.Arrays.toString(securityProperties.getExcludes())); // 注册路由拦截器,自定义验证规则 registry.addInterceptor(new SaInterceptor(handler -> { AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class); diff --git a/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/config/properties/SecurityProperties.java b/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/config/properties/SecurityProperties.java index be1cc6e..a0af726 100644 --- a/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/config/properties/SecurityProperties.java +++ b/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/config/properties/SecurityProperties.java @@ -6,7 +6,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; /** * Security 配置属性 * - * @author Lion Li + * @author pangu */ @Data @ConfigurationProperties(prefix = "security") diff --git a/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/handler/AllUrlHandler.java b/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/handler/AllUrlHandler.java index a0c6ada..4f2c450 100644 --- a/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/handler/AllUrlHandler.java +++ b/backend/pangu-common/pangu-common-security/src/main/java/org/dromara/common/security/handler/AllUrlHandler.java @@ -14,7 +14,7 @@ import java.util.regex.Pattern; /** * 获取所有Url配置 * - * @author Lion Li + * @author pangu */ @Data public class AllUrlHandler implements InitializingBean { diff --git a/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java b/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java index e75dc5b..90a2b38 100644 --- a/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java +++ b/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java @@ -13,7 +13,7 @@ import java.lang.annotation.Target; /** * 数据脱敏注解 * - * @author zhujie + * @author pangu */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) diff --git a/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java b/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java index 03a7f9c..239679b 100644 --- a/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java +++ b/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java @@ -5,7 +5,7 @@ package org.dromara.common.sensitive.core; * 默认管理员不过滤 * 需自行根据业务重写实现 * - * @author Lion Li + * @author pangu * @version 3.6.0 */ public interface SensitiveService { diff --git a/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java b/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java index 30de412..5936c7c 100644 --- a/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java +++ b/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java @@ -10,7 +10,7 @@ import java.util.function.Function; /** * 脱敏策略 * - * @author Yjoioooo + * @author pangu * @version 3.6.0 */ @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java b/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java index d454724..9c573d5 100644 --- a/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java +++ b/backend/pangu-common/pangu-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java @@ -20,7 +20,7 @@ import java.util.Objects; /** * 数据脱敏json序列化工具 * - * @author Yjoioooo + * @author pangu */ @Slf4j public class SensitiveHandler extends JsonSerializer implements ContextualSerializer { diff --git a/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java b/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java index 3a39cc2..6408727 100644 --- a/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java +++ b/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java @@ -11,7 +11,7 @@ import org.springframework.context.annotation.Primary; /** * 短信配置类 * - * @author Feng + * @author pangu */ @AutoConfiguration(after = {RedisAutoConfiguration.class}) public class SmsAutoConfiguration { diff --git a/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java b/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java index a757655..7b1b8de 100644 --- a/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java +++ b/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java @@ -10,7 +10,7 @@ import java.time.Duration; * SmsDao缓存配置 (使用框架自带RedisUtils实现 协议统一) *

主要用于短信重试和拦截的缓存 * - * @author Feng + * @author pangu */ public class PlusSmsDao implements SmsDao { @@ -54,7 +54,7 @@ public class PlusSmsDao implements SmsDao { * * @param key 缓存键 * @return 被删除的value - * @author :Wind + * @author pangu */ @Override public Object remove(String key) { diff --git a/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/handler/SmsExceptionHandler.java b/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/handler/SmsExceptionHandler.java index 2c619a3..e5f16ac 100644 --- a/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/handler/SmsExceptionHandler.java +++ b/backend/pangu-common/pangu-common-sms/src/main/java/org/dromara/common/sms/handler/SmsExceptionHandler.java @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; /** * SMS异常处理器 * - * @author AprilWind + * @author pangu */ @Slf4j @RestControllerAdvice diff --git a/backend/pangu-common/pangu-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java b/backend/pangu-common/pangu-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java index f2a1f7b..8ce38dc 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java @@ -19,7 +19,7 @@ import me.zhyd.oauth.utils.UrlBuilder; * 企业微信登录父类 *

* - * @author liguanhua (347826496(a)qq.com) + * @author pangu * @since 1.15.9 */ public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultRequest { diff --git a/backend/pangu-common/pangu-common-social/src/main/java/me/zhyd/oauth/request/AuthDingTalkV2Request.java b/backend/pangu-common/pangu-common-social/src/main/java/me/zhyd/oauth/request/AuthDingTalkV2Request.java index 86532d4..7a991f8 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/me/zhyd/oauth/request/AuthDingTalkV2Request.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/me/zhyd/oauth/request/AuthDingTalkV2Request.java @@ -21,7 +21,7 @@ import java.util.Map; /** * 新版钉钉二维码登录 * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @author pangu * @since 1.16.7 */ public class AuthDingTalkV2Request extends AuthDefaultRequest { diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java index 19b39d8..b9e8927 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java @@ -9,7 +9,7 @@ import org.springframework.context.annotation.Bean; /** * Social 配置属性 - * @author thiszhc + * @author pangu */ @AutoConfiguration @EnableConfigurationProperties(SocialProperties.class) diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java index 667be4d..545757e 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java @@ -7,7 +7,7 @@ import java.util.List; /** * 社交登录配置 * - * @author thiszhc + * @author pangu */ @Data public class SocialLoginConfigProperties { diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java index 1487a6a..fdd3a5d 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java @@ -9,7 +9,7 @@ import java.util.Map; /** * Social 配置属性 * - * @author thiszhc + * @author pangu */ @Data @Component diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java index d3fc751..0903184 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java @@ -15,7 +15,7 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.json.utils.JsonUtils; /** - * @author lcry + * @author pangu */ @Slf4j public class AuthGiteaRequest extends AuthDefaultRequest { diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java index 201b223..dae0e7f 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java @@ -6,7 +6,7 @@ import me.zhyd.oauth.request.AuthDefaultRequest; /** * gitea Oauth2 默认接口说明 * - * @author lcry + * @author pangu */ public enum AuthGiteaSource implements AuthSource { diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java index 97774ac..3eb7162 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java @@ -12,7 +12,7 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.json.utils.JsonUtils; /** - * @author 长春叭哥 2023年03月26日 + * @author pangu */ public class AuthMaxKeyRequest extends AuthDefaultRequest { diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java index 1ff57f7..0aa26f6 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java @@ -6,7 +6,7 @@ import me.zhyd.oauth.request.AuthDefaultRequest; /** * Oauth2 默认接口说明 * - * @author 长春叭哥 2023年03月26日 + * @author pangu * */ public enum AuthMaxKeySource implements AuthSource { diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java index 080c97a..fa4fc39 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java @@ -24,7 +24,7 @@ import static org.dromara.common.social.topiam.AuthTopIamSource.TOPIAM; /** * TopIAM 认证请求 * - * @author xlsea + * @author pangu * @since 2024-01-06 */ @Slf4j diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamSource.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamSource.java index 852d7f5..1b3aef7 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamSource.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamSource.java @@ -6,7 +6,7 @@ import me.zhyd.oauth.request.AuthDefaultRequest; /** * Oauth2 默认接口说明 * - * @author xlsea + * @author pangu * @since 2024-01-06 */ public enum AuthTopIamSource implements AuthSource { diff --git a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java index df21aa8..7f2fce7 100644 --- a/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java +++ b/backend/pangu-common/pangu-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java @@ -17,7 +17,7 @@ import org.dromara.common.social.topiam.AuthTopIamRequest; /** * 认证授权工具类 * - * @author thiszhc + * @author pangu */ public class SocialUtils { diff --git a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java index 0cf8054..c72f23a 100644 --- a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java +++ b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java @@ -11,7 +11,7 @@ import org.springframework.context.annotation.Bean; /** * SSE 自动装配 * - * @author Lion Li + * @author pangu */ @AutoConfiguration @ConditionalOnProperty(value = "sse.enabled", havingValue = "true") diff --git a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java index ce4e173..73322a6 100644 --- a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java +++ b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java @@ -6,7 +6,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; /** * SSE 配置项 * - * @author Lion Li + * @author pangu */ @Data @ConfigurationProperties("sse") diff --git a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java index f77b5b5..95bb3c9 100644 --- a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java +++ b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -16,7 +16,7 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; /** * SSE 控制器 * - * @author Lion Li + * @author pangu */ @RestController @ConditionalOnProperty(value = "sse.enabled", havingValue = "true") diff --git a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index b80e561..e641abb 100644 --- a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -21,7 +21,7 @@ import java.util.function.Consumer; /** * 管理 Server-Sent Events (SSE) 连接 * - * @author Lion Li + * @author pangu */ @Slf4j public class SseEmitterManager { diff --git a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java index a2e1210..c2d03a1 100644 --- a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java +++ b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java @@ -9,7 +9,7 @@ import java.util.List; /** * 消息的dto * - * @author zendwang + * @author pangu */ @Data public class SseMessageDto implements Serializable { diff --git a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java index 7a4dff1..006c175 100644 --- a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java +++ b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java @@ -11,7 +11,7 @@ import org.springframework.core.Ordered; /** * SSE 主题订阅监听器 * - * @author Lion Li + * @author pangu */ @Slf4j public class SseTopicListener implements ApplicationRunner, Ordered { diff --git a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java index ce3aad4..4bde476 100644 --- a/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java +++ b/backend/pangu-common/pangu-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java @@ -10,7 +10,7 @@ import org.dromara.common.sse.dto.SseMessageDto; /** * SSE工具类 * - * @author Lion Li + * @author pangu */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java index 3767fa2..e953f30 100644 --- a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java +++ b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java @@ -25,7 +25,7 @@ import org.springframework.context.annotation.Primary; /** * 租户配置类 * - * @author Lion Li + * @author pangu */ @EnableConfigurationProperties(TenantProperties.class) @AutoConfiguration(after = {RedisConfig.class}) diff --git a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantEntity.java b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantEntity.java index 8ad0d2c..b794667 100644 --- a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantEntity.java +++ b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantEntity.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; /** * 租户基类 * - * @author Michelle.Chung + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java index 9aaa753..c4ed004 100644 --- a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java +++ b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java @@ -10,7 +10,7 @@ import java.util.List; /** * SaToken 认证数据持久层 适配多租户 * - * @author Lion Li + * @author pangu */ public class TenantSaTokenDao extends PlusSaTokenDao { diff --git a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/exception/TenantException.java b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/exception/TenantException.java index ee2bc97..5ac3f73 100644 --- a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/exception/TenantException.java +++ b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/exception/TenantException.java @@ -7,7 +7,7 @@ import java.io.Serial; /** * 租户异常类 * - * @author Lion Li + * @author pangu */ public class TenantException extends BaseException { diff --git a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java index f6d224b..8f224fd 100644 --- a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java +++ b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java @@ -16,7 +16,7 @@ import java.util.List; /** * 自定义租户处理器 * - * @author Lion Li + * @author pangu */ @Slf4j @AllArgsConstructor diff --git a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java index dcdef6e..a6354be 100644 --- a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java +++ b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java @@ -10,7 +10,7 @@ import org.dromara.common.tenant.helper.TenantHelper; /** * 多租户redis缓存key前缀处理 * - * @author Lion Li + * @author pangu */ @Slf4j public class TenantKeyPrefixHandler extends KeyPrefixHandler { diff --git a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index 98f03f3..b93b140 100644 --- a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -23,7 +23,7 @@ import java.util.function.Supplier; /** * 租户助手 * - * @author Lion Li + * @author pangu */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java index 346e36f..153d3dc 100644 --- a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java +++ b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java @@ -11,7 +11,7 @@ import org.springframework.cache.Cache; /** * 重写 cacheName 处理方法 支持多租户 * - * @author Lion Li + * @author pangu */ @Slf4j public class TenantSpringCacheManager extends PlusSpringCacheManager { diff --git a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/properties/TenantProperties.java b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/properties/TenantProperties.java index 1675ccf..83edce7 100644 --- a/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/properties/TenantProperties.java +++ b/backend/pangu-common/pangu-common-tenant/src/main/java/org/dromara/common/tenant/properties/TenantProperties.java @@ -8,7 +8,7 @@ import java.util.List; /** * 租户 配置属性 * - * @author Lion Li + * @author pangu */ @Data @ConfigurationProperties(prefix = "tenant") diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java index c24aa6f..21a2c2b 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java @@ -9,7 +9,7 @@ import java.lang.annotation.*; /** * 通用翻译注解 * - * @author Lion Li + * @author pangu */ @Inherited @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java index 43bfab0..d20ae86 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java @@ -7,7 +7,7 @@ import java.lang.annotation.*; /** * 翻译类型注解 (标注到{@link TranslationInterface} 的实现类) * - * @author Lion Li + * @author pangu */ @Inherited @Retention(RetentionPolicy.RUNTIME) diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java index 5dcd0c1..908c67b 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java @@ -17,7 +17,7 @@ import java.util.Map; /** * 翻译模块配置类 * - * @author Lion Li + * @author pangu */ @Slf4j @AutoConfiguration diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java index c084ea1..556380d 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java @@ -3,7 +3,7 @@ package org.dromara.common.translation.constant; /** * 翻译常量 * - * @author Lion Li + * @author pangu */ public interface TransConstant { diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java index e4d6dd3..cb94c8f 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java @@ -5,7 +5,7 @@ import org.dromara.common.translation.annotation.TranslationType; /** * 翻译接口 (实现类需标注 {@link TranslationType} 注解标明翻译类型) * - * @author Lion Li + * @author pangu */ public interface TranslationInterface { diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java index 727672f..99afcfe 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java @@ -10,7 +10,7 @@ import java.util.List; /** * Bean 序列化修改器 解决 Null 被单独处理问题 * - * @author Lion Li + * @author pangu */ public class TranslationBeanSerializerModifier extends BeanSerializerModifier { diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java index e8c03ac..c441c5a 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java @@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * 翻译处理器 * - * @author Lion Li + * @author pangu */ @Slf4j public class TranslationHandler extends JsonSerializer implements ContextualSerializer { diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/DeptNameTranslationImpl.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/DeptNameTranslationImpl.java index c391437..6307776 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/DeptNameTranslationImpl.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/DeptNameTranslationImpl.java @@ -9,7 +9,7 @@ import lombok.AllArgsConstructor; /** * 部门翻译实现 * - * @author Lion Li + * @author pangu */ @AllArgsConstructor @TranslationType(type = TransConstant.DEPT_ID_TO_NAME) diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java index 859a93e..92edec8 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java @@ -10,7 +10,7 @@ import lombok.AllArgsConstructor; /** * 字典翻译实现 * - * @author Lion Li + * @author pangu */ @AllArgsConstructor @TranslationType(type = TransConstant.DICT_TYPE_TO_LABEL) diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java index d1720f7..3ef382e 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java @@ -9,7 +9,7 @@ import org.dromara.common.translation.core.TranslationInterface; /** * 用户名称翻译实现 * - * @author may + * @author pangu */ @AllArgsConstructor @TranslationType(type = TransConstant.USER_ID_TO_NICKNAME) diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java index fc6f6df..d0f38b3 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java @@ -9,7 +9,7 @@ import lombok.AllArgsConstructor; /** * OSS翻译实现 * - * @author Lion Li + * @author pangu */ @AllArgsConstructor @TranslationType(type = TransConstant.OSS_ID_TO_URL) diff --git a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java index 5fc7773..720029c 100644 --- a/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java +++ b/backend/pangu-common/pangu-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java @@ -10,7 +10,7 @@ import lombok.AllArgsConstructor; /** * 用户名翻译实现 * - * @author Lion Li + * @author pangu */ @AllArgsConstructor @TranslationType(type = TransConstant.USER_ID_TO_NAME) diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/CaptchaConfig.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/CaptchaConfig.java index 7140db9..4efa8c1 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/CaptchaConfig.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/CaptchaConfig.java @@ -7,7 +7,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties /** * 验证码配置 * - * @author Lion Li + * @author pangu */ @AutoConfiguration @EnableConfigurationProperties(CaptchaProperties.class) diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java index 155a8d0..04ba4d9 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java @@ -14,7 +14,7 @@ import org.springframework.context.annotation.Bean; /** * Filter配置 * - * @author Lion Li + * @author pangu */ @AutoConfiguration @EnableConfigurationProperties(XssProperties.class) diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java index 4e212cb..ca2cb82 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java @@ -9,7 +9,7 @@ import org.springframework.web.servlet.LocaleResolver; /** * 国际化配置 * - * @author Lion Li + * @author pangu */ @AutoConfiguration(before = WebMvcAutoConfiguration.class) public class I18nConfig { diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java index 81ec905..cf077a7 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java @@ -20,7 +20,7 @@ import java.util.Date; /** * 通用配置 * - * @author Lion Li + * @author pangu */ @AutoConfiguration public class ResourcesConfig implements WebMvcConfigurer { diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java index 84f88ff..cbfafae 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java @@ -13,7 +13,7 @@ import org.springframework.core.task.VirtualThreadTaskExecutor; /** * Undertow 自定义配置 * - * @author Lion Li + * @author pangu */ @AutoConfiguration public class UndertowConfig implements WebServerFactoryCustomizer { diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java index 6dcfe64..9dc0534 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java @@ -6,7 +6,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; /** * 验证码 配置属性 * - * @author Lion Li + * @author pangu */ @Data @ConfigurationProperties(prefix = "captcha") diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java index bd3e59b..978e6da 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java @@ -9,7 +9,7 @@ import java.util.List; /** * xss过滤 配置属性 * - * @author Lion Li + * @author pangu */ @Data @ConfigurationProperties(prefix = "xss") diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/BaseController.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/BaseController.java index fd01dda..3b27e2e 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/BaseController.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/BaseController.java @@ -6,7 +6,7 @@ import org.dromara.common.core.utils.StringUtils; /** * web层通用数据处理 * - * @author Lion Li + * @author pangu */ public class BaseController { diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java index 98ddd06..9da65ce 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java @@ -9,7 +9,7 @@ import java.util.Locale; /** * 获取请求头国际化信息 * - * @author Lion Li + * @author pangu */ public class I18nLocaleResolver implements LocaleResolver { diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/WaveAndCircleCaptcha.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/WaveAndCircleCaptcha.java index 8b37be4..c896fe7 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/WaveAndCircleCaptcha.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/core/WaveAndCircleCaptcha.java @@ -16,7 +16,7 @@ import java.util.concurrent.ThreadLocalRandom; /** * 带干扰线、波浪、圆的验证码 * - * @author Lion Li + * @author pangu */ public class WaveAndCircleCaptcha extends AbstractCaptcha { diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/RepeatableFilter.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/RepeatableFilter.java index e0a3bf2..e0cdf6b 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/RepeatableFilter.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/RepeatableFilter.java @@ -10,7 +10,7 @@ import java.io.IOException; /** * Repeatable 过滤器 * - * @author ruoyi + * @author pangu */ public class RepeatableFilter implements Filter { @Override diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/RepeatedlyRequestWrapper.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/RepeatedlyRequestWrapper.java index 8933225..5fa6e87 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/RepeatedlyRequestWrapper.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/RepeatedlyRequestWrapper.java @@ -17,7 +17,7 @@ import java.io.InputStreamReader; /** * 构建可重复读取inputStream的request * - * @author ruoyi + * @author pangu */ public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper { private final byte[] body; diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java index 95bcdd9..9bec895 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java @@ -15,7 +15,7 @@ import java.util.List; /** * 防止XSS攻击的过滤器 * - * @author ruoyi + * @author pangu */ public class XssFilter implements Filter { /** diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java index 914e549..5cf73a0 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java @@ -22,7 +22,7 @@ import java.util.Map; /** * XSS过滤处理 * - * @author ruoyi + * @author pangu */ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { /** diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java index 7a5d82c..a939802 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java @@ -35,7 +35,7 @@ import java.io.IOException; /** * 全局异常处理器 * - * @author Lion Li + * @author pangu */ @Slf4j @RestControllerAdvice diff --git a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java index b56cec1..0bad0f5 100644 --- a/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java +++ b/backend/pangu-common/pangu-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java @@ -28,7 +28,7 @@ import java.util.Set; /** * web的调用时间统计拦截器 * - * @author Lion Li + * @author pangu * @since 3.3.0 */ @Slf4j diff --git a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java index ef5cfc9..af7fbf0 100644 --- a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java +++ b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java @@ -17,7 +17,7 @@ import org.springframework.web.socket.server.HandshakeInterceptor; /** * WebSocket 配置 * - * @author zendwang + * @author pangu */ @AutoConfiguration @ConditionalOnProperty(value = "websocket.enabled", havingValue = "true") diff --git a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/config/properties/WebSocketProperties.java b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/config/properties/WebSocketProperties.java index d629fe5..7e2ff30 100644 --- a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/config/properties/WebSocketProperties.java +++ b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/config/properties/WebSocketProperties.java @@ -6,7 +6,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; /** * WebSocket 配置项 * - * @author zendwang + * @author pangu */ @ConfigurationProperties("websocket") @Data diff --git a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java index e243279..c02ed3f 100644 --- a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java +++ b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java @@ -3,7 +3,7 @@ package org.dromara.common.websocket.constant; /** * websocket的常量配置 * - * @author zendwang + * @author pangu */ public interface WebSocketConstants { diff --git a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDto.java b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDto.java index e2d4456..a68943f 100644 --- a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDto.java +++ b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDto.java @@ -9,7 +9,7 @@ import java.util.List; /** * 消息的dto * - * @author zendwang + * @author pangu */ @Data public class WebSocketMessageDto implements Serializable { diff --git a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java index 3b6e076..75c1cfb 100644 --- a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java +++ b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java @@ -18,7 +18,7 @@ import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USE /** * WebSocketHandler 实现类 * - * @author zendwang + * @author pangu */ @Slf4j public class PlusWebSocketHandler extends AbstractWebSocketHandler { diff --git a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java index 9c2372b..d436dc5 100644 --- a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java +++ b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java @@ -12,7 +12,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * WebSocketSession 用于保存当前所有在线的会话信息 * - * @author zendwang + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WebSocketSessionHolder { diff --git a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java index c70e377..549969e 100644 --- a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java +++ b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java @@ -19,7 +19,7 @@ import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USE /** * WebSocket握手请求的拦截器 * - * @author zendwang + * @author pangu */ @Slf4j public class PlusWebSocketInterceptor implements HandshakeInterceptor { diff --git a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java index 0ad39af..f496362 100644 --- a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java +++ b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java @@ -11,7 +11,7 @@ import org.springframework.core.Ordered; /** * WebSocket 主题订阅监听器 * - * @author zendwang + * @author pangu */ @Slf4j public class WebSocketTopicListener implements ApplicationRunner, Ordered { diff --git a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java index afe76e0..3bb49f6 100644 --- a/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java +++ b/backend/pangu-common/pangu-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java @@ -22,7 +22,7 @@ import static org.dromara.common.websocket.constant.WebSocketConstants.WEB_SOCKE /** * 工具类 * - * @author zendwang + * @author pangu */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/MonitorAdminApplication.java b/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/MonitorAdminApplication.java index a733561..b3b7faa 100644 --- a/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/MonitorAdminApplication.java +++ b/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/MonitorAdminApplication.java @@ -7,7 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; /** * Admin 监控启动程序 * - * @author Lion Li + * @author pangu */ @EnableAdminServer @SpringBootApplication diff --git a/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java b/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java index 41372f2..563173e 100644 --- a/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java +++ b/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java @@ -15,7 +15,7 @@ import org.springframework.security.web.servlet.util.matcher.PathPatternRequestM /** * admin 监控 安全配置 * - * @author Lion Li + * @author pangu */ @EnableWebSecurity @Configuration diff --git a/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java b/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java index 838eefc..9e6fd56 100644 --- a/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java +++ b/backend/pangu-extend/pangu-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java @@ -14,7 +14,7 @@ import static de.codecentric.boot.admin.server.domain.values.StatusInfo.*; /** * 自定义事件通知处理 * - * @author Lion Li + * @author pangu */ @Slf4j @Component diff --git a/backend/pangu-extend/pangu-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java b/backend/pangu-extend/pangu-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java index 5196c77..c08c179 100644 --- a/backend/pangu-extend/pangu-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java +++ b/backend/pangu-extend/pangu-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java @@ -8,7 +8,7 @@ import org.springframework.context.annotation.Configuration; /** * 权限安全配置 * - * @author Lion Li + * @author pangu */ @Configuration public class SecurityConfig { diff --git a/backend/pangu-extend/pangu-snailjob-server/src/main/java/org/dromara/snailjob/SnailJobServerApplication.java b/backend/pangu-extend/pangu-snailjob-server/src/main/java/org/dromara/snailjob/SnailJobServerApplication.java index dfab068..b00ecd3 100644 --- a/backend/pangu-extend/pangu-snailjob-server/src/main/java/org/dromara/snailjob/SnailJobServerApplication.java +++ b/backend/pangu-extend/pangu-snailjob-server/src/main/java/org/dromara/snailjob/SnailJobServerApplication.java @@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; /** * SnailJob Server 启动程序 * - * @author opensnail + * @author pangu * @date 2024-05-17 */ @SpringBootApplication diff --git a/backend/pangu-modules/pangu-business/sql/README_导入说明.md b/backend/pangu-modules/pangu-business/sql/README_导入说明.md new file mode 100644 index 0000000..d1418cb --- /dev/null +++ b/backend/pangu-modules/pangu-business/sql/README_导入说明.md @@ -0,0 +1,216 @@ +# 应用管理模块 - 数据库导入说明 + +## 📋 SQL 文件清单 + +| 文件名 | 说明 | 执行顺序 | +|--------|------|---------| +| `pangu_tables.sql` | 表结构(pg_application, pg_api_dict, pg_app_api) | ① 必须 | +| `pangu_menu.sql` | 菜单数据(应用管理菜单及权限) | ② 必须 | +| `open_api_dict_data.sql` | API 字典初始数据(学生列表接口) | ③ 必须 | + +--- + +## 🚀 方式一:自动检查并导入(推荐) + +使用提供的自动化脚本,会自动检查表和数据是否存在,缺失则自动导入。 + +### 步骤: + +```bash +cd /Users/felix/pgWorkSpace/pangu-user-platform/backend/pangu-modules/pangu-business/sql + +# 基本用法(使用默认配置) +./check_and_import.sh -p your_password + +# 指定完整配置 +./check_and_import.sh -h 8.148.25.55 -P 3306 -d pguser-db -u root -p your_password +``` + +### 参数说明: + +| 参数 | 说明 | 默认值 | +|------|------|--------| +| -h, --host | 数据库主机 | 8.148.25.55 | +| -P, --port | 数据库端口 | 3306 | +| -d, --database | 数据库名称 | pguser-db | +| -u, --user | 数据库用户 | root | +| -p, --password | 数据库密码 | 无(必填) | + +### 脚本功能: + +✅ 自动检查数据库连接 +✅ 检查表是否存在 +✅ 检查菜单是否存在 +✅ 检查 API 字典数据是否存在 +✅ 缺失则自动导入 +✅ 彩色输出,清晰直观 + +--- + +## 🔧 方式二:手动导入 + +如果需要手动导入,请按以下顺序执行: + +### 1. 导入表结构 + +```bash +mysql -h 8.148.25.55 -P 3306 -u root -p pguser-db < pangu_tables.sql +``` + +**表结构说明**: +- `pg_application` - 第三方应用表(存储应用信息、AppCode、AppSecret) +- `pg_api_dict` - API 接口字典表(可授权的接口列表) +- `pg_app_api` - 应用 API 授权表(多对多关系) + +### 2. 导入菜单数据 + +```bash +mysql -h 8.148.25.55 -P 3306 -u root -p pguser-db < pangu_menu.sql +``` + +**菜单说明**: +- menu_id: 2300 - 应用管理(一级菜单) +- menu_id: 2301-2306 - 应用管理相关权限(查询、新增、修改、删除、重置密钥、接口授权) + +### 3. 导入 API 字典数据 + +```bash +mysql -h 8.148.25.55 -P 3306 -u root -p pguser-db < open_api_dict_data.sql +``` + +**数据说明**: +- api_code: OPEN_STUDENT_LIST - 学生列表查询接口 + +--- + +## ✅ 验证导入 + +### 1. 检查表结构 + +```sql +-- 查看表是否存在 +SHOW TABLES LIKE 'pg_%'; + +-- 查看表结构 +DESC pg_application; +DESC pg_api_dict; +DESC pg_app_api; + +-- 查看表数据量 +SELECT COUNT(*) FROM pg_application; +SELECT COUNT(*) FROM pg_api_dict; +SELECT COUNT(*) FROM pg_app_api; +``` + +### 2. 检查菜单数据 + +```sql +-- 查看应用管理菜单 +SELECT menu_id, menu_name, perms, icon +FROM sys_menu +WHERE menu_id >= 2300 AND menu_id < 2400 +ORDER BY menu_id; + +-- 预期结果: +-- 2300 应用管理 +-- 2301 应用查询 +-- 2302 应用新增 +-- 2303 应用修改 +-- 2304 应用删除 +-- 2305 重置密钥 +-- 2306 接口授权 +``` + +### 3. 检查 API 字典数据 + +```sql +-- 查看 API 字典 +SELECT * FROM pg_api_dict; + +-- 预期结果: +-- api_code: OPEN_STUDENT_LIST +-- api_name: 学生列表 +-- api_path: /open/api/student/list +``` + +--- + +## 🔍 常见问题 + +### Q1: 导入时报错 "Table already exists" + +**原因**:表已存在 +**解决**:这是正常的,说明表已经导入过了,可以忽略 + +### Q2: 导入菜单时报错 "Duplicate entry" + +**原因**:菜单数据已存在 +**解决**:可以忽略,或者先删除旧菜单再导入 + +```sql +-- 删除旧菜单(谨慎操作) +DELETE FROM sys_menu WHERE menu_id >= 2300 AND menu_id < 2400; +``` + +### Q3: 如何重新导入所有数据? + +```bash +# 1. 删除表(会丢失所有应用数据) +mysql -h 8.148.25.55 -P 3306 -u root -p pguser-db -e " +DROP TABLE IF EXISTS pg_app_api; +DROP TABLE IF EXISTS pg_application; +DROP TABLE IF EXISTS pg_api_dict; +" + +# 2. 删除菜单 +mysql -h 8.148.25.55 -P 3306 -u root -p pguser-db -e " +DELETE FROM sys_menu WHERE menu_id >= 2300 AND menu_id < 2400; +" + +# 3. 重新导入 +./check_and_import.sh -p your_password +``` + +--- + +## 📝 导入后的操作 + +### 1. 重启后端服务 + +```bash +cd /Users/felix/pgWorkSpace/pangu-user-platform/backend +./build.sh -r +``` + +### 2. 刷新前端页面 + +打开浏览器访问:http://localhost:80 + +### 3. 检查菜单是否显示 + +登录后台 → 左侧菜单 → 应该能看到"应用管理"菜单 + +### 4. 创建测试应用 + +进入【应用管理】→ 点击【新增】→ 填写应用信息 → 保存 + +--- + +## 🔗 相关文档 + +- [应用管理技术方案](/docs/应用管理-需求与技术设计方案.md) +- [开放接口实现说明](/docs/开放接口实现说明.md) +- [PHP 客户端使用指南](/scripts/test/README.md) + +--- + +## 📞 技术支持 + +如导入过程中遇到问题,请检查: +1. 数据库连接配置是否正确 +2. 数据库用户是否有足够权限 +3. SQL 文件是否完整 +4. 后端日志:`/tmp/pangu-admin.log` + +**pangu** +2026-02-04 diff --git a/backend/pangu-modules/pangu-business/sql/check_and_import.sh b/backend/pangu-modules/pangu-business/sql/check_and_import.sh new file mode 100755 index 0000000..57f7841 --- /dev/null +++ b/backend/pangu-modules/pangu-business/sql/check_and_import.sh @@ -0,0 +1,245 @@ +#!/bin/bash +# ============================================================ +# 应用管理模块 - 数据库检查与导入脚本 +# 功能:检查表是否存在,如不存在则导入 +# 作者:pangu +# 日期:2026-02-04 +# ============================================================ + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 数据库配置(从 application-dev.yml 读取) +DB_HOST="${DB_HOST:-8.148.25.55}" +DB_PORT="${DB_PORT:-3306}" +DB_NAME="${DB_NAME:-pguser-db}" +DB_USER="${DB_USER:-root}" +DB_PASS="${DB_PASS}" + +# SQL 文件路径 +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +TABLES_SQL="${SCRIPT_DIR}/pangu_tables.sql" +MENU_SQL="${SCRIPT_DIR}/pangu_menu.sql" +API_DICT_SQL="${SCRIPT_DIR}/open_api_dict_data.sql" + +# 打印函数 +print_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } +print_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +print_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +# 显示帮助 +show_help() { + echo "用法: ./check_and_import.sh [选项]" + echo "" + echo "选项:" + echo " -h, --host 数据库主机 (默认: 8.148.25.55)" + echo " -P, --port 数据库端口 (默认: 3306)" + echo " -d, --database 数据库名称 (默认: pguser-db)" + echo " -u, --user 数据库用户 (默认: root)" + echo " -p, --password 数据库密码 (必填)" + echo " --help 显示帮助信息" + echo "" + echo "示例:" + echo " ./check_and_import.sh -p your_password" + echo " ./check_and_import.sh -h localhost -u root -p 123456" +} + +# 检查 MySQL 客户端 +check_mysql_client() { + if ! command -v mysql &> /dev/null; then + print_error "未找到 mysql 客户端,请先安装 MySQL" + print_info "macOS 安装: brew install mysql-client" + print_info "Ubuntu 安装: sudo apt-get install mysql-client" + exit 1 + fi +} + +# 检查表是否存在 +check_table_exists() { + local table_name=$1 + local result=$(mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" -se "SHOW TABLES LIKE '${table_name}';" 2>/dev/null) + if [ -n "$result" ]; then + return 0 # 表存在 + else + return 1 # 表不存在 + fi +} + +# 检查菜单是否存在 +check_menu_exists() { + local menu_id=$1 + local result=$(mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" -se "SELECT COUNT(*) FROM sys_menu WHERE menu_id=${menu_id};" 2>/dev/null) + if [ "$result" -gt 0 ]; then + return 0 # 菜单存在 + else + return 1 # 菜单不存在 + fi +} + +# 导入 SQL 文件 +import_sql() { + local sql_file=$1 + local description=$2 + + print_info "正在导入: ${description}" + if mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" < "${sql_file}" 2>/dev/null; then + print_success "导入成功: ${description}" + return 0 + else + print_error "导入失败: ${description}" + return 1 + fi +} + +# 主逻辑 +main() { + # 解析参数 + while [[ $# -gt 0 ]]; do + case $1 in + -h|--host) + DB_HOST="$2" + shift 2 + ;; + -P|--port) + DB_PORT="$2" + shift 2 + ;; + -d|--database) + DB_NAME="$2" + shift 2 + ;; + -u|--user) + DB_USER="$2" + shift 2 + ;; + -p|--password) + DB_PASS="$2" + shift 2 + ;; + --help) + show_help + exit 0 + ;; + *) + print_error "未知选项: $1" + show_help + exit 1 + ;; + esac + done + + # 检查密码 + if [ -z "$DB_PASS" ]; then + print_error "请提供数据库密码 (-p 或 --password)" + show_help + exit 1 + fi + + # 检查 MySQL 客户端 + check_mysql_client + + echo "========================================" + echo " 应用管理模块 - 数据库检查与导入" + echo "========================================" + echo "数据库: ${DB_HOST}:${DB_PORT}/${DB_NAME}" + echo "用户: ${DB_USER}" + echo "========================================" + echo "" + + # 测试数据库连接 + print_info "测试数据库连接..." + if ! mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" -e "SELECT 1;" &> /dev/null; then + print_error "数据库连接失败,请检查配置" + exit 1 + fi + print_success "数据库连接成功" + echo "" + + # 1. 检查表结构 + print_info "【步骤 1】检查表结构" + echo "----------------------------------------" + + tables=("pg_application" "pg_api_dict" "pg_app_api") + tables_missing=false + + for table in "${tables[@]}"; do + if check_table_exists "$table"; then + print_success "✓ 表 ${table} 已存在" + else + print_warn "✗ 表 ${table} 不存在" + tables_missing=true + fi + done + + if [ "$tables_missing" = true ]; then + echo "" + print_warn "检测到缺失的表,开始导入表结构..." + import_sql "${TABLES_SQL}" "表结构 (pangu_tables.sql)" + fi + + echo "" + + # 2. 检查菜单数据 + print_info "【步骤 2】检查菜单数据" + echo "----------------------------------------" + + if check_menu_exists "2300"; then + print_success "✓ 应用管理菜单已存在 (menu_id=2300)" + else + print_warn "✗ 应用管理菜单不存在" + echo "" + print_warn "开始导入菜单数据..." + import_sql "${MENU_SQL}" "菜单数据 (pangu_menu.sql)" + fi + + echo "" + + # 3. 检查 API 字典数据 + print_info "【步骤 3】检查 API 字典数据" + echo "----------------------------------------" + + if check_table_exists "pg_api_dict"; then + api_count=$(mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" -se "SELECT COUNT(*) FROM pg_api_dict WHERE api_code='OPEN_STUDENT_LIST';" 2>/dev/null) + + if [ "$api_count" -gt 0 ]; then + print_success "✓ API 字典数据已存在 (OPEN_STUDENT_LIST)" + else + print_warn "✗ API 字典数据不存在" + echo "" + print_warn "开始导入 API 字典数据..." + import_sql "${API_DICT_SQL}" "API 字典数据 (open_api_dict_data.sql)" + fi + else + print_warn "表 pg_api_dict 不存在,跳过数据检查" + fi + + echo "" + echo "========================================" + print_success "检查完成!" + echo "========================================" + echo "" + + # 显示验证 SQL + print_info "【验证命令】" + echo "-- 查看应用管理表" + echo "SELECT COUNT(*) FROM pg_application;" + echo "SELECT COUNT(*) FROM pg_api_dict;" + echo "SELECT COUNT(*) FROM pg_app_api;" + echo "" + echo "-- 查看应用管理菜单" + echo "SELECT menu_id, menu_name, perms FROM sys_menu WHERE menu_id >= 2300 AND menu_id < 2400;" + echo "" + echo "-- 查看 API 字典" + echo "SELECT * FROM pg_api_dict;" + echo "" +} + +# 执行主函数 +main "$@" diff --git a/backend/pangu-modules/pangu-business/sql/open_api_dict_data.sql b/backend/pangu-modules/pangu-business/sql/open_api_dict_data.sql new file mode 100644 index 0000000..472e080 --- /dev/null +++ b/backend/pangu-modules/pangu-business/sql/open_api_dict_data.sql @@ -0,0 +1,6 @@ +-- 开放API 接口字典数据:学生列表(供应用管理勾选授权) +-- 执行前请确认 pg_api_dict 表已存在;若 api_code 已存在会报唯一键冲突,可忽略 +-- pangu + +INSERT INTO pg_api_dict (api_id, api_code, api_name, api_path, api_method, api_desc, status, order_num) +VALUES (1700000000000000001, 'OPEN_STUDENT_LIST', '学生列表', '/open/api/student/list', 'GET', '开放API-学生列表分页查询', '0', 10); diff --git a/backend/pangu-modules/pangu-business/sql/快速导入.txt b/backend/pangu-modules/pangu-business/sql/快速导入.txt new file mode 100644 index 0000000..638768a --- /dev/null +++ b/backend/pangu-modules/pangu-business/sql/快速导入.txt @@ -0,0 +1,47 @@ +======================================== +应用管理模块 - 数据库快速导入指南 +======================================== + +📋 需要导入的 SQL 文件: +---------------------------- +1. pangu_tables.sql - 表结构(3张表) +2. pangu_menu.sql - 菜单数据(7条菜单) +3. open_api_dict_data.sql - API字典(1条数据) + +🚀 最简单的导入方式: +---------------------------- +cd /Users/felix/pgWorkSpace/pangu-user-platform/backend/pangu-modules/pangu-business/sql +./check_and_import.sh -p 数据库密码 + +✨ 脚本会自动: + ✓ 检查表是否存在 + ✓ 检查菜单是否存在 + ✓ 检查数据是否存在 + ✓ 缺失则自动导入 + +💡 手动导入命令: +---------------------------- +mysql -h 8.148.25.55 -u root -p pguser-db < pangu_tables.sql +mysql -h 8.148.25.55 -u root -p pguser-db < pangu_menu.sql +mysql -h 8.148.25.55 -u root -p pguser-db < open_api_dict_data.sql + +✅ 验证导入: +---------------------------- +mysql -h 8.148.25.55 -u root -p pguser-db -e " +SHOW TABLES LIKE 'pg_%'; +SELECT COUNT(*) FROM pg_application; +SELECT * FROM pg_api_dict; +SELECT menu_name FROM sys_menu WHERE menu_id=2300; +" + +🔄 导入后操作: +---------------------------- +1. 重启后端:cd backend && ./build.sh -r +2. 刷新前端:浏览器访问 http://localhost:80 +3. 检查菜单:登录后查看是否有"应用管理"菜单 + +📖 详细文档: +---------------------------- +README_导入说明.md + +======================================== diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApiDictController.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApiDictController.java new file mode 100644 index 0000000..d2efae1 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApiDictController.java @@ -0,0 +1,101 @@ +package org.dromara.pangu.application.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.pangu.application.domain.PgApiDict; +import org.dromara.pangu.application.service.IPgApiDictService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 接口字典管理 Controller + * + * @author pangu + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/business/apiDict") +public class PgApiDictController extends BaseController { + + private final IPgApiDictService apiDictService; + + /** + * 分页查询接口字典列表 + */ + @SaCheckPermission("business:apiDict:list") + @GetMapping("/list") + public TableDataInfo list(PgApiDict apiDict, PageQuery pageQuery) { + return apiDictService.selectPageList(apiDict, pageQuery); + } + + /** + * 查询所有启用的接口列表(用于下拉选择) + */ + @SaCheckPermission("business:apiDict:list") + @GetMapping("/listAll") + public R> listAll() { + return R.ok(apiDictService.selectList()); + } + + /** + * 获取接口详情 + */ + @SaCheckPermission("business:apiDict:query") + @GetMapping("/{apiId}") + public R getInfo(@PathVariable Long apiId) { + return R.ok(apiDictService.selectById(apiId)); + } + + /** + * 新增接口 + */ + @SaCheckPermission("business:apiDict:add") + @Log(title = "接口字典", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody PgApiDict apiDict) { + if (!apiDictService.checkApiCodeUnique(apiDict)) { + return R.fail("新增失败,接口编码'" + apiDict.getApiCode() + "'已存在"); + } + if (!apiDictService.checkApiPathUnique(apiDict)) { + return R.fail("新增失败,接口路径'" + apiDict.getApiPath() + "'已存在"); + } + return toAjax(apiDictService.insert(apiDict)); + } + + /** + * 修改接口 + */ + @SaCheckPermission("business:apiDict:edit") + @Log(title = "接口字典", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody PgApiDict apiDict) { + if (!apiDictService.checkApiCodeUnique(apiDict)) { + return R.fail("修改失败,接口编码'" + apiDict.getApiCode() + "'已存在"); + } + if (!apiDictService.checkApiPathUnique(apiDict)) { + return R.fail("修改失败,接口路径'" + apiDict.getApiPath() + "'已存在"); + } + return toAjax(apiDictService.update(apiDict)); + } + + /** + * 删除接口 + */ + @SaCheckPermission("business:apiDict:remove") + @Log(title = "接口字典", businessType = BusinessType.DELETE) + @DeleteMapping("/{apiIds}") + public R remove(@PathVariable Long[] apiIds) { + return toAjax(apiDictService.deleteByIds(apiIds)); + } +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApplication.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApplication.java index 37c9377..fda025f 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApplication.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApplication.java @@ -1,6 +1,7 @@ package org.dromara.pangu.application.domain; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; @@ -8,6 +9,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import org.dromara.common.mybatis.core.domain.BaseEntity; +import java.util.List; + /** * 第三方应用表 * @@ -39,4 +42,8 @@ public class PgApplication extends BaseEntity { private String delFlag; private String remark; + + /** 接口授权:API 编码列表,用于新增/编辑时保存、详情回显,不落库 */ + @TableField(exist = false) + private List apiCodes; } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgAppApiMapper.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgAppApiMapper.java index eecba6a..0422f2c 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgAppApiMapper.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgAppApiMapper.java @@ -1,12 +1,25 @@ package org.dromara.pangu.application.mapper; +import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.pangu.application.domain.PgAppApi; +import java.util.List; + /** * 应用API授权 Mapper 接口 * * @author pangu */ public interface PgAppApiMapper extends BaseMapperPlus { + + /** + * 按应用编码查询该应用已授权的接口路径列表(用于开放API鉴权) + */ + List selectApiPathsByAppCode(@Param("appCode") String appCode); + + /** + * 按应用ID查询已授权的接口编码列表(用于详情回显) + */ + List selectApiCodesByAppId(@Param("appId") Long appId); } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApiDictService.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApiDictService.java index d93b85c..a0d3be6 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApiDictService.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApiDictService.java @@ -1,5 +1,7 @@ package org.dromara.pangu.application.service; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.pangu.application.domain.PgApiDict; import java.util.List; @@ -12,7 +14,42 @@ import java.util.List; public interface IPgApiDictService { /** - * 查询所有启用的API接口列表 + * 分页查询接口字典列表 + */ + TableDataInfo selectPageList(PgApiDict apiDict, PageQuery pageQuery); + + /** + * 查询所有启用的API接口列表(用于下拉选择) */ List selectList(); + + /** + * 根据ID查询接口详情 + */ + PgApiDict selectById(Long apiId); + + /** + * 新增接口 + */ + int insert(PgApiDict apiDict); + + /** + * 修改接口 + */ + int update(PgApiDict apiDict); + + /** + * 删除接口 + */ + int deleteByIds(Long[] apiIds); + + /** + * 校验接口编码是否唯一 + */ + boolean checkApiCodeUnique(PgApiDict apiDict); + + /** + * 校验接口路径是否唯一 + */ + boolean checkApiPathUnique(PgApiDict apiDict); } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApplicationService.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApplicationService.java index 0da13dc..641aecd 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApplicationService.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApplicationService.java @@ -18,4 +18,19 @@ public interface IPgApplicationService { int insert(PgApplication app); int update(PgApplication app); int deleteByIds(Long[] appIds); + + /** + * 按应用编码查询应用(开放API鉴权用) + */ + PgApplication selectByAppCode(String appCode); + + /** + * 校验应用是否已授权访问指定接口路径 + */ + boolean checkApiPermission(String appCode, String apiPath); + + /** + * 保存应用接口授权(先删后插) + */ + void saveAppApis(Long appId, List apiCodes); } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApiDictServiceImpl.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApiDictServiceImpl.java index 57e205b..c765bca 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApiDictServiceImpl.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApiDictServiceImpl.java @@ -1,12 +1,17 @@ package org.dromara.pangu.application.service.impl; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.pangu.application.domain.PgApiDict; import org.dromara.pangu.application.mapper.PgApiDictMapper; import org.dromara.pangu.application.service.IPgApiDictService; import org.springframework.stereotype.Service; +import java.util.Arrays; import java.util.List; /** @@ -20,6 +25,13 @@ public class PgApiDictServiceImpl implements IPgApiDictService { private final PgApiDictMapper baseMapper; + @Override + public TableDataInfo selectPageList(PgApiDict apiDict, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(apiDict); + Page page = baseMapper.selectPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + @Override public List selectList() { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); @@ -27,4 +39,52 @@ public class PgApiDictServiceImpl implements IPgApiDictService { lqw.orderByAsc(PgApiDict::getOrderNum); return baseMapper.selectList(lqw); } + + @Override + public PgApiDict selectById(Long apiId) { + return baseMapper.selectById(apiId); + } + + @Override + public int insert(PgApiDict apiDict) { + return baseMapper.insert(apiDict); + } + + @Override + public int update(PgApiDict apiDict) { + return baseMapper.updateById(apiDict); + } + + @Override + public int deleteByIds(Long[] apiIds) { + return baseMapper.deleteByIds(Arrays.asList(apiIds)); + } + + @Override + public boolean checkApiCodeUnique(PgApiDict apiDict) { + Long apiId = apiDict.getApiId() == null ? -1L : apiDict.getApiId(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PgApiDict::getApiCode, apiDict.getApiCode()); + PgApiDict one = baseMapper.selectOne(lqw); + return one == null || one.getApiId().equals(apiId); + } + + @Override + public boolean checkApiPathUnique(PgApiDict apiDict) { + Long apiId = apiDict.getApiId() == null ? -1L : apiDict.getApiId(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PgApiDict::getApiPath, apiDict.getApiPath()); + PgApiDict one = baseMapper.selectOne(lqw); + return one == null || one.getApiId().equals(apiId); + } + + private LambdaQueryWrapper buildQueryWrapper(PgApiDict apiDict) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.like(StrUtil.isNotBlank(apiDict.getApiCode()), PgApiDict::getApiCode, apiDict.getApiCode()); + lqw.like(StrUtil.isNotBlank(apiDict.getApiName()), PgApiDict::getApiName, apiDict.getApiName()); + lqw.like(StrUtil.isNotBlank(apiDict.getApiPath()), PgApiDict::getApiPath, apiDict.getApiPath()); + lqw.eq(StrUtil.isNotBlank(apiDict.getStatus()), PgApiDict::getStatus, apiDict.getStatus()); + lqw.orderByAsc(PgApiDict::getOrderNum); + return lqw; + } } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApplicationServiceImpl.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApplicationServiceImpl.java index c5e341e..7c18b97 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApplicationServiceImpl.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApplicationServiceImpl.java @@ -7,12 +7,19 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.pangu.application.domain.PgApiDict; +import org.dromara.pangu.application.domain.PgAppApi; import org.dromara.pangu.application.domain.PgApplication; +import org.dromara.pangu.application.mapper.PgApiDictMapper; +import org.dromara.pangu.application.mapper.PgAppApiMapper; import org.dromara.pangu.application.mapper.PgApplicationMapper; import org.dromara.pangu.application.service.IPgApplicationService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -25,6 +32,8 @@ import java.util.List; public class PgApplicationServiceImpl implements IPgApplicationService { private final PgApplicationMapper baseMapper; + private final PgAppApiMapper appApiMapper; + private final PgApiDictMapper apiDictMapper; @Override public TableDataInfo selectPageList(PgApplication app, PageQuery pageQuery) { @@ -40,17 +49,25 @@ public class PgApplicationServiceImpl implements IPgApplicationService { @Override public PgApplication selectById(Long appId) { - return baseMapper.selectById(appId); + PgApplication app = baseMapper.selectById(appId); + if (app != null && appId != null) { + List apiCodes = appApiMapper.selectApiCodesByAppId(appId); + app.setApiCodes(apiCodes != null ? apiCodes : Collections.emptyList()); + } + return app; } @Override + @Transactional(rollbackFor = Exception.class) public int insert(PgApplication app) { - // 自动生成应用编码:YY + 6位序号 String appCode = generateAppCode(); app.setAppCode(appCode); - // 自动生成32位应用密钥 app.setAppSecret(IdUtil.fastSimpleUUID()); - return baseMapper.insert(app); + int rows = baseMapper.insert(app); + if (rows > 0 && app.getAppId() != null && app.getApiCodes() != null && !app.getApiCodes().isEmpty()) { + saveAppApis(app.getAppId(), app.getApiCodes()); + } + return rows; } /** @@ -79,8 +96,13 @@ public class PgApplicationServiceImpl implements IPgApplicationService { } @Override + @Transactional(rollbackFor = Exception.class) public int update(PgApplication app) { - return baseMapper.updateById(app); + int rows = baseMapper.updateById(app); + if (rows > 0 && app.getAppId() != null && app.getApiCodes() != null) { + saveAppApis(app.getAppId(), app.getApiCodes()); + } + return rows; } @Override @@ -88,6 +110,48 @@ public class PgApplicationServiceImpl implements IPgApplicationService { return baseMapper.deleteByIds(Arrays.asList(appIds)); } + @Override + public PgApplication selectByAppCode(String appCode) { + if (StrUtil.isBlank(appCode)) { + return null; + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PgApplication::getAppCode, appCode); + return baseMapper.selectOne(lqw); + } + + @Override + public boolean checkApiPermission(String appCode, String apiPath) { + if (StrUtil.isBlank(appCode) || StrUtil.isBlank(apiPath)) { + return false; + } + List paths = appApiMapper.selectApiPathsByAppCode(appCode); + return paths != null && paths.contains(apiPath); + } + + @Override + public void saveAppApis(Long appId, List apiCodes) { + appApiMapper.delete(new LambdaQueryWrapper().eq(PgAppApi::getAppId, appId)); + if (apiCodes == null || apiCodes.isEmpty()) { + return; + } + List list = new ArrayList<>(); + for (String apiCode : apiCodes) { + LambdaQueryWrapper q = new LambdaQueryWrapper<>(); + q.eq(PgApiDict::getApiCode, apiCode); + PgApiDict dict = apiDictMapper.selectOne(q); + if (dict != null && dict.getApiId() != null) { + PgAppApi row = new PgAppApi(); + row.setAppId(appId); + row.setApiId(dict.getApiId()); + list.add(row); + } + } + if (!list.isEmpty()) { + list.forEach(appApiMapper::insert); + } + } + private LambdaQueryWrapper buildQueryWrapper(PgApplication app) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.like(StrUtil.isNotBlank(app.getAppName()), PgApplication::getAppName, app.getAppName()); diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/config/ApiAuthInterceptor.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/config/ApiAuthInterceptor.java new file mode 100644 index 0000000..89a0c1b --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/config/ApiAuthInterceptor.java @@ -0,0 +1,100 @@ +package org.dromara.pangu.openapi.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.pangu.application.domain.PgApplication; +import org.dromara.pangu.application.service.IPgApplicationService; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.util.Map; +import java.util.TreeMap; + +/** + * 开放API 应用签名鉴权 + 接口授权校验 + * 仅对 /open/api/** 生效 + * + * @author pangu + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ApiAuthInterceptor implements HandlerInterceptor { + + private static final String HEADER_APP_ID = "X-App-Id"; + private static final String HEADER_TIMESTAMP = "X-Timestamp"; + private static final String HEADER_SIGN = "X-Sign"; + /** 时间戳有效期 5 分钟 */ + private static final long TIMESTAMP_EXPIRE_MS = 5 * 60 * 1000L; + + private final IPgApplicationService applicationService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + log.info(">>> ApiAuthInterceptor 拦截请求: {}", request.getRequestURI()); + String appId = request.getHeader(HEADER_APP_ID); + String timestamp = request.getHeader(HEADER_TIMESTAMP); + String sign = request.getHeader(HEADER_SIGN); + + if (StrUtil.isBlank(appId) || StrUtil.isBlank(timestamp) || StrUtil.isBlank(sign)) { + throw new ServiceException("缺少认证参数"); + } + + long reqTime; + try { + reqTime = Long.parseLong(timestamp.trim()); + } catch (NumberFormatException e) { + throw new ServiceException("时间戳格式错误"); + } + if (Math.abs(System.currentTimeMillis() - reqTime) > TIMESTAMP_EXPIRE_MS) { + throw new ServiceException("请求已过期"); + } + + PgApplication app = applicationService.selectByAppCode(appId.trim()); + if (app == null) { + throw new ServiceException("应用不存在"); + } + if ("1".equals(app.getStatus())) { + throw new ServiceException("应用已停用"); + } + + String expectedSign = buildSign(request, app.getAppSecret()); + if (!expectedSign.equalsIgnoreCase(sign.trim())) { + log.warn("开放API签名验证失败, appCode={}", appId); + throw new ServiceException("签名验证失败"); + } + + String apiPath = request.getRequestURI(); + if (!applicationService.checkApiPermission(appId.trim(), apiPath)) { + throw new ServiceException("无权访问该接口"); + } + + return true; + } + + /** + * 签名字符串:请求参数按 key ASCII 排序拼接,末尾追加 appSecret,MD5 大写 + */ + private String buildSign(HttpServletRequest request, String appSecret) { + Map params = new TreeMap<>(); + request.getParameterMap().forEach((key, values) -> { + if (values != null && values.length > 0 && StrUtil.isNotBlank(values[0])) { + params.put(key, values[0].trim()); + } + }); + StringBuilder sb = new StringBuilder(); + params.forEach((k, v) -> { + if (sb.length() > 0) { + sb.append("&"); + } + sb.append(k).append("=").append(v); + }); + sb.append("&appSecret=").append(appSecret != null ? appSecret : ""); + return DigestUtil.md5Hex(sb.toString()).toUpperCase(); + } +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/config/OpenApiWebMvcConfig.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/config/OpenApiWebMvcConfig.java new file mode 100644 index 0000000..f5eb689 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/config/OpenApiWebMvcConfig.java @@ -0,0 +1,24 @@ +package org.dromara.pangu.openapi.config; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 开放API 拦截器注册,仅对 /open/api/** 生效 + * + * @author pangu + */ +@Configuration +@RequiredArgsConstructor +public class OpenApiWebMvcConfig implements WebMvcConfigurer { + + private final ApiAuthInterceptor apiAuthInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(apiAuthInterceptor) + .addPathPatterns("/open/api/**"); + } +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiBaseController.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiBaseController.java new file mode 100644 index 0000000..ae11864 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiBaseController.java @@ -0,0 +1,245 @@ +package org.dromara.pangu.openapi.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.pangu.base.domain.PgClass; +import org.dromara.pangu.base.domain.PgGrade; +import org.dromara.pangu.base.service.IPgClassService; +import org.dromara.pangu.base.service.IPgGradeService; +import org.dromara.pangu.openapi.domain.vo.OpenClassVo; +import org.dromara.pangu.openapi.domain.vo.OpenGradeVo; +import org.dromara.pangu.openapi.domain.vo.OpenSchoolVo; +import org.dromara.pangu.school.domain.PgSchool; +import org.dromara.pangu.school.service.IPgSchoolService; +import org.springframework.beans.BeanUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 开放API - 基础数据接口(学校、年级、班级) + *

+ * 说明: + * 1. 直接调用内部 Service,这些 Service 通常不带 @DataPermission + * 2. 返回 OpenApi 专用 VO,与内部数据结构解耦 + * 3. 需要应用签名 + 接口授权 + * + * @author pangu + */ +@Tag(name = "开放接口 - 基础数据", description = "提供学校、年级、班级信息查询接口(需应用授权)") +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/open/api/base") +public class OpenApiBaseController extends BaseController { + + private final IPgSchoolService schoolService; + private final IPgGradeService gradeService; + private final IPgClassService classService; + + // ==================== 学校接口 ==================== + + /** + * 学校列表分页查询 + */ + @Operation(summary = "学校列表查询(分页)", description = "分页查询学校信息") + @GetMapping("/school/list") + public TableDataInfo schoolList( + @Parameter(description = "学校名称(模糊查询)") @RequestParam(required = false) String schoolName, + @Parameter(description = "学校类型") @RequestParam(required = false) String schoolType, + PageQuery pageQuery + ) { + PgSchool query = new PgSchool(); + query.setSchoolName(schoolName); + query.setSchoolType(schoolType); + query.setStatus("0"); // 只查询正常状态 + + TableDataInfo result = schoolService.selectPageList(query, pageQuery); + List voList = result.getRows().stream() + .map(this::convertToSchoolVo) + .collect(Collectors.toList()); + + return new TableDataInfo<>(voList, result.getTotal()); + } + + /** + * 学校列表查询(不分页) + */ + @Operation(summary = "学校列表查询(全部)", description = "查询所有学校信息") + @GetMapping("/school/listAll") + public R> schoolListAll( + @Parameter(description = "学校名称(模糊查询)") @RequestParam(required = false) String schoolName, + @Parameter(description = "学校类型") @RequestParam(required = false) String schoolType + ) { + PgSchool query = new PgSchool(); + query.setSchoolName(schoolName); + query.setSchoolType(schoolType); + query.setStatus("0"); + + List list = schoolService.selectList(query); + List voList = list.stream() + .map(this::convertToSchoolVo) + .collect(Collectors.toList()); + + return R.ok(voList); + } + + /** + * 根据ID查询学校 + */ + @Operation(summary = "学校详情", description = "根据ID查询学校信息") + @GetMapping("/school/{schoolId}") + public R schoolInfo( + @Parameter(description = "学校ID") @PathVariable Long schoolId + ) { + PgSchool school = schoolService.selectById(schoolId); + if (school == null) { + return R.fail("学校不存在"); + } + return R.ok(convertToSchoolVo(school)); + } + + // ==================== 年级接口 ==================== + + /** + * 年级列表分页查询 + */ + @Operation(summary = "年级列表查询(分页)", description = "分页查询年级信息") + @GetMapping("/grade/list") + public TableDataInfo gradeList( + @Parameter(description = "年级名称(模糊查询)") @RequestParam(required = false) String gradeName, + PageQuery pageQuery + ) { + PgGrade query = new PgGrade(); + query.setGradeName(gradeName); + query.setStatus("0"); + + TableDataInfo result = gradeService.selectPageList(query, pageQuery); + List voList = result.getRows().stream() + .map(this::convertToGradeVo) + .collect(Collectors.toList()); + + return new TableDataInfo<>(voList, result.getTotal()); + } + + /** + * 年级列表查询(不分页) + */ + @Operation(summary = "年级列表查询(全部)", description = "查询所有年级信息") + @GetMapping("/grade/listAll") + public R> gradeListAll( + @Parameter(description = "年级名称(模糊查询)") @RequestParam(required = false) String gradeName + ) { + PgGrade query = new PgGrade(); + query.setGradeName(gradeName); + query.setStatus("0"); + + List list = gradeService.selectList(query); + List voList = list.stream() + .map(this::convertToGradeVo) + .collect(Collectors.toList()); + + return R.ok(voList); + } + + /** + * 根据ID查询年级 + */ + @Operation(summary = "年级详情", description = "根据ID查询年级信息") + @GetMapping("/grade/{gradeId}") + public R gradeInfo( + @Parameter(description = "年级ID") @PathVariable Long gradeId + ) { + PgGrade grade = gradeService.selectById(gradeId); + if (grade == null) { + return R.fail("年级不存在"); + } + return R.ok(convertToGradeVo(grade)); + } + + // ==================== 班级接口 ==================== + + /** + * 班级列表分页查询 + */ + @Operation(summary = "班级列表查询(分页)", description = "分页查询班级信息") + @GetMapping("/class/list") + public TableDataInfo classList( + @Parameter(description = "班级名称(模糊查询)") @RequestParam(required = false) String className, + PageQuery pageQuery + ) { + PgClass query = new PgClass(); + query.setClassName(className); + query.setStatus("0"); + + TableDataInfo result = classService.selectPageList(query, pageQuery); + List voList = result.getRows().stream() + .map(this::convertToClassVo) + .collect(Collectors.toList()); + + return new TableDataInfo<>(voList, result.getTotal()); + } + + /** + * 班级列表查询(不分页) + */ + @Operation(summary = "班级列表查询(全部)", description = "查询所有班级信息") + @GetMapping("/class/listAll") + public R> classListAll( + @Parameter(description = "班级名称(模糊查询)") @RequestParam(required = false) String className + ) { + PgClass query = new PgClass(); + query.setClassName(className); + query.setStatus("0"); + + List list = classService.selectList(query); + List voList = list.stream() + .map(this::convertToClassVo) + .collect(Collectors.toList()); + + return R.ok(voList); + } + + /** + * 根据ID查询班级 + */ + @Operation(summary = "班级详情", description = "根据ID查询班级信息") + @GetMapping("/class/{classId}") + public R classInfo( + @Parameter(description = "班级ID") @PathVariable Long classId + ) { + PgClass clazz = classService.selectById(classId); + if (clazz == null) { + return R.fail("班级不存在"); + } + return R.ok(convertToClassVo(clazz)); + } + + // ==================== 转换方法 ==================== + + private OpenSchoolVo convertToSchoolVo(PgSchool source) { + OpenSchoolVo vo = new OpenSchoolVo(); + BeanUtils.copyProperties(source, vo); + return vo; + } + + private OpenGradeVo convertToGradeVo(PgGrade source) { + OpenGradeVo vo = new OpenGradeVo(); + BeanUtils.copyProperties(source, vo); + return vo; + } + + private OpenClassVo convertToClassVo(PgClass source) { + OpenClassVo vo = new OpenClassVo(); + BeanUtils.copyProperties(source, vo); + return vo; + } +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiStudentController.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiStudentController.java new file mode 100644 index 0000000..f9e47c1 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiStudentController.java @@ -0,0 +1,94 @@ +package org.dromara.pangu.openapi.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.pangu.openapi.domain.vo.OpenStudentVo; +import org.dromara.pangu.openapi.service.IOpenApiStudentService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 开放API - 学生接口(需应用签名 + 接口授权) + * + * 鉴权说明: + * 1. 所有 /open/api/** 路径的请求会被 ApiAuthInterceptor 拦截 + * 2. 需要在请求头中携带:X-App-Id、X-Timestamp、X-Sign + * 3. 应用必须拥有该接口的授权才能调用 + * + * 数据安全: + * 1. 返回数据已脱敏(姓名、手机号等) + * 2. 敏感字段(身份证号、住址等)不返回 + * 3. 只返回开放接口专用 VO,与内部数据结构解耦 + * + * 调用示例: + * GET /open/api/student/list?pageNum=1&pageSize=10&studentName=张 + * Headers: + * X-App-Id: YY000001 + * X-Timestamp: 1738656000000 + * X-Sign: A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6 + * + * @author pangu + */ +@Tag(name = "开放接口 - 学生管理", description = "提供学生信息查询接口(需应用授权)") +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/open/api/student") +public class OpenApiStudentController extends BaseController { + + private final IOpenApiStudentService openApiStudentService; // 调用开放接口专用服务 + + /** + * 学生列表分页查询(对外开放接口,已脱敏) + * + * @param studentName 学生姓名(模糊查询,可选) + * @param schoolId 学校ID(可选) + * @param gradeId 年级ID(可选) + * @param classId 班级ID(可选) + * @param pageQuery 分页参数(pageNum、pageSize) + * @return 学生列表(已脱敏) + */ + @Operation(summary = "学生列表查询(脱敏)", description = "分页查询学生信息,返回脱敏数据") + @GetMapping("/list") + public TableDataInfo list( + @Parameter(description = "学生姓名(模糊查询)") @RequestParam(required = false) String studentName, + @Parameter(description = "学校ID") @RequestParam(required = false) Long schoolId, + @Parameter(description = "年级ID") @RequestParam(required = false) Long gradeId, + @Parameter(description = "班级ID") @RequestParam(required = false) Long classId, + PageQuery pageQuery + ) { + return openApiStudentService.selectPageList(studentName, schoolId, gradeId, classId, pageQuery); + } + + /** + * 学生列表分页查询(对外开放接口,完整数据不脱敏) + *

+ * 注意:此接口返回完整数据,包含敏感信息,仅授权给可信应用 + * + * @param studentName 学生姓名(模糊查询,可选) + * @param schoolId 学校ID(可选) + * @param gradeId 年级ID(可选) + * @param classId 班级ID(可选) + * @param pageQuery 分页参数(pageNum、pageSize) + * @return 学生列表(完整数据) + */ + @Operation(summary = "学生列表查询(完整)", description = "分页查询学生信息,返回完整数据(需特殊授权)") + @GetMapping("/listFull") + public TableDataInfo listFull( + @Parameter(description = "学生姓名(模糊查询)") @RequestParam(required = false) String studentName, + @Parameter(description = "学校ID") @RequestParam(required = false) Long schoolId, + @Parameter(description = "年级ID") @RequestParam(required = false) Long gradeId, + @Parameter(description = "班级ID") @RequestParam(required = false) Long classId, + PageQuery pageQuery + ) { + return openApiStudentService.selectPageListFull(studentName, schoolId, gradeId, classId, pageQuery); + } +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenClassVo.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenClassVo.java new file mode 100644 index 0000000..da3ebc3 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenClassVo.java @@ -0,0 +1,31 @@ +package org.dromara.pangu.openapi.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * 开放API - 班级信息VO + * + * @author pangu + */ +@Data +@Schema(description = "开放接口班级信息") +public class OpenClassVo implements Serializable { + + @Schema(description = "班级ID") + private Long classId; + + @Schema(description = "班级编码") + private String classCode; + + @Schema(description = "班级名称") + private String className; + + @Schema(description = "显示顺序") + private Integer orderNum; + + @Schema(description = "状态(0正常 1停用)") + private String status; +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenGradeVo.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenGradeVo.java new file mode 100644 index 0000000..6c63766 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenGradeVo.java @@ -0,0 +1,31 @@ +package org.dromara.pangu.openapi.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * 开放API - 年级信息VO + * + * @author pangu + */ +@Data +@Schema(description = "开放接口年级信息") +public class OpenGradeVo implements Serializable { + + @Schema(description = "年级ID") + private Long gradeId; + + @Schema(description = "年级编码") + private String gradeCode; + + @Schema(description = "年级名称") + private String gradeName; + + @Schema(description = "显示顺序") + private Integer orderNum; + + @Schema(description = "状态(0正常 1停用)") + private String status; +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenSchoolVo.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenSchoolVo.java new file mode 100644 index 0000000..c3db8e5 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenSchoolVo.java @@ -0,0 +1,40 @@ +package org.dromara.pangu.openapi.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * 开放API - 学校信息VO + * + * @author pangu + */ +@Data +@Schema(description = "开放接口学校信息") +public class OpenSchoolVo implements Serializable { + + @Schema(description = "学校ID") + private Long schoolId; + + @Schema(description = "学校编码") + private String schoolCode; + + @Schema(description = "学校名称") + private String schoolName; + + @Schema(description = "学校类型(1小学 2初中 3高中 4完全中学)") + private String schoolType; + + @Schema(description = "区域ID") + private Long regionId; + + @Schema(description = "区域名称") + private String regionName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "状态(0正常 1停用)") + private String status; +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenStudentVo.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenStudentVo.java new file mode 100644 index 0000000..8c21f13 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenStudentVo.java @@ -0,0 +1,61 @@ +package org.dromara.pangu.openapi.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * 开放API - 学生信息VO + * + * 说明: + * 1. 开放接口专用的 VO 应放在 openapi/domain/vo 目录下 + * 2. 只包含可以对外暴露的字段 + * 3. 敏感字段(如身份证号)不应出现在此类中 + * 4. 敏感信息需要进行脱敏处理(如姓名、手机号) + * + * @author pangu + */ +@Data +@Schema(description = "开放接口学生信息") +public class OpenStudentVo implements Serializable { + + @Schema(description = "学生ID") + private Long studentId; + + @Schema(description = "学号") + private String studentCode; + + @Schema(description = "学生姓名(已脱敏)") + private String studentName; + + @Schema(description = "性别(0未知 1男 2女)") + private String gender; + + @Schema(description = "学校ID") + private Long schoolId; + + @Schema(description = "学校名称") + private String schoolName; + + @Schema(description = "年级ID") + private Long gradeId; + + @Schema(description = "年级名称") + private String gradeName; + + @Schema(description = "班级ID") + private Long classId; + + @Schema(description = "班级名称") + private String className; + + @Schema(description = "联系电话(已脱敏)") + private String phone; + + // 注意:以下敏感字段不对外暴露 + // private String idCard; // 身份证号 - 不暴露 + // private String address; // 家庭住址 - 不暴露 + // private String parentPhone; // 家长电话 - 不暴露 + // private Date birthday; // 出生日期 - 不暴露 +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/service/IOpenApiStudentService.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/service/IOpenApiStudentService.java new file mode 100644 index 0000000..8b80ad9 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/service/IOpenApiStudentService.java @@ -0,0 +1,46 @@ +package org.dromara.pangu.openapi.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.pangu.openapi.domain.vo.OpenStudentVo; + +/** + * 开放API - 学生服务接口 + * + * 二次开发说明: + * 1. 开放接口的 Service 应放在 openapi/service 目录下 + * 2. 可以调用已有的业务 Service,也可以直接调用 Mapper + * 3. 建议在此层做数据脱敏、字段过滤、权限控制等处理 + * + * @author pangu + */ +public interface IOpenApiStudentService { + + /** + * 分页查询学生列表(开放接口专用,已脱敏) + * + * @param studentName 学生姓名(模糊查询) + * @param schoolId 学校ID + * @param gradeId 年级ID + * @param classId 班级ID + * @param pageQuery 分页参数 + * @return 学生列表(已脱敏) + */ + TableDataInfo selectPageList(String studentName, Long schoolId, + Long gradeId, Long classId, PageQuery pageQuery); + + /** + * 分页查询学生列表(开放接口专用,完整数据不脱敏) + *

+ * 注意:此接口返回完整数据,包含敏感信息,请确保只授权给可信应用 + * + * @param studentName 学生姓名(模糊查询) + * @param schoolId 学校ID + * @param gradeId 年级ID + * @param classId 班级ID + * @param pageQuery 分页参数 + * @return 学生列表(完整数据) + */ + TableDataInfo selectPageListFull(String studentName, Long schoolId, + Long gradeId, Long classId, PageQuery pageQuery); +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/service/impl/OpenApiStudentServiceImpl.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/service/impl/OpenApiStudentServiceImpl.java new file mode 100644 index 0000000..fe5a355 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/service/impl/OpenApiStudentServiceImpl.java @@ -0,0 +1,190 @@ +package org.dromara.pangu.openapi.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.pangu.base.domain.PgGrade; +import org.dromara.pangu.base.mapper.PgGradeMapper; +import org.dromara.pangu.openapi.domain.vo.OpenStudentVo; +import org.dromara.pangu.openapi.service.IOpenApiStudentService; +import org.dromara.pangu.openapi.utils.DataMaskUtil; +import org.dromara.pangu.school.domain.PgSchool; +import org.dromara.pangu.school.domain.PgSchoolClass; +import org.dromara.pangu.school.domain.PgSchoolGrade; +import org.dromara.pangu.school.mapper.PgSchoolClassMapper; +import org.dromara.pangu.school.mapper.PgSchoolGradeMapper; +import org.dromara.pangu.school.mapper.PgSchoolMapper; +import org.dromara.pangu.student.domain.PgStudent; +import org.dromara.pangu.student.mapper.PgStudentMapper; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 开放API - 学生服务实现 + * + * 技术架构说明: + * 1. 直接使用 Mapper 层的无数据权限方法(selectPageStudentListNoDataScope) + * 2. 开放接口使用应用级授权,不需要用户级数据权限过滤 + * 3. 数据范围由接口参数(schoolId, gradeId 等)控制 + * 4. 在此层进行数据转换和脱敏处理 + * 5. 只返回开放接口专用 VO,不暴露敏感信息 + * + * @author pangu + */ +@RequiredArgsConstructor +@Service +public class OpenApiStudentServiceImpl implements IOpenApiStudentService { + + private final PgStudentMapper studentMapper; + private final PgSchoolMapper schoolMapper; + private final PgSchoolGradeMapper schoolGradeMapper; + private final PgSchoolClassMapper schoolClassMapper; + private final PgGradeMapper gradeMapper; + + @Override + public TableDataInfo selectPageList(String studentName, Long schoolId, + Long gradeId, Long classId, PageQuery pageQuery) { + return doSelectPageList(studentName, schoolId, gradeId, classId, pageQuery, true); + } + + @Override + public TableDataInfo selectPageListFull(String studentName, Long schoolId, + Long gradeId, Long classId, PageQuery pageQuery) { + return doSelectPageList(studentName, schoolId, gradeId, classId, pageQuery, false); + } + + /** + * 内部通用查询方法 + * @param maskData 是否脱敏 + */ + private TableDataInfo doSelectPageList(String studentName, Long schoolId, + Long gradeId, Long classId, + PageQuery pageQuery, boolean maskData) { + // 1. 构建查询条件 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.like(StrUtil.isNotBlank(studentName), PgStudent::getStudentName, studentName); + lqw.eq(schoolId != null, PgStudent::getSchoolId, schoolId); + lqw.eq(gradeId != null, PgStudent::getSchoolGradeId, gradeId); + lqw.eq(classId != null, PgStudent::getSchoolClassId, classId); + lqw.eq(PgStudent::getStatus, "0"); // 只查询正常状态的学生 + lqw.orderByDesc(PgStudent::getCreateTime); + + // 2. 使用无数据权限的分页查询方法 + Page page = studentMapper.selectPageStudentListNoDataScope(pageQuery.build(), lqw); + + // 3. 转换为开放接口专用VO(根据参数决定是否脱敏) + List openApiList = convertToOpenApiVoList(page.getRecords(), maskData); + + // 4. 返回数据 + return new TableDataInfo<>(openApiList, page.getTotal()); + } + + /** + * 批量转换为开放接口VO并填充关联数据 + * + * @param students 学生列表 + * @param maskData 是否脱敏 + * @return 开放接口VO列表 + */ + private List convertToOpenApiVoList(List students, boolean maskData) { + if (students == null || students.isEmpty()) { + return Collections.emptyList(); + } + + // 收集所有需要查询的关联ID + Set schoolIds = new HashSet<>(); + Set schoolGradeIds = new HashSet<>(); + Set schoolClassIds = new HashSet<>(); + + for (PgStudent s : students) { + if (s.getSchoolId() != null) schoolIds.add(s.getSchoolId()); + if (s.getSchoolGradeId() != null) schoolGradeIds.add(s.getSchoolGradeId()); + if (s.getSchoolClassId() != null) schoolClassIds.add(s.getSchoolClassId()); + } + + // 批量查询学校信息 + Map schoolMap = schoolIds.isEmpty() ? Collections.emptyMap() : + schoolMapper.selectByIds(schoolIds).stream() + .collect(Collectors.toMap(PgSchool::getSchoolId, Function.identity())); + + // 批量查询学校年级信息 + Map schoolGradeMap = schoolGradeIds.isEmpty() ? Collections.emptyMap() : + schoolGradeMapper.selectByIds(schoolGradeIds).stream() + .collect(Collectors.toMap(PgSchoolGrade::getId, Function.identity())); + + // 批量查询学校班级信息 + Map schoolClassMap = schoolClassIds.isEmpty() ? Collections.emptyMap() : + schoolClassMapper.selectByIds(schoolClassIds).stream() + .collect(Collectors.toMap(PgSchoolClass::getId, Function.identity())); + + // 收集基础年级ID并查询年级名称 + Set baseGradeIds = schoolGradeMap.values().stream() + .map(PgSchoolGrade::getGradeId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + Map gradeNameMap = baseGradeIds.isEmpty() ? Collections.emptyMap() : + gradeMapper.selectByIds(baseGradeIds).stream() + .collect(Collectors.toMap(PgGrade::getGradeId, PgGrade::getGradeName)); + + // 转换为VO列表 + return students.stream() + .map(student -> convertToOpenApiVo(student, schoolMap, schoolGradeMap, schoolClassMap, gradeNameMap, maskData)) + .collect(Collectors.toList()); + } + + /** + * 转换单个学生为开放接口VO + * @param maskData 是否脱敏 + */ + private OpenStudentVo convertToOpenApiVo(PgStudent source, + Map schoolMap, + Map schoolGradeMap, + Map schoolClassMap, + Map gradeNameMap, + boolean maskData) { + if (source == null) { + return null; + } + + OpenStudentVo vo = new OpenStudentVo(); + + // 基础信息(不敏感) + vo.setStudentId(source.getStudentId()); + vo.setStudentCode(source.getStudentNo()); + vo.setGender(source.getGender()); + + // 学校信息 + vo.setSchoolId(source.getSchoolId()); + PgSchool school = schoolMap.get(source.getSchoolId()); + vo.setSchoolName(school != null ? school.getSchoolName() : null); + + // 年级信息 + vo.setGradeId(source.getSchoolGradeId()); + PgSchoolGrade schoolGrade = schoolGradeMap.get(source.getSchoolGradeId()); + if (schoolGrade != null && schoolGrade.getGradeId() != null) { + vo.setGradeName(gradeNameMap.get(schoolGrade.getGradeId())); + } + + // 班级信息 + vo.setClassId(source.getSchoolClassId()); + PgSchoolClass schoolClass = schoolClassMap.get(source.getSchoolClassId()); + vo.setClassName(schoolClass != null ? schoolClass.getClassName() : null); + + // 敏感字段处理 + if (maskData) { + // 脱敏模式 + vo.setStudentName(DataMaskUtil.maskName(source.getStudentName())); + } else { + // 完整数据模式 + vo.setStudentName(source.getStudentName()); + } + + return vo; + } +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/utils/DataMaskUtil.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/utils/DataMaskUtil.java new file mode 100644 index 0000000..402971c --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/utils/DataMaskUtil.java @@ -0,0 +1,72 @@ +package org.dromara.pangu.openapi.utils; + +import cn.hutool.core.util.StrUtil; + +/** + * 数据脱敏工具类 + * + * 用于开放接口返回数据时对敏感信息进行脱敏处理 + * + * @author pangu + */ +public class DataMaskUtil { + + /** + * 姓名脱敏:张三 -> 张* + */ + public static String maskName(String name) { + if (StrUtil.isBlank(name) || name.length() == 1) { + return name; + } + return name.charAt(0) + "*".repeat(name.length() - 1); + } + + /** + * 手机号脱敏:13812345678 -> 138****5678 + */ + public static String maskPhone(String phone) { + if (StrUtil.isBlank(phone) || phone.length() != 11) { + return phone; + } + return phone.substring(0, 3) + "****" + phone.substring(7); + } + + /** + * 身份证脱敏:110101199001011234 -> 110101********1234 + */ + public static String maskIdCard(String idCard) { + if (StrUtil.isBlank(idCard) || idCard.length() < 8) { + return idCard; + } + return idCard.substring(0, 6) + "********" + idCard.substring(idCard.length() - 4); + } + + /** + * 邮箱脱敏:example@qq.com -> e****e@qq.com + */ + public static String maskEmail(String email) { + if (StrUtil.isBlank(email) || !email.contains("@")) { + return email; + } + int atIndex = email.indexOf("@"); + String prefix = email.substring(0, atIndex); + String suffix = email.substring(atIndex); + + if (prefix.length() <= 2) { + return prefix.charAt(0) + "*" + suffix; + } + return prefix.charAt(0) + "****" + prefix.charAt(prefix.length() - 1) + suffix; + } + + /** + * 地址脱敏:保留省市,其余用*代替 + * 例如:北京市朝阳区建国路88号 -> 北京市朝阳区*** + */ + public static String maskAddress(String address) { + if (StrUtil.isBlank(address) || address.length() <= 6) { + return address; + } + // 保留前6个字符(通常是省市区) + return address.substring(0, 6) + "***"; + } +} diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java index ec16114..8413cd0 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java @@ -42,4 +42,28 @@ public interface PgStudentMapper extends BaseMapperPlus { default Page selectPageStudentList(Page page, Wrapper queryWrapper) { return this.selectPage(page, queryWrapper); } + + /** + * 分页查询学生列表(无数据权限,供开放接口使用) + *

+ * 说明:开放接口使用应用级授权,不需要用户级数据权限过滤。 + * 数据范围由接口参数(schoolId, gradeId 等)控制。 + * + * @param page 分页信息 + * @param queryWrapper 查询条件 + * @return 学生分页列表 + */ + default Page selectPageStudentListNoDataScope(Page page, Wrapper queryWrapper) { + return this.selectPage(page, queryWrapper); + } + + /** + * 查询学生列表(无数据权限,供开放接口使用) + * + * @param queryWrapper 查询条件 + * @return 学生列表 + */ + default List selectStudentListNoDataScope(Wrapper queryWrapper) { + return this.selectList(queryWrapper); + } } diff --git a/backend/pangu-modules/pangu-business/src/main/resources/mapper/application/PgAppApiMapper.xml b/backend/pangu-modules/pangu-business/src/main/resources/mapper/application/PgAppApiMapper.xml new file mode 100644 index 0000000..c969306 --- /dev/null +++ b/backend/pangu-modules/pangu-business/src/main/resources/mapper/application/PgAppApiMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/MailSendController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/MailSendController.java index 48365a3..ca78e9f 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/MailSendController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/MailSendController.java @@ -15,7 +15,7 @@ import java.util.Arrays; /** * 邮件发送案例 * - * @author Michelle.Chung + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java index 2335da4..67b2a4b 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java @@ -17,7 +17,7 @@ import java.time.Duration; /** * spring-cache 演示案例 * - * @author Lion Li + * @author pangu */ // 类级别 缓存统一配置 //@CacheConfig(cacheNames = CacheNames.DEMO_CACHE) diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java index 237b6ee..28a1a6f 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java @@ -18,7 +18,7 @@ import java.time.LocalTime; /** * 测试分布式锁的样例 * - * @author shenxinquan + * @author pangu */ @Slf4j @RestController diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java index bdbf033..17c1bba 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java @@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RestController; /** * Redis 发布订阅 演示案例 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @RestController diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisRateLimiterController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisRateLimiterController.java index f8adf7d..93fdf29 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisRateLimiterController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/RedisRateLimiterController.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RestController; /** * 测试分布式限流样例 * - * @author Lion Li + * @author pangu */ @Slf4j @RestController diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/SmsController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/SmsController.java index b993f60..cc6c846 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/SmsController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/SmsController.java @@ -16,7 +16,7 @@ import java.util.LinkedHashMap; * 短信演示案例 * 请先阅读文档 否则无法使用 * - * @author Lion Li + * @author pangu * @version 4.2.0 */ @Validated diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java index bb02f98..512baed 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java @@ -11,7 +11,7 @@ import org.springframework.web.multipart.MultipartFile; /** * swagger3 用法示例 * - * @author Lion Li + * @author pangu */ @RestController @RequestMapping("/swagger/demo") diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java index af8c77b..dd721c4 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java @@ -17,7 +17,7 @@ import java.util.List; /** * 测试批量方法 * - * @author Lion Li + * @author pangu * @date 2021-05-30 */ @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java index f31c540..b2e7b0c 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java @@ -36,7 +36,7 @@ import java.util.concurrent.TimeUnit; /** * 测试单表Controller * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ @Validated diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java index 2b6886d..76051bc 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java @@ -17,7 +17,7 @@ import java.util.Map; /** * 测试数据库加解密功能 * - * @author Lion Li + * @author pangu */ @Validated @RestController diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java index 64243b7..f7103ca 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java @@ -24,7 +24,7 @@ import java.util.Map; /** * 测试Excel功能 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @RestController diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java index 40393c5..ff4cc84 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java @@ -16,7 +16,7 @@ import jakarta.validation.constraints.NotNull; /** * 测试国际化 * - * @author Lion Li + * @author pangu */ @Validated @RestController diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java index eba0552..2295f58 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RestController; * 默认管理员不过滤 * 需自行根据业务重写实现 * - * @author Lion Li + * @author pangu * @version 3.6.0 * @see SensitiveService */ diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java index 5c55205..510350a 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java @@ -26,7 +26,7 @@ import java.util.List; /** * 测试树表Controller * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ @Validated diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/WebSocketController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/WebSocketController.java index 65bf68e..5ae6b3c 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/WebSocketController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/WebSocketController.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RestController; /** * WebSocket 演示案例 * - * @author zendwang + * @author pangu */ @RequiredArgsConstructor @RestController diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java index a3051b2..8931c41 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RestController; * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 * - * @author Lion Li + * @author pangu * @version 3.6.0 * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java index 7c494e2..6abe7b2 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java @@ -20,7 +20,7 @@ import java.util.concurrent.TimeUnit; * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 * 集群测试流程 两台集群分别开启订阅 在其中一台发送数据 观察接收消息的规律 * - * @author Lion Li + * @author pangu * @version 3.6.0 * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java index 43862a6..0e224a5 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java @@ -6,7 +6,7 @@ import lombok.NoArgsConstructor; /** * 实体类 注意不允许使用内部类 否则会找不到类 * - * @author Lion Li + * @author pangu * @version 3.6.0 * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java index 2f2b737..069423b 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RestController; * 集群测试通过 同一个消息只会被消费一次 做好事务补偿 * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 * - * @author Lion Li + * @author pangu * @version 3.6.0 * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/TestDemo.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/TestDemo.java index d3af0c9..d0c0241 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/TestDemo.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/TestDemo.java @@ -10,7 +10,7 @@ import java.io.Serial; /** * 测试单表对象 test_demo * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ @Data diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/TestTree.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/TestTree.java index fd68253..3450ff1 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/TestTree.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/TestTree.java @@ -13,7 +13,7 @@ import java.io.Serial; /** * 测试树表对象 test_tree * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ @Data diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java index ef21980..94cd882 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java @@ -14,7 +14,7 @@ import jakarta.validation.constraints.NotNull; /** * 测试单表业务对象 test_demo * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java index dc8b35f..346b6d1 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java @@ -9,7 +9,7 @@ import jakarta.validation.constraints.NotNull; /** * 测试单表业务对象 test_demo * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ @Data diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java index 1bbac0e..9f421b7 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java @@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode; /** * 测试树表业务对象 test_tree * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java index b42ce76..fb99c41 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java @@ -21,7 +21,7 @@ import java.io.Serializable; /** * 带有下拉选的Excel导出 * - * @author Emil.Zhang + * @author pangu */ @Data @ExcelIgnoreUnannotated diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java index 642e0f7..39aa94f 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java @@ -19,7 +19,7 @@ import java.util.Date; /** * 测试单表视图对象 test_demo * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ @Data diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java index ee2336a..6b3b3f8 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java @@ -14,7 +14,7 @@ import java.util.Date; /** * 测试树表视图对象 test_tree * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ @Data diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java index de92760..db13bca 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java @@ -14,7 +14,7 @@ import java.util.List; /** * Excel带下拉框的解析处理器 * - * @author Emil.Zhang + * @author pangu */ public class ExportDemoListener extends DefaultExcelListener { diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java index 601f97a..25f1405 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java @@ -6,7 +6,7 @@ import org.dromara.demo.domain.TestDemoEncrypt; /** * 测试加密功能 * - * @author Lion Li + * @author pangu */ public interface TestDemoEncryptMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java index 19b2d52..3d1a579 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java @@ -18,7 +18,7 @@ import java.util.List; /** * 测试单表Mapper接口 * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ public interface TestDemoMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java index e5f4c44..ddfeaba 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java @@ -9,7 +9,7 @@ import org.dromara.demo.domain.vo.TestTreeVo; /** * 测试树表Mapper接口 * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ @DataPermission({ diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java index ad2392b..4456c18 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java @@ -7,7 +7,7 @@ import java.io.IOException; /** * 导出下拉框Excel示例 * - * @author Emil.Zhang + * @author pangu */ public interface IExportExcelService { diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java index bca4192..d4948bb 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java @@ -12,7 +12,7 @@ import java.util.List; /** * 测试单表Service接口 * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ public interface ITestDemoService { diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java index 9155201..d84f9ab 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java @@ -9,7 +9,7 @@ import java.util.List; /** * 测试树表Service接口 * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ public interface ITestTreeService { diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java index 2813cc2..3f89b2c 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java @@ -25,7 +25,7 @@ import java.util.stream.Collectors; /** * 导出下拉框Excel示例 * - * @author Emil.Zhang + * @author pangu */ @Service @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java index 415e440..b96f6e0 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java @@ -23,7 +23,7 @@ import java.util.Map; /** * 测试单表Service业务层处理 * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java index 836a090..76ad605 100644 --- a/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java +++ b/backend/pangu-modules/pangu-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java @@ -19,7 +19,7 @@ import java.util.Map; /** * 测试树表Service业务层处理 * - * @author Lion Li + * @author pangu * @date 2021-07-26 */ // @DS("slave") // 切换从库查询 diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/config/GenConfig.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/config/GenConfig.java index b29f8c9..3e77852 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/config/GenConfig.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/config/GenConfig.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; /** * 读取代码生成相关配置 * - * @author ruoyi + * @author pangu */ @Component @ConfigurationProperties(prefix = "gen") diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java index 8c0f352..1a3e379 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java @@ -19,7 +19,7 @@ import java.util.Map; /** * anyline 适配 动态数据源改造 * - * @author Lion Li + * @author pangu */ @Slf4j @Component diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/constant/GenConstants.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/constant/GenConstants.java index b9888fb..9208531 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/constant/GenConstants.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/constant/GenConstants.java @@ -3,7 +3,7 @@ package org.dromara.generator.constant; /** * 代码生成通用常量 * - * @author ruoyi + * @author pangu */ public interface GenConstants { /** diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/controller/GenController.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/controller/GenController.java index 802c43c..b832ee5 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/controller/GenController.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/controller/GenController.java @@ -28,7 +28,7 @@ import java.util.Map; /** * 代码生成 操作处理 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/domain/GenTable.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/domain/GenTable.java index f2d7257..b114418 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/domain/GenTable.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/domain/GenTable.java @@ -17,7 +17,7 @@ import java.util.List; /** * 业务表 gen_table * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java index 63fd1f5..4b8d534 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java @@ -14,7 +14,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity; /** * 代码生成业务字段表 gen_table_column * - * @author Lion Li + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java index ed8ed20..ef5fd6f 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java @@ -7,7 +7,7 @@ import org.dromara.generator.domain.GenTableColumn; /** * 业务字段 数据层 * - * @author Lion Li + * @author pangu */ @InterceptorIgnore(dataPermission = "true", tenantLine = "true") public interface GenTableColumnMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java index 1798b4b..a340b6e 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * 业务 数据层 * - * @author Lion Li + * @author pangu */ @InterceptorIgnore(dataPermission = "true", tenantLine = "true") public interface GenTableMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 3e7bdf7..b851df6 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -51,7 +51,7 @@ import java.util.zip.ZipOutputStream; /** * 业务 服务层实现 * - * @author Lion Li + * @author pangu */ @Slf4j @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/service/IGenTableService.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/service/IGenTableService.java index b2c20c5..94ce9ef 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/service/IGenTableService.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/service/IGenTableService.java @@ -11,7 +11,7 @@ import java.util.Map; /** * 业务 服务层 * - * @author Lion Li + * @author pangu */ public interface IGenTableService { diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/GenUtils.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/GenUtils.java index ea97292..4551381 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/GenUtils.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/GenUtils.java @@ -14,7 +14,7 @@ import java.util.Arrays; /** * 代码生成器 工具类 * - * @author ruoyi + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class GenUtils { diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/VelocityInitializer.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/VelocityInitializer.java index 09e0121..28175ad 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/VelocityInitializer.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/VelocityInitializer.java @@ -10,7 +10,7 @@ import java.util.Properties; /** * VelocityEngine工厂 * - * @author ruoyi + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class VelocityInitializer { diff --git a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java index 44c5979..bf19da6 100644 --- a/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java +++ b/backend/pangu-modules/pangu-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java @@ -20,7 +20,7 @@ import java.util.*; /** * 模板处理工具类 * - * @author ruoyi + * @author pangu */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class VelocityUtils { diff --git a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java index d5c3ea7..f32bc6a 100644 --- a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java +++ b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java @@ -16,7 +16,7 @@ import java.math.BigDecimal; * DAG工作流任务-模拟支付宝账单任务 * * - * @author 老马 + * @author pangu */ @Component @JobExecutor(name = "alipayBillTask") diff --git a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java index 47d7305..ca2ce21 100644 --- a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java +++ b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java @@ -15,7 +15,7 @@ import java.math.BigDecimal; * DAG工作流任务-模拟汇总账单任务 * * - * @author 老马 + * @author pangu */ @Component @JobExecutor(name = "summaryBillTask") diff --git a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java index aa3d99e..080da59 100644 --- a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java +++ b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Component; * 正常任务 * * - * @author 老马 + * @author pangu */ @Component @JobExecutor(name = "testJobExecutor") diff --git a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java index 9cb8309..15c2604 100644 --- a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java +++ b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Component; * 广播任务 * * - * @author 老马 + * @author pangu */ @Slf4j @Component diff --git a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java index 93da0a9..b957329 100644 --- a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java +++ b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java @@ -6,7 +6,7 @@ import com.aizuda.snailjob.model.dto.ExecuteResult; import org.springframework.stereotype.Component; /** - * @author opensnail + * @author pangu * @date 2024-05-17 */ @Component diff --git a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java index f58d772..bd9af0d 100644 --- a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java +++ b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java @@ -19,7 +19,7 @@ import java.util.stream.IntStream; * Map任务 动态分配 只分片不关注结果 * * - * @author 老马 + * @author pangu */ @Component @JobExecutor(name = "testMapJobAnnotation") diff --git a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java index f926016..baca823 100644 --- a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java +++ b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java @@ -21,7 +21,7 @@ import java.util.stream.IntStream; * MapReduce任务 动态分配 分片后合并结果 * * - * @author 老马 + * @author pangu */ @Component @JobExecutor(name = "testMapReduceAnnotation1") diff --git a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java index 060fcd4..a1444e2 100644 --- a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java +++ b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Component; * 静态分片 根据服务端任务参数分片 * * - * @author 老马 + * @author pangu */ @Component @JobExecutor(name = "testStaticShardingJob") diff --git a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java index e19a48e..889c562 100644 --- a/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java +++ b/backend/pangu-modules/pangu-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java @@ -16,7 +16,7 @@ import java.math.BigDecimal; * DAG工作流任务-模拟微信账单任务 * * - * @author 老马 + * @author pangu */ @Component @JobExecutor(name = "wechatBillTask") diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java index 4a82536..247b4fb 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java @@ -16,7 +16,7 @@ import java.util.*; /** * 缓存监控 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @RestController diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java index 3787170..a547270 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -25,7 +25,7 @@ import java.util.List; /** * 系统访问记录 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java index d2e4c9e..691fd7e 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java @@ -22,7 +22,7 @@ import java.util.List; /** * 操作日志记录 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java index 0e6f171..132789d 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java @@ -28,7 +28,7 @@ import java.util.stream.Collectors; /** * 在线用户监控 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @RestController diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysClientController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysClientController.java index fb87df7..c84c55c 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysClientController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysClientController.java @@ -26,7 +26,7 @@ import java.util.List; /** * 客户端管理 * - * @author Michelle.Chung + * @author pangu * @date 2023-06-18 */ @Validated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java index 2be7858..4585c2d 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java @@ -23,7 +23,7 @@ import java.util.List; /** * 参数配置 信息操作处理 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java index 3acb947..1a01b83 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -22,7 +22,7 @@ import java.util.List; /** * 部门信息 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java index ae6d580..c1422c6 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java @@ -26,7 +26,7 @@ import java.util.List; /** * 数据字典信息 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java index d88e6ec..0777cca 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -24,7 +24,7 @@ import java.util.List; /** * 数据字典信息 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java index bdf6afa..f2b3b03 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -28,7 +28,7 @@ import java.util.List; /** * 菜单信息 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java index 86abb9a..cc03d8b 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java @@ -20,7 +20,7 @@ import org.springframework.web.bind.annotation.*; /** * 公告 信息操作处理 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java index 2369980..c8492fa 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java @@ -25,8 +25,8 @@ import java.util.List; /** * 对象存储配置 * - * @author Lion Li - * @author 孤舟烟雨 + * @author pangu + * @author pangu * @date 2021-08-13 */ @Validated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysOssController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysOssController.java index 35c1a89..2d59992 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysOssController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysOssController.java @@ -28,7 +28,7 @@ import java.util.List; /** * 文件上传 控制层 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysPostController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysPostController.java index 0f1b80c..5790ca7 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysPostController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysPostController.java @@ -29,7 +29,7 @@ import java.util.List; /** * 岗位信息操作处理 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java index 2edab3e..c4beba5 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -33,7 +33,7 @@ import java.util.Arrays; /** * 个人信息 业务处理 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java index 755a9ec..f7fa4bc 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -29,7 +29,7 @@ import java.util.List; /** * 角色信息 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java index b0281cf..6a42264 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java @@ -16,7 +16,7 @@ import java.util.List; /** * 社会化关系 * - * @author thiszhc + * @author pangu * @date 2023-06-16 */ @Validated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java index b29e681..836fe21 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java @@ -33,7 +33,7 @@ import java.util.List; /** * 租户管理 * - * @author Michelle.Chung + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java index 0f724be..2e3a763 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java @@ -29,7 +29,7 @@ import java.util.List; /** * 租户套餐管理 * - * @author Michelle.Chung + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index 2847fc2..1bb8fb1 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -43,7 +43,7 @@ import java.util.List; /** * 用户信息 * - * @author Lion Li + * @author pangu */ @Validated @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysCache.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysCache.java index e398a20..6d581e0 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysCache.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysCache.java @@ -7,7 +7,7 @@ import lombok.NoArgsConstructor; /** * 缓存信息 * - * @author Lion Li + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysClient.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysClient.java index ee2475d..b3b690b 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysClient.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysClient.java @@ -10,7 +10,7 @@ import java.io.Serial; /** * 授权管理对象 sys_client * - * @author Michelle.Chung + * @author pangu * @date 2023-05-15 */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysConfig.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysConfig.java index 6fcb88f..38a4047 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysConfig.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysConfig.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; /** * 参数配置表 sys_config * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDept.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDept.java index d436a1c..9bbcedf 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDept.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDept.java @@ -15,7 +15,7 @@ import java.util.List; /** * 部门表 sys_dept * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDictData.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDictData.java index 9d83736..56e246f 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDictData.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDictData.java @@ -10,7 +10,7 @@ import org.dromara.common.tenant.core.TenantEntity; /** * 字典数据表 sys_dict_data * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDictType.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDictType.java index 955af85..8adcf8c 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDictType.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysDictType.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; /** * 字典类型表 sys_dict_type * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysLogininfor.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysLogininfor.java index c57dc0a..fc0384a 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysLogininfor.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysLogininfor.java @@ -11,7 +11,7 @@ import java.util.Date; /** * 系统访问记录表 sys_logininfor * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysMenu.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysMenu.java index 5fe0de5..0668220 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysMenu.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysMenu.java @@ -16,7 +16,7 @@ import java.util.List; /** * 菜单权限表 sys_menu * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysNotice.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysNotice.java index bfcc2bc..a557d97 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysNotice.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysNotice.java @@ -10,7 +10,7 @@ import lombok.EqualsAndHashCode; /** * 通知公告表 sys_notice * - * @author Lion Li + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOperLog.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOperLog.java index 41a8c59..2ecfe53 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOperLog.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOperLog.java @@ -11,7 +11,7 @@ import java.util.Date; /** * 操作日志记录表 oper_log * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOss.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOss.java index 2285a5d..244692b 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOss.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOss.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; /** * OSS对象存储对象 * - * @author Lion Li + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOssConfig.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOssConfig.java index 4b67d63..bd78c8b 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOssConfig.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOssConfig.java @@ -9,7 +9,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity; /** * 对象存储配置对象 sys_oss_config * - * @author Lion Li + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOssExt.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOssExt.java index 15a95e7..c86838c 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOssExt.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysOssExt.java @@ -9,7 +9,7 @@ import java.util.List; /** * 附件扩展字段对象(存储在 SysOss.ext1 的 JSON 字符串中) * - * @author AprilWind + * @author pangu */ @Data public class SysOssExt implements Serializable { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysPost.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysPost.java index 2c985da..90ea1e4 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysPost.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysPost.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; /** * 岗位表 sys_post * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRole.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRole.java index aa1b19a..013f8f9 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRole.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRole.java @@ -11,7 +11,7 @@ import lombok.NoArgsConstructor; /** * 角色表 sys_role * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRoleDept.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRoleDept.java index ba77694..9b086bf 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRoleDept.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRoleDept.java @@ -8,7 +8,7 @@ import lombok.Data; /** * 角色和部门关联 sys_role_dept * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java index ba28f17..eeaedf3 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java @@ -8,7 +8,7 @@ import lombok.Data; /** * 角色和菜单关联 sys_role_menu * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysSocial.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysSocial.java index 10f2936..be722ad 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysSocial.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysSocial.java @@ -11,7 +11,7 @@ import java.io.Serial; /** * 社会化关系对象 sys_social * - * @author thiszhc + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysTenant.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysTenant.java index 9800c30..f4d7ac2 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysTenant.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysTenant.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 租户对象 sys_tenant * - * @author Michelle.Chung + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java index 5f58e3e..c6251c6 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java @@ -10,7 +10,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity; /** * 租户套餐对象 sys_tenant_package * - * @author Michelle.Chung + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUser.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUser.java index a06172f..52f4c8b 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUser.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUser.java @@ -12,7 +12,7 @@ import java.util.Date; /** * 用户对象 sys_user * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserOnline.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserOnline.java index ba30eb6..c95b072 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserOnline.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserOnline.java @@ -5,7 +5,7 @@ import lombok.Data; /** * 当前在线会话 * - * @author Lion Li + * @author pangu */ @Data public class SysUserOnline { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserPost.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserPost.java index 119c117..4a97eb9 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserPost.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserPost.java @@ -8,7 +8,7 @@ import lombok.Data; /** * 用户和岗位关联 sys_user_post * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserRole.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserRole.java index 0a50e80..dc3cc44 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserRole.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/SysUserRole.java @@ -8,7 +8,7 @@ import lombok.Data; /** * 用户和角色关联 sys_user_role * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java index e5f5ffa..7ff8613 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java @@ -14,7 +14,7 @@ import java.util.List; /** * 授权管理业务对象 sys_client * - * @author Michelle.Chung + * @author pangu * @date 2023-05-15 */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java index 257935d..c3915e2 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java @@ -11,7 +11,7 @@ import org.dromara.system.domain.SysConfig; /** * 参数配置业务对象 sys_config * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java index 0d8ac84..f88df32 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java @@ -13,7 +13,7 @@ import org.dromara.system.domain.SysDept; /** * 部门业务对象 sys_dept * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java index 042946c..1da32be 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java @@ -12,7 +12,7 @@ import org.dromara.system.domain.SysDictData; /** * 字典数据业务对象 sys_dict_data * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java index fcc1ac1..0f719a0 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java @@ -13,7 +13,7 @@ import org.dromara.system.domain.SysDictType; /** * 字典类型业务对象 sys_dict_type * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java index 4646162..3bb2997 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java @@ -11,7 +11,7 @@ import java.util.Map; /** * 系统访问记录业务对象 sys_logininfor * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java index 118c954..5fd2d61 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java @@ -17,7 +17,7 @@ import org.dromara.system.domain.SysMenu; /** * 菜单权限业务对象 sys_menu * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java index cdcc575..c00519c 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java @@ -12,7 +12,7 @@ import org.dromara.system.domain.SysNotice; /** * 通知公告业务对象 sys_notice * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java index f16400a..977fda2 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java @@ -13,7 +13,7 @@ import java.util.Map; /** * 操作日志记录业务对象 sys_oper_log * - * @author Michelle.Chung + * @author pangu * @date 2023-02-07 */ diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java index ff624c9..84386a0 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; /** * OSS对象存储分页查询对象 sys_oss * - * @author Lion Li + * @author pangu */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java index 3dc4328..e4a2f89 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java @@ -14,8 +14,8 @@ import lombok.EqualsAndHashCode; /** * 对象存储配置业务对象 sys_oss_config * - * @author Lion Li - * @author 孤舟烟雨 + * @author pangu + * @author pangu * @date 2021-08-13 */ diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java index 09805cd..b089cf6 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java @@ -12,7 +12,7 @@ import org.dromara.system.domain.SysPost; /** * 岗位信息业务对象 sys_post * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java index 5e3e602..55b4f46 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java @@ -14,7 +14,7 @@ import org.dromara.system.domain.SysRole; /** * 角色信息业务对象 sys_role * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java index cede1e9..a3141ce 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java @@ -14,7 +14,7 @@ import org.dromara.system.domain.SysSocial; /** * 社会化关系业务对象 sys_social * - * @author Lion Li + * @author pangu */ @Data @NoArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java index 3757f9a..65dbb01 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java @@ -15,7 +15,7 @@ import java.util.Date; /** * 租户业务对象 sys_tenant * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java index b27a406..5ff310e 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java @@ -14,7 +14,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity; /** * 租户套餐业务对象 sys_tenant_package * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java index 11c0166..6759fa8 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -15,7 +15,7 @@ import org.dromara.system.domain.SysUser; /** * 用户信息业务对象 sys_user * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java index 846dd79..ba51b1e 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java @@ -15,7 +15,7 @@ import org.dromara.common.sensitive.core.SensitiveStrategy; /** * 个人信息业务处理 * - * @author Michelle.Chung + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java index 840ddaf..f795e70 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java @@ -6,7 +6,7 @@ import lombok.Data; /** * 路由显示信息 * - * @author ruoyi + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/ProfileUserVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/ProfileUserVo.java index 70fc5d3..9663206 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/ProfileUserVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/ProfileUserVo.java @@ -12,7 +12,7 @@ import java.util.Date; /** * 用户信息视图对象 sys_user * - * @author Lion Li + * @author pangu */ @Data public class ProfileUserVo implements Serializable { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java index d56e09d..4277bfb 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java @@ -8,7 +8,7 @@ import java.util.List; /** * 路由配置信息 * - * @author Lion Li + * @author pangu */ @Data @JsonInclude(JsonInclude.Include.NON_EMPTY) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java index 82b0f46..721c250 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java @@ -16,7 +16,7 @@ import java.util.List; /** * 授权管理视图对象 sys_client * - * @author Michelle.Chung + * @author pangu * @date 2023-05-15 */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java index a35e132..2fc10e5 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java @@ -16,7 +16,7 @@ import java.util.Date; /** * 参数配置视图对象 sys_config * - * @author Michelle.Chung + * @author pangu */ @Data @ExcelIgnoreUnannotated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java index c9f5a1f..96ff67a 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -17,7 +17,7 @@ import java.util.List; /** * 部门视图对象 sys_dept * - * @author Michelle.Chung + * @author pangu */ @Data @ExcelIgnoreUnannotated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java index d97c00d..d0e8dbe 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java @@ -16,7 +16,7 @@ import java.util.Date; /** * 字典数据视图对象 sys_dict_data * - * @author Michelle.Chung + * @author pangu */ @Data @ExcelIgnoreUnannotated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java index 4b62226..a11274a 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java @@ -16,7 +16,7 @@ import java.util.Date; /** * 字典类型视图对象 sys_dict_type * - * @author Michelle.Chung + * @author pangu */ @Data @ExcelIgnoreUnannotated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java index 3086aa7..177c45a 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java @@ -17,7 +17,7 @@ import java.io.Serializable; /** * 系统访问记录视图对象 sys_logininfor * - * @author Michelle.Chung + * @author pangu * @date 2023-02-07 */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java index 5214a33..0b47fb3 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java @@ -14,7 +14,7 @@ import java.util.List; /** * 菜单权限视图对象 sys_menu * - * @author Michelle.Chung + * @author pangu */ @Data @AutoMapper(target = SysMenu.class) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java index afe7367..23b9369 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java @@ -15,7 +15,7 @@ import java.util.Date; /** * 通知公告视图对象 sys_notice * - * @author Michelle.Chung + * @author pangu */ @Data @AutoMapper(target = SysNotice.class) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java index 00b3344..dec16f7 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java @@ -16,7 +16,7 @@ import java.util.Date; /** * 操作日志记录视图对象 sys_oper_log * - * @author Michelle.Chung + * @author pangu * @date 2023-02-07 */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java index a030722..57370f3 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java @@ -12,8 +12,8 @@ import java.io.Serializable; /** * 对象存储配置视图对象 sys_oss_config * - * @author Lion Li - * @author 孤舟烟雨 + * @author pangu + * @author pangu * @date 2021-08-13 */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java index 11e0ff8..0e0072b 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java @@ -5,7 +5,7 @@ import lombok.Data; /** * 上传对象信息 * - * @author Michelle.Chung + * @author pangu */ @Data public class SysOssUploadVo { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java index fe05651..9733982 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java @@ -13,7 +13,7 @@ import java.util.Date; /** * OSS对象存储视图对象 sys_oss * - * @author Lion Li + * @author pangu */ @Data @AutoMapper(target = SysOss.class) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java index 50140b6..0c494df 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java @@ -17,7 +17,7 @@ import java.util.Date; /** * 岗位信息视图对象 sys_post * - * @author Michelle.Chung + * @author pangu */ @Data @ExcelIgnoreUnannotated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java index 1a205cc..ff6f552 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -16,7 +16,7 @@ import java.util.Date; /** * 角色信息视图对象 sys_role * - * @author Michelle.Chung + * @author pangu */ @Data @ExcelIgnoreUnannotated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java index 948dbcc..1128168 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java @@ -12,7 +12,7 @@ import java.util.Date; /** * 社会化关系视图对象 sys_social * - * @author thiszhc + * @author pangu */ @Data @AutoMapper(target = SysSocial.class) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java index ead9229..92bb31f 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java @@ -15,7 +15,7 @@ import java.io.Serializable; /** * 租户套餐视图对象 sys_tenant_package * - * @author Michelle.Chung + * @author pangu */ @Data @ExcelIgnoreUnannotated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java index 021c664..89e295d 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java @@ -16,7 +16,7 @@ import java.io.Serializable; /** * 租户视图对象 sys_tenant * - * @author Michelle.Chung + * @author pangu */ @Data @ExcelIgnoreUnannotated diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java index c600872..a9ac357 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java @@ -15,7 +15,7 @@ import java.util.Date; /** * 用户对象导出VO * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java index 4507f63..d5ba9a8 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java @@ -12,7 +12,7 @@ import java.io.Serializable; /** * 用户对象导入VO * - * @author Lion Li + * @author pangu */ @Data diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java index e41355d..9c33484 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java @@ -7,7 +7,7 @@ import java.util.List; /** * 用户信息 * - * @author Michelle.Chung + * @author pangu */ @Data public class SysUserInfoVo { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java index 755dcf8..fc92771 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -19,7 +19,7 @@ import java.util.List; /** * 用户信息视图对象 sys_user * - * @author Michelle.Chung + * @author pangu */ @Data @AutoMapper(target = SysUser.class) diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java index 48fa92a..83fd769 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java @@ -7,7 +7,7 @@ import java.util.Set; /** * 登录用户信息 * - * @author Michelle.Chung + * @author pangu */ @Data public class UserInfoVo { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java index 66db5f5..b8d9e53 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java @@ -27,7 +27,7 @@ import java.util.List; /** * 系统用户自定义导入 * - * @author Lion Li + * @author pangu */ @Slf4j public class SysUserImportListener extends AnalysisEventListener implements ExcelListener { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java index 15bcfb4..faa6a3a 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java @@ -7,7 +7,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** * 授权管理Mapper接口 * - * @author Michelle.Chung + * @author pangu * @date 2023-05-15 */ public interface SysClientMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java index 0eaaee8..5776174 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java @@ -7,7 +7,7 @@ import org.dromara.system.domain.vo.SysConfigVo; /** * 参数配置 数据层 * - * @author Lion Li + * @author pangu */ public interface SysConfigMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 80a99cf..c7e1fe5 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -16,7 +16,7 @@ import java.util.List; /** * 部门管理 数据层 * - * @author Lion Li + * @author pangu */ public interface SysDeptMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java index 7298db3..16c1c80 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * 字典表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysDictDataMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java index 9a9bdd5..6f91247 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java @@ -7,7 +7,7 @@ import org.dromara.system.domain.vo.SysDictTypeVo; /** * 字典表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysDictTypeMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java index 85edd1d..171a7a5 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java @@ -7,7 +7,7 @@ import org.dromara.system.domain.vo.SysLogininforVo; /** * 系统访问日志情况信息 数据层 * - * @author Lion Li + * @author pangu */ public interface SysLogininforMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java index 05e2546..be02a3f 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -15,7 +15,7 @@ import java.util.Set; /** * 菜单表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysMenuMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java index 1e27b77..1681666 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java @@ -7,7 +7,7 @@ import org.dromara.system.domain.vo.SysNoticeVo; /** * 通知公告表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysNoticeMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java index 5d20404..a558ccd 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java @@ -7,7 +7,7 @@ import org.dromara.system.domain.vo.SysOperLogVo; /** * 操作日志 数据层 * - * @author Lion Li + * @author pangu */ public interface SysOperLogMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java index f93d34d..7882002 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java @@ -7,8 +7,8 @@ import org.dromara.system.domain.vo.SysOssConfigVo; /** * 对象存储配置Mapper接口 * - * @author Lion Li - * @author 孤舟烟雨 + * @author pangu + * @author pangu * @date 2021-08-13 */ public interface SysOssConfigMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java index 3da621d..2e7f4e2 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java @@ -7,7 +7,7 @@ import org.dromara.system.domain.vo.SysOssVo; /** * 文件上传 数据层 * - * @author Lion Li + * @author pangu */ public interface SysOssMapper extends BaseMapperPlus { } diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java index d8d0315..4456fd0 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -14,7 +14,7 @@ import java.util.List; /** * 岗位信息 数据层 * - * @author Lion Li + * @author pangu */ public interface SysPostMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java index 3de0bb6..064d28d 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java @@ -6,7 +6,7 @@ import org.dromara.system.domain.SysRoleDept; /** * 角色与部门关联表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysRoleDeptMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java index 9207805..7481830 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java @@ -16,7 +16,7 @@ import java.util.List; /** * 角色表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysRoleMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java index 8aa9dd3..753e055 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java @@ -9,7 +9,7 @@ import java.util.List; /** * 角色与菜单关联表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysRoleMenuMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java index b942061..f391579 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java @@ -7,7 +7,7 @@ import org.dromara.system.domain.vo.SysSocialVo; /** * 社会化关系Mapper接口 * - * @author thiszhc + * @author pangu */ public interface SysSocialMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java index 7e1167a..876a6a0 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java @@ -7,7 +7,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** * 租户Mapper接口 * - * @author Michelle.Chung + * @author pangu */ public interface SysTenantMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java index 10ca170..b888c8f 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java @@ -7,7 +7,7 @@ import org.dromara.system.domain.vo.SysTenantPackageVo; /** * 租户套餐Mapper接口 * - * @author Michelle.Chung + * @author pangu */ public interface SysTenantPackageMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index 2cfd3db..a3cd1bd 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -17,7 +17,7 @@ import java.util.List; /** * 用户表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysUserMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java index 07c1371..dea30f2 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java @@ -6,7 +6,7 @@ import org.dromara.system.domain.SysUserPost; /** * 用户与岗位关联表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysUserPostMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java index 4c1c8b9..cda019b 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java @@ -9,7 +9,7 @@ import java.util.List; /** * 用户与角色关联表 数据层 * - * @author Lion Li + * @author pangu */ public interface SysUserRoleMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java index 27dad7d..7d23cc2 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Component; /** * 初始化 system 模块对应业务数据 * - * @author Lion Li + * @author pangu */ @Slf4j @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysClientService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysClientService.java index 9e742fd..4c3bb12 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysClientService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysClientService.java @@ -11,7 +11,7 @@ import java.util.List; /** * 客户端管理Service接口 * - * @author Michelle.Chung + * @author pangu * @date 2023-06-18 */ public interface ISysClientService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysConfigService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysConfigService.java index a101643..1ca93b7 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysConfigService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysConfigService.java @@ -10,7 +10,7 @@ import java.util.List; /** * 参数配置 服务层 * - * @author Lion Li + * @author pangu */ public interface ISysConfigService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java index 3f252f7..1905ef3 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java @@ -3,7 +3,7 @@ package org.dromara.system.service; /** * 通用 数据权限 服务 * - * @author Lion Li + * @author pangu */ public interface ISysDataScopeService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDeptService.java index 1397443..eb8ab5c 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -11,7 +11,7 @@ import java.util.List; /** * 部门管理 服务层 * - * @author Lion Li + * @author pangu */ public interface ISysDeptService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDictDataService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDictDataService.java index fdabd31..4adf79a 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDictDataService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDictDataService.java @@ -10,7 +10,7 @@ import java.util.List; /** * 字典 业务层 * - * @author Lion Li + * @author pangu */ public interface ISysDictDataService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java index e3a04de..e84ba55 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java @@ -11,7 +11,7 @@ import java.util.List; /** * 字典 业务层 * - * @author Lion Li + * @author pangu */ public interface ISysDictTypeService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysLogininforService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysLogininforService.java index 1bc1ea9..79f058e 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysLogininforService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysLogininforService.java @@ -10,7 +10,7 @@ import java.util.List; /** * 系统访问日志情况信息 服务层 * - * @author Lion Li + * @author pangu */ public interface ISysLogininforService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysMenuService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysMenuService.java index 8888c3c..3a5aff2 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysMenuService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysMenuService.java @@ -12,7 +12,7 @@ import java.util.Set; /** * 菜单 业务层 * - * @author Lion Li + * @author pangu */ public interface ISysMenuService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysNoticeService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysNoticeService.java index 8482cd0..1a159f9 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysNoticeService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysNoticeService.java @@ -10,7 +10,7 @@ import java.util.List; /** * 公告 服务层 * - * @author Lion Li + * @author pangu */ public interface ISysNoticeService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOperLogService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOperLogService.java index e8b340c..f4f3849 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOperLogService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOperLogService.java @@ -10,7 +10,7 @@ import java.util.List; /** * 操作日志 服务层 * - * @author Lion Li + * @author pangu */ public interface ISysOperLogService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java index 2f6dfc9..2459a9c 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java @@ -10,8 +10,8 @@ import java.util.Collection; /** * 对象存储配置Service接口 * - * @author Lion Li - * @author 孤舟烟雨 + * @author pangu + * @author pangu * @date 2021-08-13 */ public interface ISysOssConfigService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOssService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOssService.java index 057c068..27437b8 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOssService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysOssService.java @@ -15,7 +15,7 @@ import java.util.List; /** * 文件上传 服务层 * - * @author Lion Li + * @author pangu */ public interface ISysOssService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysPermissionService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysPermissionService.java index 0116df5..707bb69 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysPermissionService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysPermissionService.java @@ -5,7 +5,7 @@ import java.util.Set; /** * 用户权限处理 * - * @author Lion Li + * @author pangu */ public interface ISysPermissionService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysPostService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysPostService.java index 1caaab2..e8ed858 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysPostService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysPostService.java @@ -10,7 +10,7 @@ import java.util.List; /** * 岗位信息 服务层 * - * @author Lion Li + * @author pangu */ public interface ISysPostService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysRoleService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysRoleService.java index abbfc79..f41fdfd 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysRoleService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysRoleService.java @@ -12,7 +12,7 @@ import java.util.Set; /** * 角色业务层 * - * @author Lion Li + * @author pangu */ public interface ISysRoleService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysSocialService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysSocialService.java index cc7016e..9671871 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysSocialService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysSocialService.java @@ -8,7 +8,7 @@ import java.util.List; /** * 社会化关系Service接口 * - * @author thiszhc + * @author pangu */ public interface ISysSocialService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java index d060b68..0fbb72d 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java @@ -11,7 +11,7 @@ import java.util.List; /** * 租户套餐Service接口 * - * @author Michelle.Chung + * @author pangu */ public interface ISysTenantPackageService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysTenantService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysTenantService.java index 1c763e0..ddaf1af 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysTenantService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysTenantService.java @@ -11,7 +11,7 @@ import java.util.List; /** * 租户Service接口 * - * @author Michelle.Chung + * @author pangu */ public interface ISysTenantService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysUserService.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysUserService.java index 9e255f9..994af6f 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -11,7 +11,7 @@ import java.util.List; /** * 用户 业务层 * - * @author Lion Li + * @author pangu */ public interface ISysUserService { diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java index fc469ad..f0e3ff5 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java @@ -29,7 +29,7 @@ import java.util.List; /** * 客户端管理Service业务层处理 * - * @author Michelle.Chung + * @author pangu * @date 2023-06-18 */ @Slf4j diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java index 6b0b2a2..80b0296 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java @@ -35,7 +35,7 @@ import java.util.Map; /** * 参数配置 服务层实现 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java index e300802..2574445 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java @@ -22,7 +22,7 @@ import java.util.List; * 注意: 此Service内不允许调用标注`数据权限`注解的方法 * 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service("sdss") diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 4e6db15..598eb6b 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -41,7 +41,7 @@ import java.util.*; /** * 部门管理 服务实现 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java index 018f043..0bf4d39 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java @@ -25,7 +25,7 @@ import java.util.List; /** * 字典 业务层处理 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index 6d4d9fe..94d80b0 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -39,7 +39,7 @@ import java.util.stream.Collectors; /** * 字典 业务层处理 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java index c388d99..9ce0449 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java @@ -36,7 +36,7 @@ import java.util.Map; /** * 系统访问日志情况信息 服务层处理 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Slf4j diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index 0c69b1f..67c32c3 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -38,7 +38,7 @@ import java.util.Set; /** * 菜单 业务层处理 * - * @author Lion Li + * @author pangu */ @Slf4j @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java index aa4135f..e90e998 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java @@ -25,7 +25,7 @@ import java.util.List; /** * 公告 服务层实现 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java index 9399c90..68322fb 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java @@ -27,7 +27,7 @@ import java.util.Map; /** * 操作日志 服务层处理 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java index 539c1fc..0fefed8 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java @@ -33,8 +33,8 @@ import java.util.List; /** * 对象存储配置Service业务层处理 * - * @author Lion Li - * @author 孤舟烟雨 + * @author pangu + * @author pangu * @date 2021-08-13 */ @Slf4j diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java index d920ddb..2b3be31 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java @@ -47,7 +47,7 @@ import java.util.Map; /** * 文件上传 服务层实现 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java index 4bf6974..1439743 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java @@ -15,7 +15,7 @@ import java.util.Set; /** * 用户权限处理 * - * @author ruoyi + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 56a0c4b..78420da 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -31,7 +31,7 @@ import java.util.Map; /** * 岗位信息 服务层处理 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 53d270f..45e885d 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -43,7 +43,7 @@ import java.util.*; /** * 角色 业务层处理 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java index 8a0d45e..c446685 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Service; * 默认管理员不过滤 * 需自行根据业务重写实现 * - * @author Lion Li + * @author pangu * @version 3.6.0 */ @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java index 9c54cbc..fa2f4e9 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java @@ -17,7 +17,7 @@ import java.util.List; /** * 社会化关系Service业务层处理 * - * @author thiszhc + * @author pangu * @date 2023-06-12 */ @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java index 7b31f7b..abe7650 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java @@ -28,7 +28,7 @@ import java.util.Map; /** * 工作流设计器获取任务执行人 * - * @author Lion Li + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java index baefdf7..529662b 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java @@ -29,7 +29,7 @@ import java.util.List; /** * 租户套餐Service业务层处理 * - * @author Michelle.Chung + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index efbb040..3340321 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -40,7 +40,7 @@ import java.util.*; /** * 租户Service业务层处理 * - * @author Michelle.Chung + * @author pangu */ @RequiredArgsConstructor @Service diff --git a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 39ad4cb..16ba4db 100644 --- a/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/backend/pangu-modules/pangu-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -42,7 +42,7 @@ import java.util.*; /** * 用户 业务层处理 * - * @author Lion Li + * @author pangu */ @Slf4j @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/ConditionalOnEnable.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/ConditionalOnEnable.java index e844398..0d199e8 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/ConditionalOnEnable.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/ConditionalOnEnable.java @@ -20,7 +20,7 @@ import java.lang.annotation.Target; *

* 使用此注解时,可以动态控制工作流功能是否启用,而不需要修改代码逻辑 * - * @author Lion Li + * @author pangu */ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index 88372f0..a5d110c 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -4,7 +4,7 @@ package org.dromara.workflow.common.constant; /** * 工作流常量 * - * @author may + * @author pangu */ public interface FlowConstant { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java index 3ad9cf9..959a749 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java @@ -6,7 +6,7 @@ import lombok.Getter; /** * 按钮权限枚举 * - * @author AprilWind + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/CopySettingEnum.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/CopySettingEnum.java index a74af3b..fa0d602 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/CopySettingEnum.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/CopySettingEnum.java @@ -6,7 +6,7 @@ import lombok.Getter; /** * 抄送设置枚举 * - * @author AprilWind + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java index 0fe5cfe..3041b21 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java @@ -11,7 +11,7 @@ import java.util.stream.Collectors; /** * 消息类型枚举 * - * @author may + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java index 9926a8e..2383764 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java @@ -3,7 +3,7 @@ package org.dromara.workflow.common.enums; /** * 节点扩展属性枚举 * - * @author AprilWind + * @author pangu */ public interface NodeExtEnum { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java index fff2688..3c4289d 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java @@ -12,7 +12,7 @@ import java.util.stream.Collectors; /** * 任务分配人枚举 * - * @author AprilWind + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java index eed1b91..0ade5cf 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java @@ -6,7 +6,7 @@ import lombok.Getter; /** * 人员类型 * - * @author AprilWind + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java index c7bced8..6cb9a24 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java @@ -11,7 +11,7 @@ import java.util.stream.Collectors; /** * 任务状态枚举 * - * @author may + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/VariablesEnum.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/VariablesEnum.java index dbd54ed..a144c7f 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/VariablesEnum.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/common/enums/VariablesEnum.java @@ -6,7 +6,7 @@ import lombok.Getter; /** * 变量枚举 * - * @author AprilWind + * @author pangu */ @Getter @AllArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java index 08f1808..96cea05 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.Configuration; /** * warmFlow配置 * - * @author may + * @author pangu */ @ConditionalOnEnable @Configuration diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java index 3007921..ce6e039 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java @@ -26,7 +26,7 @@ import java.util.List; /** * 流程分类 * - * @author may + * @author pangu */ @ConditionalOnEnable @Validated diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 54e412a..c2bdd48 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -26,7 +26,7 @@ import java.util.List; /** * 流程定义管理 控制层 * - * @author may + * @author pangu */ @ConditionalOnEnable @Validated diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index a8a5fc6..5baa6fb 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -27,7 +27,7 @@ import java.util.Map; /** * 流程实例管理 控制层 * - * @author may + * @author pangu */ @ConditionalOnEnable @Validated diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwSpelController.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwSpelController.java index 7d3932e..8f24a17 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwSpelController.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwSpelController.java @@ -25,7 +25,7 @@ import java.util.List; /** * 流程spel表达式定义 * - * @author Michelle.Chung + * @author pangu * @date 2025-07-04 */ @ConditionalOnEnable diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index f372fbb..5f6d90b 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -26,7 +26,7 @@ import java.util.List; /** * 任务管理 控制层 * - * @author may + * @author pangu */ @ConditionalOnEnable @Validated diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java index 39bb41f..0d62de7 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java @@ -27,7 +27,7 @@ import java.util.List; /** * 请假 * - * @author may + * @author pangu * @date 2023-07-21 */ @ConditionalOnEnable diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java index 28918f1..ffe7afd 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java @@ -15,7 +15,7 @@ import java.util.List; /** * 流程分类对象 wf_category * - * @author may + * @author pangu * @date 2023-06-27 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowInstanceBizExt.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowInstanceBizExt.java index 932b038..e39c76f 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowInstanceBizExt.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowInstanceBizExt.java @@ -12,7 +12,7 @@ import java.io.Serial; /** * 流程实例业务扩展对象 flow_instance_biz_ext * - * @author may + * @author pangu * @date 2025-08-05 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowSpel.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowSpel.java index 89a7ae9..1561399 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowSpel.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/FlowSpel.java @@ -12,7 +12,7 @@ import java.io.Serial; /** * 流程spel表达式定义对象 flow_spel * - * @author Michelle.Chung + * @author pangu * @date 2025-07-04 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java index b54873c..db58906 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java @@ -12,7 +12,7 @@ import java.util.Date; /** * 请假对象 test_leave * - * @author may + * @author pangu * @date 2023-07-21 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index a67a1f7..3eda048 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -15,7 +15,7 @@ import java.util.Objects; /** * 驳回参数请求 * - * @author may + * @author pangu */ @Data public class BackProcessBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index e246293..a24489a 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -14,7 +14,7 @@ import java.util.Objects; /** * 办理任务请求对象 * - * @author may + * @author pangu */ @Data public class CompleteTaskBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCancelBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCancelBo.java index 31742ea..84e7683 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCancelBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCancelBo.java @@ -10,7 +10,7 @@ import java.io.Serializable; /** * 撤销任务请求对象 * - * @author may + * @author pangu */ @Data public class FlowCancelBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java index fd626eb..1046736 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java @@ -13,7 +13,7 @@ import org.dromara.workflow.domain.FlowCategory; /** * 流程分类业务对象 wf_category * - * @author may + * @author pangu * @date 2023-06-27 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCopyBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCopyBo.java index a45e521..0aef254 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCopyBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCopyBo.java @@ -9,7 +9,7 @@ import java.io.Serializable; /** * 抄送 * - * @author may + * @author pangu */ @Data public class FlowCopyBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java index bb1621f..a42b122 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -9,7 +9,7 @@ import java.util.List; /** * 流程实例请求对象 * - * @author may + * @author pangu */ @Data public class FlowInstanceBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java index 297bd00..25d89e4 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java @@ -10,7 +10,7 @@ import java.io.Serializable; /** * 作废请求对象 * - * @author may + * @author pangu */ @Data public class FlowInvalidBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java index 12f0653..4d3d561 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java @@ -11,7 +11,7 @@ import java.util.Objects; /** * 下一节点信息 * - * @author may + * @author pangu */ @Data public class FlowNextNodeBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowSpelBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowSpelBo.java index da78935..491114c 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowSpelBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowSpelBo.java @@ -12,7 +12,7 @@ import org.dromara.workflow.domain.FlowSpel; /** * 流程spel表达式定义业务对象 flow_spel * - * @author Michelle.Chung + * @author pangu * @date 2025-07-04 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index 7540564..c4c3b34 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -12,7 +12,7 @@ import java.util.Map; /** * 任务请求对象 * - * @author may + * @author pangu */ @Data public class FlowTaskBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java index 897fc21..9c848b9 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java @@ -10,7 +10,7 @@ import java.io.Serializable; /** * 终止任务请求对象 * - * @author may + * @author pangu */ @Data public class FlowTerminationBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowUrgeTaskBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowUrgeTaskBo.java index 8e51b12..3ac6c4f 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowUrgeTaskBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowUrgeTaskBo.java @@ -11,7 +11,7 @@ import java.util.List; /** * 流程变量参数 * - * @author may + * @author pangu */ @Data public class FlowUrgeTaskBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowVariableBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowVariableBo.java index 9361299..bf69251 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowVariableBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowVariableBo.java @@ -10,7 +10,7 @@ import java.io.Serializable; /** * 流程变量参数 * - * @author may + * @author pangu */ @Data public class FlowVariableBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java index b31f4fa..61939d3 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java @@ -16,7 +16,7 @@ import java.util.Objects; /** * 启动流程对象 * - * @author may + * @author pangu */ @Data public class StartProcessBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java index 4348e31..3130940 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java @@ -14,7 +14,7 @@ import java.util.List; * 任务操作业务对象,用于描述任务委派、转办、加签等操作的必要参数 * 包含了用户ID、任务ID、任务相关的消息、以及加签/减签的用户ID * - * @author AprilWind + * @author pangu */ @Data public class TaskOperationBo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java index 2463569..78884fd 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java @@ -17,7 +17,7 @@ import java.util.Date; /** * 请假业务对象 test_leave * - * @author may + * @author pangu * @date 2023-07-21 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java index 7175e5e..603c579 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java @@ -8,7 +8,7 @@ import java.io.Serializable; /** * 按钮权限 * - * @author may + * @author pangu * @date 2025-02-28 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java index c5427a5..783eaf5 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java @@ -15,7 +15,7 @@ import java.util.Date; /** * 流程分类视图对象 wf_category * - * @author may + * @author pangu * @date 2023-06-27 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopyVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopyVo.java index 67ef9e2..f272eed 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopyVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCopyVo.java @@ -10,7 +10,7 @@ import java.io.Serializable; /** * 抄送对象 * - * @author AprilWind + * @author pangu */ @Data public class FlowCopyVo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java index aef7573..c43ad16 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java @@ -11,7 +11,7 @@ import java.util.Date; /** * 流程定义视图 * - * @author may + * @author pangu */ @Data public class FlowDefinitionVo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index a9f6a60..0a6ec58 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -15,7 +15,7 @@ import java.util.List; /** * 历史任务视图 * - * @author may + * @author pangu */ @Data public class FlowHisTaskVo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java index b03f73b..9fefa6b 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java @@ -10,7 +10,7 @@ import java.util.Date; /** * 流程实例视图 * - * @author may + * @author pangu */ @Data public class FlowInstanceVo { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowSpelVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowSpelVo.java index 76ead83..d24827a 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowSpelVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowSpelVo.java @@ -16,7 +16,7 @@ import java.util.Date; /** * 流程spel表达式定义视图对象 flow_spel * - * @author Michelle.Chung + * @author pangu * @date 2025-07-04 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index ffe8049..c3ba94f 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -16,7 +16,7 @@ import java.util.Map; /** * 任务视图 * - * @author may + * @author pangu */ @Data public class FlowTaskVo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java index 5fb3380..a8e1553 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java @@ -13,7 +13,7 @@ import java.util.Set; *

* 用于封装从扩展属性 JSON 中解析出的各类信息,包括按钮权限、抄送对象和自定义参数。 * - * @author AprilWind + * @author pangu */ @Data public class NodeExtVo implements Serializable { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java index 2f34158..a4d428f 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java @@ -15,7 +15,7 @@ import java.util.Date; /** * 请假视图对象 test_leave * - * @author may + * @author pangu * @date 2023-07-21 */ @Data diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java index 1965f67..93b37d9 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -16,7 +16,7 @@ import java.util.Map; /** * 流程监听服务 * - * @author may + * @author pangu * @date 2024-06-02 */ @ConditionalOnEnable diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java index e908a20..3727ea8 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -20,7 +20,7 @@ import java.util.List; /** * 办理人权限处理器 * - * @author AprilWind + * @author pangu */ @ConditionalOnEnable @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index efd24ff..4f5405e 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -39,7 +39,7 @@ import java.util.Set; /** * 全局任务办理监听 * - * @author may + * @author pangu */ @ConditionalOnEnable @Component diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java index 7199d5c..1ccfe3a 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java @@ -15,7 +15,7 @@ import java.util.stream.Stream; /** * 流程分类Mapper接口 * - * @author may + * @author pangu * @date 2023-06-27 */ public interface FlwCategoryMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceBizExtMapper.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceBizExtMapper.java index e11613c..3b0c529 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceBizExtMapper.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceBizExtMapper.java @@ -10,7 +10,7 @@ import java.util.List; /** * 流程实例业务扩展Mapper接口 * - * @author may + * @author pangu * @date 2025-08-05 */ public interface FlwInstanceBizExtMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java index 92809c8..40988ab 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java @@ -10,7 +10,7 @@ import org.dromara.workflow.domain.vo.FlowInstanceVo; /** * 实例信息Mapper接口 * - * @author may + * @author pangu * @date 2024-03-02 */ public interface FlwInstanceMapper { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwSpelMapper.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwSpelMapper.java index 12dff9f..b809408 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwSpelMapper.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwSpelMapper.java @@ -7,7 +7,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** * 流程spel表达式定义Mapper接口 * - * @author Michelle.Chung + * @author pangu * @date 2025-07-04 */ public interface FlwSpelMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java index 0d0422d..3264f11 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java @@ -13,7 +13,7 @@ import org.dromara.workflow.domain.vo.FlowTaskVo; /** * 任务信息Mapper接口 * - * @author may + * @author pangu * @date 2024-03-02 */ public interface FlwTaskMapper { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java index cd1edba..dce5274 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java @@ -7,7 +7,7 @@ import org.dromara.workflow.domain.vo.TestLeaveVo; /** * 请假Mapper接口 * - * @author may + * @author pangu * @date 2023-07-21 */ public interface TestLeaveMapper extends BaseMapperPlus { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/rule/SpelRuleComponent.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/rule/SpelRuleComponent.java index 7498db5..96fb5a4 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/rule/SpelRuleComponent.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/rule/SpelRuleComponent.java @@ -14,7 +14,7 @@ import org.springframework.stereotype.Component; * 通过该组件统一管理流程定义中的spel表达式 *

* - * @author Michelle.Chung + * @author pangu */ @ConditionalOnEnable @Slf4j diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java index f66882b..417d444 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java @@ -9,7 +9,7 @@ import java.util.List; /** * 流程分类Service接口 * - * @author may + * @author pangu */ public interface IFlwCategoryService { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java index f809f47..e8264cf 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java @@ -7,7 +7,7 @@ import java.util.List; /** * 通用 工作流服务 * - * @author LionLi + * @author pangu */ public interface IFlwCommonService { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index 54743b7..98b2f50 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -13,7 +13,7 @@ import java.util.List; /** * 流程定义 服务层 * - * @author may + * @author pangu */ public interface IFlwDefinitionService { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index 814b89d..435b0e4 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -15,7 +15,7 @@ import java.util.Map; /** * 流程实例 服务层 * - * @author may + * @author pangu */ public interface IFlwInstanceService { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java index a94a225..3c5178f 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java @@ -7,7 +7,7 @@ import java.util.Map; /** * 流程节点扩展属性 服务层 * - * @author AprilWind + * @author pangu */ public interface IFlwNodeExtService { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwSpelService.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwSpelService.java index 7c44534..04b7b86 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwSpelService.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwSpelService.java @@ -14,7 +14,7 @@ import java.util.Map; /** * 流程spel表达式定义Service接口 * - * @author Michelle.Chung + * @author pangu * @date 2025-07-04 */ public interface IFlwSpelService { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java index 830abaf..f938acc 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java @@ -7,7 +7,7 @@ import java.util.List; /** * 流程设计器-获取办理人 * - * @author AprilWind + * @author pangu */ public interface IFlwTaskAssigneeService { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index f9dc45e..1f122c6 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -18,7 +18,7 @@ import java.util.List; /** * 任务 服务层 * - * @author may + * @author pangu */ public interface IFlwTaskService { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java index 748a2b1..46db613 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java @@ -10,7 +10,7 @@ import java.util.List; /** * 请假Service接口 * - * @author may + * @author pangu * @date 2023-07-21 */ public interface ITestLeaveService { diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java index 883a967..27b97b7 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; /** * 流程分类名称翻译实现 * - * @author AprilWind + * @author pangu */ @ConditionalOnEnable @Slf4j diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index 3515ebb..063eacc 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -32,7 +32,7 @@ import java.util.List; /** * 流程分类Service业务层处理 * - * @author may + * @author pangu */ @ConditionalOnEnable @RequiredArgsConstructor diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index cb82cbe..1a530f2 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -37,7 +37,7 @@ import java.util.stream.Collectors; /** * 流程图提示信息 * - * @author AprilWind + * @author pangu */ @ConditionalOnEnable @Slf4j diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 8d4708b..01c5a47 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -29,7 +29,7 @@ import java.util.Set; /** * 工作流工具 * - * @author LionLi + * @author pangu */ @ConditionalOnEnable @Slf4j diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 1cc61fe..e6c408f 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -50,7 +50,7 @@ import static org.dromara.common.core.constant.TenantConstants.DEFAULT_TENANT_ID /** * 流程定义 服务层实现 * - * @author may + * @author pangu */ @ConditionalOnEnable @Slf4j diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 4de669d..663c0ae 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -56,7 +56,7 @@ import java.util.function.Function; /** * 流程实例 服务层实现 * - * @author may + * @author pangu */ @ConditionalOnEnable @Slf4j diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index ce845dc..ae33bbc 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -30,7 +30,7 @@ import java.util.stream.Collectors; /** * 流程设计器-节点扩展属性 * - * @author AprilWind + * @author pangu */ @ConditionalOnEnable @Slf4j diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java index 3790cdf..58b2897 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java @@ -30,7 +30,7 @@ import java.util.Map; /** * 流程spel表达式定义Service业务层处理 * - * @author Michelle.Chung + * @author pangu * @date 2025-07-04 */ @ConditionalOnEnable diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 9e9c091..8668998 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -35,7 +35,7 @@ import java.util.stream.Collectors; /** * 流程设计器-获取办理人权限设置列表 * - * @author AprilWind + * @author pangu */ @ConditionalOnEnable @Slf4j diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 0a8bdc7..9f268b3 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -70,7 +70,7 @@ import static org.dromara.workflow.common.constant.FlowConstant.*; /** * 任务 服务层实现 * - * @author may + * @author pangu */ @ConditionalOnEnable @Slf4j diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index ec0be3c..a13413c 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -40,7 +40,7 @@ import java.util.Map; /** * 请假Service业务层处理 * - * @author may + * @author pangu * @date 2023-07-21 */ @ConditionalOnEnable diff --git a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 8d6b8d2..a40fca0 100644 --- a/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/backend/pangu-modules/pangu-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -27,7 +27,7 @@ import java.util.Map; /** * 通用 工作流服务实现 * - * @author may + * @author pangu */ @ConditionalOnEnable @RequiredArgsConstructor diff --git a/docs/05-模块技术方案/会员管理/快速开始.md b/docs/05-模块技术方案/会员管理/快速开始.md index ad7f3cb..a609cf3 100644 --- a/docs/05-模块技术方案/会员管理/快速开始.md +++ b/docs/05-模块技术方案/会员管理/快速开始.md @@ -39,7 +39,7 @@ mysql -u root -p USE pangu; # 3. 执行建表SQL -SOURCE /Users/felix/hbxhWorkSpace/pangu-user-platform/sql/pangu_member.sql; +SOURCE /Users/felix/pgWorkSpace/pangu-user-platform/sql/pangu_member.sql; # 4. 验证表是否创建成功 SHOW TABLES LIKE 'pg_member'; @@ -60,7 +60,7 @@ SHOW TABLES LIKE 'pg_member'; ```bash # 1. 进入项目目录 -cd /Users/felix/hbxhWorkSpace/pangu-user-platform +cd /Users/felix/pgWorkSpace/pangu-user-platform # 2. 编译项目(如果还没编译) mvn clean package -DskipTests @@ -77,7 +77,7 @@ java -jar pangu-admin/target/pangu-admin.jar ```bash # 1. 进入前端目录 -cd /Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +cd /Users/felix/pgWorkSpace/pangu-user-platform/frontend # 2. 安装依赖(如果还没安装) npm install @@ -333,7 +333,7 @@ curl http://localhost:8080/api/member/list ```bash # 1. 进入项目目录 -cd /Users/felix/hbxhWorkSpace/pangu-user-platform +cd /Users/felix/pgWorkSpace/pangu-user-platform # 2. 运行测试 mvn test -Dtest=MemberServiceTest diff --git a/docs/05-模块技术方案/学校管理/快速开始.md b/docs/05-模块技术方案/学校管理/快速开始.md index e90ab6a..74e4127 100644 --- a/docs/05-模块技术方案/学校管理/快速开始.md +++ b/docs/05-模块技术方案/学校管理/快速开始.md @@ -42,7 +42,7 @@ CREATE DATABASE IF NOT EXISTS pangu DEFAULT CHARACTER SET utf8mb4; USE pangu; # 4. 执行建表SQL -SOURCE /Users/felix/hbxhWorkSpace/pangu-user-platform/sql/pangu_school.sql; +SOURCE /Users/felix/pgWorkSpace/pangu-user-platform/sql/pangu_school.sql; # 5. 验证表是否创建成功 SHOW TABLES LIKE 'pg_school%'; @@ -65,7 +65,7 @@ SHOW TABLES LIKE 'pg_school%'; ```bash # 1. 进入项目目录 -cd /Users/felix/hbxhWorkSpace/pangu-user-platform +cd /Users/felix/pgWorkSpace/pangu-user-platform # 2. 编译项目(如果还没编译) mvn clean package -DskipTests @@ -94,7 +94,7 @@ Application started successfully on port 8080 ```bash # 1. 进入前端目录 -cd /Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +cd /Users/felix/pgWorkSpace/pangu-user-platform/frontend # 2. 安装依赖(如果还没安装) npm install @@ -339,7 +339,7 @@ curl http://localhost:8080/api/school/tree ```bash # 1. 进入项目目录 -cd /Users/felix/hbxhWorkSpace/pangu-user-platform +cd /Users/felix/pgWorkSpace/pangu-user-platform # 2. 运行测试 mvn test -Dtest=SchoolServiceTest diff --git a/docs/05-模块技术方案/开放API-学生列表授权-技术设计方案.md b/docs/05-模块技术方案/开放API-学生列表授权-技术设计方案.md new file mode 100644 index 0000000..b521866 --- /dev/null +++ b/docs/05-模块技术方案/开放API-学生列表授权-技术设计方案.md @@ -0,0 +1,152 @@ +# 开放API-学生列表授权 技术设计方案 + +> 作者:pangu +> 创建时间:2026-02-04 +> 评审状态:待评审 + +--- + +## 一、总体架构 + +### 1.1 请求链路 + +``` +外部请求 GET /open/api/student/list?pageNum=1&pageSize=10 + → 不经过 Sa-Token 登录校验(security.excludes 排除 /open/api/**) + → ApiAuthInterceptor 拦截 /open/api/** + → 校验 X-App-Id、X-Timestamp、X-Sign + → 查应用信息、校验接口授权 + → OpenApiStudentController.list() → IPgStudentService.selectPageList() + → 返回 TableDataInfo +``` + +### 1.2 模块与职责 + +| 模块/组件 | 职责 | +|-----------|------| +| Security 配置 | 将 `/open/api/**` 加入排除路径,不校验登录 | +| ApiAuthInterceptor | 仅对 `/open/api/**` 生效:校验头、签名、接口授权 | +| OpenApiStudentController | 提供 GET `/open/api/student/list`,委托现有 StudentService | +| IPgApplicationService | 新增 selectByAppCode、checkApiPermission;新增/编辑时同步 pg_app_api | +| PgAppApiMapper | 新增按 appCode 查授权 api_path 列表方法(联表 pg_api_dict) | +| pg_api_dict | 增加「学生列表」开放接口记录,api_path=/open/api/student/list | + +--- + +## 二、安全与鉴权 + +### 2.1 请求头约定 + +| 请求头 | 必填 | 说明 | +|--------|------|------| +| X-App-Id | 是 | 应用编码(appCode) | +| X-Timestamp | 是 | 当前时间毫秒时间戳,防重放 | +| X-Sign | 是 | 签名,见 2.2 | + +### 2.2 签名算法 + +1. 将请求参数(Query 与 Body,仅一层 key-value)按参数名 ASCII 升序排序。 +2. 拼接为:`key1=value1&key2=value2&...&appSecret=应用密钥`(appSecret 为服务端存储的密钥)。 +3. 对上述字符串做 **MD5**,结果转为 **大写**,即 X-Sign。 + +示例(GET,无 body): + +- 请求:GET /open/api/student/list?pageNum=1&pageSize=10 +- 假设 appSecret=abc123 +- 参数字符串:`pageNum=1&pageSize=10&appSecret=abc123` +- sign = MD5(参数字符串).toUpperCase() + +### 2.3 时间戳防重放 + +- 服务端收到 X-Timestamp 后,与当前服务器时间比较,若 |now - timestamp| > 5 分钟,返回 400「请求已过期」。 + +### 2.4 接口授权校验 + +- 请求 URI 取 path(如 `/open/api/student/list`),与当前应用在 pg_app_api + pg_api_dict 中关联的 api_path 集合比对;不在集合内则返回 403「无权访问该接口」。 + +--- + +## 三、接口设计 + +### 3.1 开放接口:学生列表 + +| 项目 | 说明 | +|------|------| +| 方法 | GET | +| 路径 | /open/api/student/list | +| 鉴权 | 应用签名 + 接口授权 | +| 参数 | 与现有 /business/student/list 一致:studentName、studentNo、schoolId、schoolGradeId、schoolClassId、status 等;分页 pageNum、pageSize | +| 响应 | 与现有一致:`{ code, msg, rows, total }`(TableDataInfo) | + +### 3.2 错误响应 + +| HTTP 状态 | 场景 | 示例 msg | +|-----------|------|----------| +| 400 | 缺少认证参数 / 时间戳格式错误 / 请求已过期 | 缺少认证参数 | +| 401 | 应用不存在 / 应用已停用 / 签名验证失败 | 签名验证失败 | +| 403 | 未授权该接口 | 无权访问该接口 | + +--- + +## 四、数据与缓存 + +### 4.1 表使用 + +- **pg_application**:已有;需按 app_code 查询(selectByAppCode)。 +- **pg_api_dict**:已有;需新增一条 api_path=`/open/api/student/list` 的记录,供授权勾选与校验。 +- **pg_app_api**:已有;新增/编辑应用时按 apiCodes 写入/更新;鉴权时按 app_id 联表 pg_api_dict 得到 api_path 列表。 + +### 4.2 授权生效 + +- 方案 A:每次请求查库(或查缓存)。 +- 方案 B:应用授权变更时更新缓存,校验时先查缓存。 +本期可采用**不缓存**或**短 TTL(如 5 分钟)缓存**「应用授权 path 集合」,技术实现时在 Service 中按 appCode 查授权 path 列表即可;若后续性能有要求再加 Redis。 + +--- + +## 五、实现清单 + +### 5.1 配置 + +- **application.yml**:security.excludes 增加 `/open/api/**`。 + +### 5.2 应用模块(application) + +- **IPgApplicationService**:新增 `PgApplication selectByAppCode(String appCode)`、`boolean checkApiPermission(String appCode, String apiPath)`。 +- **PgApplicationServiceImpl**:实现上述方法;insert/update 时增加对 apiCodes 的处理,同步 pg_app_api(先删后插)。 +- **PgApplication**:增加 `@TableField(exist = false) private List apiCodes;`,用于接收前端与返回详情。 +- **PgAppApiMapper**:新增方法,如 `List selectApiPathsByAppCode(String appCode)`(联表 pg_api_dict 取 api_path)。 +- **PgAppApiMapper.xml**:对应 SQL(a.app_id = app_id 且 a.api_id = d.api_id,d.api_path)。 + +### 5.3 开放 API 模块(新建或放在 business 下) + +- **OpenApiConfig**:WebMvcConfigurer,注册 ApiAuthInterceptor,仅 addPathPatterns("/open/api/**")。 +- **ApiAuthInterceptor**:preHandle 中取 X-App-Id、X-Timestamp、X-Sign;校验时间戳 → selectByAppCode → 校验签名 → checkApiPermission(uri) → 通过则 return true。 +- **OpenApiStudentController**:GET `/open/api/student/list`,参数与 PgStudentController.list 一致,委托 IPgStudentService.selectPageList。 + +### 5.4 接口字典数据 + +- 在 pg_api_dict 中 INSERT 一条:api_code=OPEN_STUDENT_LIST,api_name=学生列表,api_path=/open/api/student/list,api_method=GET,status=0。可使用 SQL 脚本或启动时初始化。 + +### 5.5 前端 + +- 已有接口授权勾选(apiCodes)与 apiList 接口;只需保证后端保存/回显 apiCodes 与 pg_app_api 一致即可,无需改前端逻辑(若当前未回显 apiCodes,需后端在查询应用详情时填充 apiCodes)。 + +--- + +## 六、调用测试说明 + +- 提供「开放API-学生列表授权-调用测试说明.md」或同目录下测试脚本: + - 签名算法说明与示例(含 GET 示例)。 + - 示例:在管理端创建应用并勾选「学生列表」,记录 appCode、appSecret,用 curl 或 Postman 调用 GET /open/api/student/list,携带正确 X-App-Id、X-Timestamp、X-Sign。 + - 预期:授权应用返回 200 与列表数据;未授权或错误签名返回 401/403。 + +--- + +## 七、评审要点 + +1. 开放路径仅限 `/open/api/**`,与现有 /business、/h5 隔离,且不校验用户登录。 +2. 签名算法与请求头约定是否满足安全与对接方实现成本平衡。 +3. 学生列表参数与响应与现有一致,避免业务逻辑重复。 +4. 应用管理侧保存/回显接口授权与 pg_app_api、pg_api_dict 数据一致性。 +5. 后续扩展其他开放接口时,仅需在 pg_api_dict 加记录、新增对应 OpenApiXxxController 即可,鉴权与拦截器复用。 diff --git a/docs/05-模块技术方案/开放API-学生列表授权-调用测试说明.md b/docs/05-模块技术方案/开放API-学生列表授权-调用测试说明.md new file mode 100644 index 0000000..3103805 --- /dev/null +++ b/docs/05-模块技术方案/开放API-学生列表授权-调用测试说明.md @@ -0,0 +1,114 @@ +# 开放API-学生列表 调用测试说明 + +> 作者:pangu +> 创建时间:2026-02-04 + +--- + +## 一、前置条件 + +1. **执行接口字典数据**(若尚未执行): + ```bash + # 在数据库中执行 + mysql -u用户 -p 库名 < backend/pangu-modules/pangu-business/sql/open_api_dict_data.sql + ``` + 或在客户端执行 `open_api_dict_data.sql` 中的 INSERT 语句。 + +2. **应用管理中**: + - 新增或编辑一个应用,在「接口授权」中勾选 **学生列表**,保存。 + - 记录该应用的 **应用编码(appCode)** 和 **应用密钥(appSecret)**(重置密钥后可查看)。 + +--- + +## 二、签名算法 + +1. 将请求参数(仅 Query 参数,按参数名 **ASCII 升序**)拼接: + `key1=value1&key2=value2&...` +2. 末尾追加:`&appSecret=你的应用密钥` +3. 对整串做 **MD5**,结果转为 **大写**,即 `X-Sign`。 + +**示例(GET)**: +- 请求:`/open/api/student/list?pageNum=1&pageSize=10` +- 参数排序后:`pageNum=1&pageSize=10` +- 假设 appSecret=`abc123`,则参数字符串:`pageNum=1&pageSize=10&appSecret=abc123` +- sign = MD5(`pageNum=1&pageSize=10&appSecret=abc123`).toUpperCase() + +--- + +## 三、请求头 + +| 请求头 | 说明 | +|-------------|-------------------------| +| X-App-Id | 应用编码(appCode) | +| X-Timestamp | 当前时间毫秒时间戳 | +| X-Sign | 按上述算法计算的签名 | + +--- + +## 四、curl 示例 + +假设: +- 应用编码:`YY000001` +- 应用密钥:`a1b2c3d4e5f6789012345678901234ab` +- 基础地址:`http://localhost:8080` + +**1. 先计算签名(示例用当前时间戳)** + +参数:`pageNum=1&pageSize=10&appSecret=a1b2c3d4e5f6789012345678901234ab` +可用在线 MD5 或命令行(见下方脚本)得到大写 MD5 作为 X-Sign。 + +**2. 调用** + +```bash +# 将 TIMESTAMP 和 SIGN 替换为实际值 +TIMESTAMP=$(date +%s)000 +# SIGN 需根据 当前参数+appSecret 用 MD5 计算,此处为占位 +SIGN="这里填计算出的32位大写MD5" + +curl -s -X GET "http://localhost:8080/open/api/student/list?pageNum=1&pageSize=10" \ + -H "X-App-Id: YY000001" \ + -H "X-Timestamp: $TIMESTAMP" \ + -H "X-Sign: $SIGN" +``` + +--- + +## 五、测试脚本(含签名计算) + +在项目根目录执行: + +```bash +./scripts/openapi-student-list-test.sh [baseUrl] +``` + +示例: + +```bash +./scripts/openapi-student-list-test.sh YY000001 a1b2c3d4e5f6789012345678901234ab +# 指定环境 +./scripts/openapi-student-list-test.sh YY000001 your_secret http://192.168.1.100:8080 +``` + +--- + +## 六、预期结果 + +| 场景 | HTTP 状态 | 说明 | +|----------------|-----------|------------------------------| +| 签名正确且已授权 | 200 | 返回 rows、total 等分页数据 | +| 未勾选学生列表 | 403 | 无权访问该接口 | +| 签名错误 | 500 | 签名验证失败(业务异常) | +| 时间戳过期 | 500 | 请求已过期 | +| 缺少请求头 | 500 | 缺少认证参数 | + +--- + +## 七、可选:学生列表查询参数 + +与后台 `/business/student/list` 一致,例如: + +- `pageNum`、`pageSize`:分页 +- `studentName`:学生姓名(模糊) +- `studentNo`:学号(模糊) +- `schoolId`:学校 ID +等,按需传递;**参与签名的参数需包含所有本次请求的 Query 参数**(按参数名排序后拼接再加 appSecret 做 MD5)。 diff --git a/docs/05-模块技术方案/开放API-学生列表授权-需求设计方案.md b/docs/05-模块技术方案/开放API-学生列表授权-需求设计方案.md new file mode 100644 index 0000000..3e16224 --- /dev/null +++ b/docs/05-模块技术方案/开放API-学生列表授权-需求设计方案.md @@ -0,0 +1,113 @@ +# 开放API-学生列表授权 需求设计方案 + +> 作者:pangu +> 创建时间:2026-02-04 +> 评审状态:待评审 + +--- + +## 一、背景与目标 + +### 1.1 背景 + +盘古用户认证中心已具备「应用管理」能力:可创建第三方应用、分配应用编码(appCode)与密钥(appSecret),并在管理后台为应用勾选「接口授权」。当前缺少**对外暴露的开放 API** 及**基于应用身份的签名鉴权与接口授权校验**,外部系统无法在未登录用户的前提下,以应用身份安全调用已授权接口。 + +### 1.2 目标 + +- **需求侧**:支持外部系统以「应用身份」调用指定已授权接口(首期以**学生列表查询**为真实场景),不依赖用户登录 Token。 +- **安全侧**:请求必须携带应用编码、时间戳、签名,服务端校验签名并校验该应用是否已授权访问该接口,未授权或签名错误一律拒绝。 +- **可评审**:提供完整需求说明与技术方案,便于评审与后续扩展更多开放接口。 + +--- + +## 二、范围与边界 + +### 2.1 本期范围 + +| 序号 | 内容 | 说明 | +|------|------|------| +| 1 | 开放 API 机制 | 统一路径前缀 `/open/api/**`,请求头鉴权(X-App-Id、X-Timestamp、X-Sign) | +| 2 | 学生列表查询 | 提供 GET `/open/api/student/list`,与现有业务逻辑一致,仅鉴权方式不同 | +| 3 | 应用管理侧 | 新增/编辑应用时保存「接口授权」到 pg_app_api;查询应用详情时回显已选接口 | +| 4 | 接口字典 | pg_api_dict 中至少包含「学生列表」开放接口配置,供授权勾选与校验使用 | + +### 2.2 边界(本期不做) + +- 仅实现「学生列表」一个开放接口作为示例;其他业务接口(如学校、会员等)后续按同机制扩展。 +- 不涉及 OAuth2/第三方登录;仅做「应用级」签名鉴权与接口授权。 + +--- + +## 三、用户角色与使用场景 + +### 3.1 角色 + +| 角色 | 说明 | +|------|------| +| 运营/管理员 | 在应用管理中创建应用、为应用勾选「学生列表」等接口授权 | +| 外部系统 | 使用 appCode + appSecret 对请求签名,调用 GET `/open/api/student/list` 获取学生列表(分页、筛选与现有一致) | + +### 3.2 典型场景 + +1. **配置授权** + 管理员在「应用管理」中新增应用「XX 学情系统」,保存后获得 appCode(如 YY000001)、appSecret(32 位)。在编辑该应用时勾选「学生列表」接口授权并保存。 + +2. **外部调用** + XX 学情系统在服务端使用 appCode、appSecret 生成签名,请求 GET `/open/api/student/list?pageNum=1&pageSize=10`,并携带请求头 X-App-Id、X-Timestamp、X-Sign。平台校验通过且该应用已授权「学生列表」后返回分页数据。 + +3. **未授权/签名错误** + 若未勾选「学生列表」或签名错误,返回 401/403 及明确错误信息,不返回业务数据。 + +--- + +## 四、功能需求 + +### 4.1 开放 API 鉴权与授权 + +- **FR-1** 请求必须携带请求头:`X-App-Id`(应用编码)、`X-Timestamp`(毫秒时间戳)、`X-Sign`(签名)。 +- **FR-2** 时间戳与服务器时间差超过 5 分钟视为过期,拒绝请求。 +- **FR-3** 根据 X-App-Id 查询应用信息;应用不存在或已停用则拒绝。 +- **FR-4** 签名算法:请求参数(query+body 按参数名 ASCII 排序)拼接为 `key1=value1&key2=value2&...&appSecret=应用密钥`,再对该字符串做 MD5,结果转大写,与 X-Sign 比对;不一致则拒绝。 +- **FR-5** 请求 URI 对应的「开放接口」必须在当前应用的授权列表中(以 pg_api_dict.api_path 与 pg_app_api 关联为准),否则拒绝访问。 + +### 4.2 学生列表开放接口 + +- **FR-6** 提供 GET `/open/api/student/list`,支持与现有学生列表一致的查询参数(如 studentName、studentNo、schoolId 等)及分页参数(pageNum、pageSize)。 +- **FR-7** 响应格式与现有管理端学生列表一致(TableDataInfo:rows、total 等),便于对接方使用。 + +### 4.3 应用管理侧 + +- **FR-8** 新增/编辑应用时,请求体可携带接口授权标识(如 apiCodes:接口编码列表);保存时同步更新 pg_app_api(先删该应用原有授权,再按 apiCodes 插入)。 +- **FR-9** 查询应用详情(含列表展示)时,返回该应用已授权的接口信息(如 apiCodes 或等效),供前端勾选回显。 + +### 4.4 接口字典 + +- **FR-10** pg_api_dict 中至少有一条「学生列表」开放接口记录:api_path 为 `/open/api/student/list`,api_method 为 GET,供应用管理勾选与鉴权校验使用。 + +--- + +## 五、非功能需求 + +- **NFR-1** 鉴权失败时返回 HTTP 状态码与 JSON 错误信息(如 401 签名错误、403 无权限、400 参数缺失/过期)。 +- **NFR-2** 授权关系变更后,建议在较短时间内生效(可为实时或短 TTL 缓存,技术方案中约定)。 +- **NFR-3** 文档与示例:提供开放 API 调用说明及学生列表调用示例(含签名算法与示例请求),便于对接方自测与联调。 + +--- + +## 六、验收标准 + +1. 在应用管理中为某应用勾选「学生列表」并保存后,该应用使用正确签名调用 GET `/open/api/student/list` 可返回学生列表数据。 +2. 未勾选「学生列表」的应用调用同一接口,返回 403 无权限。 +3. 错误签名或过期时间戳,返回 401 或 400,且不返回业务数据。 +4. 应用管理新增/编辑时接口授权勾选可保存并回显;列表/详情中可看到已授权接口信息。 + +--- + +## 七、附录:术语 + +| 术语 | 说明 | +|------|------| +| appCode | 应用编码,如 YY000001,唯一标识一个应用 | +| appSecret | 应用密钥,32 位,用于参与签名计算,需保密 | +| 接口授权 | 应用与 pg_api_dict 中某条 API 的关联关系,存储在 pg_app_api | +| 开放 API | 以 `/open/api/**` 为前缀、使用应用签名鉴权的接口,无需用户登录 | diff --git a/docs/06-测试文档/UI自动化测试报告_v1.0.md b/docs/06-测试文档/UI自动化测试报告_v1.0.md index 05003ce..49d48ff 100644 --- a/docs/06-测试文档/UI自动化测试报告_v1.0.md +++ b/docs/06-测试文档/UI自动化测试报告_v1.0.md @@ -386,7 +386,7 @@ public class SysLoginController { **编译打包**: ```bash -cd /Users/felix/hbxhWorkSpace/pangu-user-platform +cd /Users/felix/pgWorkSpace/pangu-user-platform mvn clean install -DskipTests ``` diff --git a/docs/06-测试文档/最终交付测试报告_v2.0.md b/docs/06-测试文档/最终交付测试报告_v2.0.md index d12241f..aa801ee 100644 --- a/docs/06-测试文档/最终交付测试报告_v2.0.md +++ b/docs/06-测试文档/最终交付测试报告_v2.0.md @@ -554,11 +554,11 @@ export function getClassListByGrade(schoolGradeId) { **启动命令**: ```bash # 后端 -cd /Users/felix/hbxhWorkSpace/pangu-user-platform +cd /Users/felix/pgWorkSpace/pangu-user-platform java -jar pangu-admin/target/pangu-admin.jar # 前端 -cd /Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +cd /Users/felix/pgWorkSpace/pangu-user-platform/frontend npm run dev ``` diff --git a/docs/06-测试文档/测试数据说明_v1.0.md b/docs/06-测试文档/测试数据说明_v1.0.md index e6f148d..c33d618 100644 --- a/docs/06-测试文档/测试数据说明_v1.0.md +++ b/docs/06-测试文档/测试数据说明_v1.0.md @@ -552,7 +552,7 @@ **SQL脚本位置**: ``` -/Users/felix/hbxhWorkSpace/pangu-user-platform/sql/test_data_101.sql +/Users/felix/pgWorkSpace/pangu-user-platform/sql/test_data_101.sql ``` **导入命令**: diff --git a/docs/多Agent协同开发指南.md b/docs/多Agent协同开发指南.md index fe806d3..0101fd0 100644 --- a/docs/多Agent协同开发指南.md +++ b/docs/多Agent协同开发指南.md @@ -60,7 +60,7 @@ import './member' **技术栈**:Vue 3 + Vite + Element Plus + Pinia + Vue Router + MockJS -**项目路径**:`/Users/felix/hbxhWorkSpace/pangu-user-platform/frontend` +**项目路径**:`/Users/felix/pgWorkSpace/pangu-user-platform/frontend` **原型地址**:https://modao.cc/proto/atlwMul8t9pi6yxQ42W7up/sharing @@ -385,7 +385,7 @@ Mock.mock('/api/xxx', 'post', { code: 200, msg: '新增成功' }) 你是一个Vue 3前端开发专家。请为"盘古用户平台"创建核心基础设施。 ## 项目信息 -- 项目路径:/Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +- 项目路径:/Users/felix/pgWorkSpace/pangu-user-platform/frontend - 技术栈:Vue 3 + Vite + Element Plus + Pinia + Vue Router + MockJS - 作者:pangu @@ -464,7 +464,7 @@ import './user' 你是一个Vue 3前端开发专家。请为"盘古用户平台"创建登录页面。 ## 项目信息 -- 项目路径:/Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +- 项目路径:/Users/felix/pgWorkSpace/pangu-user-platform/frontend - 技术栈:Vue 3 + Element Plus - 作者:pangu @@ -527,7 +527,7 @@ Agent-1已经启动了开发服务器(端口3000),你只需创建文件。 你是一个Vue 3前端开发专家。请为"盘古用户平台"创建学校管理模块。 ## 项目信息 -- 项目路径:/Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +- 项目路径:/Users/felix/pgWorkSpace/pangu-user-platform/frontend - 技术栈:Vue 3 + Element Plus - 作者:pangu - 原型参考:https://modao.cc/proto/atlwMul8t9pi6yxQ42W7up/sharing @@ -624,7 +624,7 @@ const regionTree = [ 你是一个Vue 3前端开发专家。请为"盘古用户平台"创建会员管理模块。 ## 项目信息 -- 项目路径:/Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +- 项目路径:/Users/felix/pgWorkSpace/pangu-user-platform/frontend - 技术栈:Vue 3 + Element Plus - 作者:pangu @@ -705,7 +705,7 @@ Agent-1已经启动了开发服务器(端口3000),你只需创建文件。 你是一个Vue 3前端开发专家。请为"盘古用户平台"创建学生管理模块。 ## 项目信息 -- 项目路径:/Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +- 项目路径:/Users/felix/pgWorkSpace/pangu-user-platform/frontend - 技术栈:Vue 3 + Element Plus - 作者:pangu @@ -774,7 +774,7 @@ Agent-1已经启动了开发服务器(端口3000),你只需创建文件。 你是一个Vue 3前端开发专家。请为"盘古用户平台"创建应用管理模块。 ## 项目信息 -- 项目路径:/Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +- 项目路径:/Users/felix/pgWorkSpace/pangu-user-platform/frontend - 技术栈:Vue 3 + Element Plus - 作者:pangu @@ -845,7 +845,7 @@ Agent-1已经启动了开发服务器(端口3000),你只需创建文件。 你是一个Vue 3前端开发专家。请为"盘古用户平台"创建基础数据管理模块(年级/班级/学科/区域)。 ## 项目信息 -- 项目路径:/Users/felix/hbxhWorkSpace/pangu-user-platform/frontend +- 项目路径:/Users/felix/pgWorkSpace/pangu-user-platform/frontend - 技术栈:Vue 3 + Element Plus - 作者:pangu diff --git a/docs/应用管理-需求与技术设计方案.md b/docs/应用管理-需求与技术设计方案.md new file mode 100644 index 0000000..244fd59 --- /dev/null +++ b/docs/应用管理-需求与技术设计方案.md @@ -0,0 +1,1226 @@ +# 应用管理模块 - 需求与技术设计方案 + +## 文档信息 + +| 项目 | 内容 | +|------|------| +| 项目名称 | 盘古用户认证中心 - 应用管理模块 | +| 文档版本 | V1.0 | +| 编写日期 | 2026-02-04 | +| 作者 | pangu | +| 状态 | 已完成 | + +--- + +# 第一部分:需求设计方案 + +## 1. 业务背景 + +### 1.1 项目背景 + +盘古用户认证中心作为统一身份认证平台,需要对外提供开放API接口,供第三方应用系统(如AI智慧教育平台、数字图书馆系统、校园OA办公系统、家校通小程序等)调用,以获取学生、教师、学校等基础数据信息。 + +为保障数据安全和接口调用的可控性,需要建立一套完整的**应用管理机制**,实现: +- 第三方应用的注册与管理 +- 应用凭证(AppCode + AppSecret)的生成与维护 +- 开放接口的精细化授权控制 +- 接口调用的安全鉴权 + +### 1.2 业务目标 + +1. **安全可控**:通过应用编码和密钥机制,确保只有授权应用才能调用开放接口 +2. **权限精细**:支持按应用维度配置可调用的接口列表,实现最小权限原则 +3. **易于扩展**:提供标准化的开放接口规范和示例代码,便于甲方二次开发 +4. **运维便捷**:支持应用状态管理、密钥重置、调用日志等运维功能 + +### 1.3 适用范围 + +本方案适用于以下场景: +- 第三方业务系统需要获取学生、教师、学校等基础数据 +- 移动端小程序需要调用认证中心接口 +- 内部子系统之间的数据同步 +- 数据中台、大数据平台的数据采集 + +--- + +## 2. 需求分析 + +### 2.1 用户角色 + +| 角色 | 描述 | 主要操作 | +|------|------|----------| +| 系统管理员 | 认证中心的管理员 | 管理第三方应用、配置接口授权、查看调用日志 | +| 第三方开发者 | 对接方的技术人员 | 获取应用凭证、按规范调用API、查看接口文档 | + +### 2.2 功能需求 + +#### 2.2.1 应用管理(管理端) + +| 功能点 | 描述 | 优先级 | +|--------|------|--------| +| 应用列表 | 展示所有已注册的第三方应用,支持搜索、分页 | P0 | +| 新增应用 | 录入应用基本信息,系统自动生成AppCode和AppSecret | P0 | +| 编辑应用 | 修改应用名称、联系人、状态等信息 | P0 | +| 删除应用 | 删除应用(逻辑删除),删除后凭证失效 | P0 | +| 重置密钥 | 重新生成AppSecret,原密钥立即失效 | P0 | +| 接口授权 | 为应用配置可调用的接口列表 | P0 | +| 查看凭证 | 查看应用的AppCode和AppSecret | P1 | +| 调用统计 | 查看应用的接口调用次数、成功率等 | P2 | + +#### 2.2.2 开放接口(对接端) + +| 功能点 | 描述 | 优先级 | +|--------|------|--------| +| 接口鉴权 | 验证请求的AppCode、时间戳、签名 | P0 | +| 权限校验 | 检查应用是否有权调用该接口 | P0 | +| 学生列表 | 分页查询学生信息(示例接口) | P0 | +| 接口文档 | 提供接口说明、参数定义、示例代码 | P1 | + +#### 2.2.3 接口字典管理 + +| 功能点 | 描述 | 优先级 | +|--------|------|--------| +| 接口字典 | 维护可授权的开放接口列表 | P0 | +| 新增接口 | 添加新的开放接口定义(二次开发) | P1 | + +### 2.3 非功能需求 + +| 类型 | 需求描述 | +|------|----------| +| 安全性 | 签名有效期5分钟,防重放攻击;密钥使用MD5加密传输 | +| 性能 | 接口鉴权响应时间 < 50ms,不影响业务接口性能 | +| 可用性 | 支持应用状态控制,停用后立即生效 | +| 可扩展性 | 支持甲方二次开发,新增开放接口无需修改鉴权逻辑 | +| 兼容性 | 支持多种调用方式:HTTP GET/POST,支持常见编程语言 | + +--- + +## 3. 业务流程 + +### 3.1 应用注册与授权流程 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 应用注册与授权流程 │ +└─────────────────────────────────────────────────────────────────────────────┘ + + ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ + │ 收集需求 │───>│ 创建应用 │───>│ 生成凭证 │───>│ 配置授权 │───>│ 交付凭证 │ + └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ │ │ │ │ + v v v v v + 收集第三方 填写应用名称 自动生成 勾选该应用 将AppCode + 系统信息 联系人等 AppCode 可调用的 AppSecret + 确认对接需求 基本信息 AppSecret 接口列表 发送给对接方 +``` + +### 3.2 第三方调用接口流程 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 第三方调用接口流程 │ +└─────────────────────────────────────────────────────────────────────────────┘ + + ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ + │ 构造请求 │───>│ 计算签名 │───>│ 发送请求 │───>│ 服务端校验│───>│ 返回数据 │ + └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ │ │ │ │ + v v v v v + 准备请求参数 MD5(params 添加请求头 1.验证签名 校验通过 + pageNum=1 +appSecret) X-App-Id 2.验证时间戳 返回业务数据 + pageSize=10 得到签名值 X-Timestamp 3.验证应用状态 校验失败 + X-Sign 4.验证接口权限 返回错误信息 +``` + +### 3.3 签名算法流程 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 签名计算流程 │ +└─────────────────────────────────────────────────────────────────────────────┘ + + 1. 收集所有请求参数(不含签名本身) + ┌─────────────────────────────────────┐ + │ pageNum=1, pageSize=10, status=0 │ + └─────────────────────────────────────┘ + │ + v + 2. 按参数名 ASCII 码升序排序 + ┌─────────────────────────────────────┐ + │ pageNum=1 & pageSize=10 & status=0 │ + └─────────────────────────────────────┘ + │ + v + 3. 拼接键值对,末尾追加 appSecret + ┌─────────────────────────────────────────────────────────┐ + │ pageNum=1&pageSize=10&status=0&appSecret=xxxxxxxxxx │ + └─────────────────────────────────────────────────────────┘ + │ + v + 4. 对整个字符串进行 MD5 加密,转大写 + ┌─────────────────────────────────────┐ + │ A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6 │ <-- X-Sign + └─────────────────────────────────────┘ +``` + +--- + +## 4. 界面原型说明 + +### 4.1 应用列表页面 + +**页面路径**:`http://localhost/application` + +**页面布局**: +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 搜索区域 │ +│ ┌──────────────┐ ┌──────────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ +│ │ 应用名称 │ │ 应用编码 │ │ 状态 ▼ │ │ 🔍搜索 │ │ ↻重置 │ │ +│ └──────────────┘ └──────────────┘ └────────┘ └────────┘ └────────┘ │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ ┌─────────┐ │ +│ │ + 新增 │ │ +│ └─────────┘ │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ │ 应用名称 │ 应用编码 │ 联系人 │ 联系电话 │ 状态 │ 创建时间 │ 操作 │ +│ ├────────────────┼──────────┼────────┼─────────────┼──────┼────────────┼──────────┤ +│ │ AI智慧教育平台 │ YY000001 │ 张经理 │ 138****3001 │ 正常 │ 2026-02-02 │ 编辑 设置 │ +│ │ 数字图书馆系统 │ YY000002 │ 李经理 │ 138****3002 │ 正常 │ 2026-02-02 │ 编辑 设置 │ +│ │ ... │ ... │ ... │ ... │ ... │ ... │ ... │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ 共 6 条 10条/页 < 1 > │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +**操作按钮说明**: +| 按钮 | 功能 | 说明 | +|------|------|------| +| 新增 | 打开新增应用弹窗 | 录入应用基本信息 | +| 编辑 | 打开编辑应用弹窗 | 修改应用信息 | +| 设置 | 打开接口授权弹窗 | 配置应用可调用的接口 | +| 重置密钥 | 重新生成密钥 | 需二次确认 | +| 删除 | 删除应用 | 需二次确认 | + +### 4.2 新增/编辑应用弹窗 + +``` +┌─────────────────────────────────────────────────┐ +│ 新增应用 [×] │ +├─────────────────────────────────────────────────┤ +│ │ +│ 应用名称 * ┌────────────────────────────┐ │ +│ │ 请输入应用名称 │ │ +│ └────────────────────────────┘ │ +│ │ +│ 应用编码 ┌────────────────────────────┐ │ +│ │ 保存后自动生成(不可编辑) │ │ +│ └────────────────────────────┘ │ +│ │ +│ 应用描述 ┌────────────────────────────┐ │ +│ │ │ │ +│ │ 请输入应用描述 │ │ +│ └────────────────────────────┘ │ +│ │ +│ 联系人 ┌────────────────────────────┐ │ +│ │ 请输入联系人 │ │ +│ └────────────────────────────┘ │ +│ │ +│ 联系电话 ┌────────────────────────────┐ │ +│ │ 请输入联系电话 │ │ +│ └────────────────────────────┘ │ +│ │ +│ 状态 ○ 正常 ○ 停用 │ +│ │ +├─────────────────────────────────────────────────┤ +│ [取消] [确定] │ +└─────────────────────────────────────────────────┘ +``` + +### 4.3 接口授权设置弹窗 + +``` +┌─────────────────────────────────────────────────┐ +│ 接口授权设置 - AI智慧教育平台 [×] │ +├─────────────────────────────────────────────────┤ +│ │ +│ 应用编码:YY000001 │ +│ 应用密钥:a1b2c3d4...(点击复制) │ +│ │ +│ ───────────────────────────────────────── │ +│ │ +│ 可授权接口: │ +│ │ +│ ☑ 学生列表查询 /open/api/student/list │ +│ ☐ 教师列表查询 /open/api/teacher/list │ +│ ☐ 学校信息查询 /open/api/school/info │ +│ ☐ 班级列表查询 /open/api/class/list │ +│ ... │ +│ │ +├─────────────────────────────────────────────────┤ +│ [取消] [保存] │ +└─────────────────────────────────────────────────┘ +``` + +--- + +## 5. 数据字典 + +### 5.1 应用状态 + +| 状态值 | 状态名称 | 说明 | +|--------|----------|------| +| 0 | 正常 | 应用可正常调用接口 | +| 1 | 停用 | 应用已停用,所有接口调用将被拒绝 | + +### 5.2 API 状态 + +| 状态值 | 状态名称 | 说明 | +|--------|----------|------| +| 0 | 正常 | 接口可正常被授权和调用 | +| 1 | 停用 | 接口已停用,即使授权也无法调用 | + +### 5.3 请求方法 + +| 方法 | 说明 | +|------|------| +| GET | 查询类接口 | +| POST | 新增/复杂查询类接口 | +| PUT | 修改类接口 | +| DELETE | 删除类接口 | + +--- + +# 第二部分:技术设计方案 + +## 6. 系统架构 + +### 6.1 整体架构图 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 调用方 │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ +│ │ AI教育平台 │ │ 图书馆系统 │ │ OA办公系统 │ │ 家校通小程序 │ │ +│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ +└──────────┼─────────────────┼─────────────────┼─────────────────┼───────────┘ + │ │ │ │ + └─────────────────┴────────┬────────┴─────────────────┘ + │ + v +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 盘古用户认证中心 │ +│ ┌───────────────────────────────────────────────────────────────────────┐ │ +│ │ API 网关层(可选) │ │ +│ └───────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ v │ +│ ┌───────────────────────────────────────────────────────────────────────┐ │ +│ │ 开放接口认证拦截器 │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ 参数校验 │─>│ 签名验证 │─>│ 应用状态 │─>│ 接口权限 │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ v │ +│ ┌───────────────────────────────────────────────────────────────────────┐ │ +│ │ 开放接口层 │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ 学生接口 │ │ 教师接口 │ │ 学校接口 │ │ 更多接口... │ │ │ +│ │ │ /open/api/ │ │ /open/api/ │ │ /open/api/ │ │ (二次开发) │ │ │ +│ │ │ student/* │ │ teacher/* │ │ school/* │ │ │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ v │ +│ ┌───────────────────────────────────────────────────────────────────────┐ │ +│ │ 业务服务层 │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ 学生服务 │ │ 教师服务 │ │ 学校服务 │ │ 应用管理 │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ v │ +│ ┌───────────────────────────────────────────────────────────────────────┐ │ +│ │ 数据持久层 │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ pg_student │ │ pg_teacher │ │ pg_school │ │ pg_app* │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 6.2 技术选型 + +| 层次 | 技术栈 | 说明 | +|------|--------|------| +| 前端框架 | Vue 3 + Element Plus | 管理后台界面 | +| 后端框架 | Spring Boot 3.x | 基于若依Plus框架 | +| ORM框架 | MyBatis Plus | 数据库访问 | +| 安全框架 | Sa-Token | 内部系统鉴权(管理端) | +| 数据库 | MySQL 8.0 | 数据存储 | +| 缓存 | Redis | 可选,用于接口限流、凭证缓存 | +| 加密算法 | MD5 | 接口签名(可升级为HMAC-SHA256) | + +--- + +## 7. 数据库设计 + +### 7.1 ER 关系图 + +``` +┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐ +│ pg_application │ │ pg_app_api │ │ pg_api_dict │ +│ (第三方应用表) │ 1───n │ (应用API授权表) │ n───1 │ (API接口字典) │ +├─────────────────────┤ ├─────────────────────┤ ├─────────────────────┤ +│ PK app_id │────────>│ FK app_id │ │ PK api_id │ +│ app_code │ │ FK api_id │<────────│ api_code │ +│ app_name │ │ create_time │ │ api_name │ +│ app_secret │ └─────────────────────┘ │ api_path │ +│ contact_person │ │ api_method │ +│ contact_phone │ │ api_desc │ +│ status │ │ status │ +│ ... │ │ order_num │ +└─────────────────────┘ └─────────────────────┘ +``` + +### 7.2 表结构详细设计 + +#### 7.2.1 第三方应用表 (pg_application) + +```sql +CREATE TABLE `pg_application` ( + `app_id` bigint NOT NULL COMMENT '应用ID(雪花算法)', + `app_code` varchar(32) NOT NULL COMMENT '应用编码(格式:YY000001)', + `app_name` varchar(100) NOT NULL COMMENT '应用名称', + `app_secret` varchar(100) NOT NULL COMMENT '应用密钥(32位UUID)', + `contact_person` varchar(50) DEFAULT NULL COMMENT '联系人', + `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话', + `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint DEFAULT NULL COMMENT '创建部门', + `create_by` bigint DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)', + `remark` varchar(500) DEFAULT NULL COMMENT '备注/描述', + PRIMARY KEY (`app_id`), + UNIQUE KEY `uk_app_code` (`app_code`) +) ENGINE=InnoDB COMMENT='第三方应用表'; +``` + +**字段说明**: + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| app_id | bigint | 是 | 主键,雪花算法生成 | +| app_code | varchar(32) | 是 | 应用编码,格式 YY+6位序号,系统自动生成 | +| app_name | varchar(100) | 是 | 应用名称,用于显示 | +| app_secret | varchar(100) | 是 | 应用密钥,32位UUID,用于签名计算 | +| contact_person | varchar(50) | 否 | 对接联系人 | +| contact_phone | varchar(20) | 否 | 联系电话 | +| status | char(1) | 是 | 0=正常,1=停用 | +| del_flag | char(1) | 是 | 逻辑删除标志,0=存在,1=已删除 | + +#### 7.2.2 API接口字典表 (pg_api_dict) + +```sql +CREATE TABLE `pg_api_dict` ( + `api_id` bigint NOT NULL COMMENT 'API ID', + `api_code` varchar(50) NOT NULL COMMENT 'API编码(唯一标识)', + `api_name` varchar(100) NOT NULL COMMENT 'API名称(显示用)', + `api_path` varchar(200) NOT NULL COMMENT 'API路径(如 /open/api/student/list)', + `api_method` varchar(10) DEFAULT 'GET' COMMENT '请求方法(GET/POST/PUT/DELETE)', + `api_desc` varchar(500) DEFAULT NULL COMMENT 'API描述', + `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', + `order_num` int DEFAULT 0 COMMENT '排序号', + PRIMARY KEY (`api_id`), + UNIQUE KEY `uk_api_code` (`api_code`) +) ENGINE=InnoDB COMMENT='API接口字典表'; +``` + +**初始数据**(示例接口): + +```sql +INSERT INTO pg_api_dict (api_id, api_code, api_name, api_path, api_method, api_desc, status, order_num) VALUES +(1700000000000000001, 'OPEN_STUDENT_LIST', '学生列表查询', '/open/api/student/list', 'GET', '分页查询学生信息,支持按姓名、学号、班级等条件筛选', '0', 10); +``` + +#### 7.2.3 应用API授权表 (pg_app_api) + +```sql +CREATE TABLE `pg_app_api` ( + `id` bigint NOT NULL COMMENT '主键', + `app_id` bigint NOT NULL COMMENT '应用ID', + `api_id` bigint NOT NULL COMMENT 'API ID', + `create_time` datetime DEFAULT NULL COMMENT '授权时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_app_api` (`app_id`, `api_id`), + KEY `idx_app_id` (`app_id`), + KEY `idx_api_id` (`api_id`) +) ENGINE=InnoDB COMMENT='应用API授权表'; +``` + +### 7.3 菜单数据 + +```sql +-- 应用管理菜单(一级菜单) +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, perms, icon) +VALUES (2300, '应用管理', 0, 4, 'application', 'business/application/index', 'C', 'business:application:list', 'component'); + +-- 按钮权限 +INSERT INTO sys_menu VALUES (2301, '应用查询', 2300, 1, '', '', 'F', 'business:application:query', '#'); +INSERT INTO sys_menu VALUES (2302, '应用新增', 2300, 2, '', '', 'F', 'business:application:add', '#'); +INSERT INTO sys_menu VALUES (2303, '应用修改', 2300, 3, '', '', 'F', 'business:application:edit', '#'); +INSERT INTO sys_menu VALUES (2304, '应用删除', 2300, 4, '', '', 'F', 'business:application:remove', '#'); +INSERT INTO sys_menu VALUES (2305, '重置密钥', 2300, 5, '', '', 'F', 'business:application:resetSecret', '#'); +INSERT INTO sys_menu VALUES (2306, '接口授权', 2300, 6, '', '', 'F', 'business:application:api', '#'); +``` + +--- + +## 8. 接口设计 + +### 8.1 管理端接口 + +#### 8.1.1 应用管理接口 + +| 接口名称 | 方法 | URL | 权限 | 说明 | +|----------|------|-----|------|------| +| 应用列表 | GET | /business/application/list | business:application:list | 分页查询 | +| 应用详情 | GET | /business/application/{appId} | business:application:query | 获取详情 | +| 新增应用 | POST | /business/application | business:application:add | 新增 | +| 修改应用 | PUT | /business/application | business:application:edit | 修改 | +| 删除应用 | DELETE | /business/application/{appIds} | business:application:remove | 删除 | +| 重置密钥 | PUT | /business/application/resetSecret/{appId} | business:application:edit | 重置 | +| 接口列表 | GET | /business/application/apiList | business:application:list | 获取可授权接口 | + +#### 8.1.2 接口详细定义 + +**新增应用** + +```http +POST /business/application +Content-Type: application/json + +{ + "appName": "AI智慧教育平台", + "contactPerson": "张经理", + "contactPhone": "13800138001", + "status": "0", + "remark": "新华AI智慧教育平台,提供智能题库、AI批改等功能", + "apiCodes": ["OPEN_STUDENT_LIST"] +} +``` + +**响应**: + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "appId": 1890000000000000001, + "appCode": "YY000001", + "appSecret": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" + } +} +``` + +### 8.2 开放接口 + +#### 8.2.1 请求头规范 + +| Header | 必填 | 说明 | +|--------|------|------| +| X-App-Id | 是 | 应用编码(AppCode) | +| X-Timestamp | 是 | 当前时间戳(毫秒) | +| X-Sign | 是 | 请求签名(MD5大写) | + +#### 8.2.2 签名算法 + +``` +1. 将所有请求参数(不含签名)按参数名 ASCII 码升序排序 +2. 按照 key1=value1&key2=value2&... 格式拼接 +3. 末尾追加 &appSecret={密钥} +4. 对整个字符串进行 MD5 加密,转大写 + +示例: +请求参数:pageNum=1, pageSize=10, status=0 +密钥:a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 + +签名字符串:pageNum=1&pageSize=10&status=0&appSecret=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 +签名结果:MD5(签名字符串).toUpperCase() +``` + +#### 8.2.3 学生列表接口(示例) + +```http +GET /open/api/student/list?pageNum=1&pageSize=10 +X-App-Id: YY000001 +X-Timestamp: 1738656000000 +X-Sign: A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6 +``` + +**响应**: + +```json +{ + "code": 200, + "msg": "操作成功", + "rows": [ + { + "studentId": 1, + "studentName": "张三", + "studentCode": "S2024001", + "schoolName": "第一小学", + "gradeName": "三年级", + "className": "1班" + } + ], + "total": 100 +} +``` + +#### 8.2.4 错误码定义 + +| 错误码 | 错误信息 | 说明 | +|--------|----------|------| +| 401 | 缺少认证参数 | X-App-Id/X-Timestamp/X-Sign 缺失 | +| 401 | 时间戳格式错误 | X-Timestamp 非数字 | +| 401 | 请求已过期 | 时间戳超过5分钟有效期 | +| 401 | 应用不存在 | AppCode 无效 | +| 401 | 应用已停用 | 应用状态为停用 | +| 401 | 签名验证失败 | 签名计算错误 | +| 403 | 无权访问该接口 | 应用未被授权访问该接口 | + +--- + +## 9. 核心代码设计 + +### 9.1 后端代码结构 + +``` +pangu-modules/pangu-business/src/main/java/org/dromara/pangu/ +├── application/ # 应用管理模块 +│ ├── controller/ +│ │ └── PgApplicationController.java # 应用管理控制器 +│ ├── domain/ +│ │ ├── PgApplication.java # 第三方应用实体 +│ │ ├── PgApiDict.java # API字典实体 +│ │ └── PgAppApi.java # 应用API授权实体 +│ ├── mapper/ +│ │ ├── PgApplicationMapper.java +│ │ ├── PgApiDictMapper.java +│ │ └── PgAppApiMapper.java +│ └── service/ +│ ├── IPgApplicationService.java +│ ├── IPgApiDictService.java +│ └── impl/ +│ ├── PgApplicationServiceImpl.java +│ └── PgApiDictServiceImpl.java +│ +└── openapi/ # 开放接口模块 + ├── config/ + │ ├── ApiAuthInterceptor.java # 开放API鉴权拦截器 + │ └── OpenApiWebMvcConfig.java # 拦截器注册配置 + ├── controller/ + │ └── OpenApiStudentController.java # 学生列表开放接口(示例) + ├── service/ # 开放接口业务层 + │ ├── IOpenApiStudentService.java # 开放接口学生服务接口 + │ └── impl/ + │ └── OpenApiStudentServiceImpl.java # 脱敏、数据转换等业务逻辑 + ├── domain/ + │ └── vo/ + │ └── OpenApiStudentVo.java # 开放接口专用VO(脱敏后的数据结构) + └── utils/ + └── DataMaskUtil.java # 数据脱敏工具类 +``` + +### 9.2 核心类设计 + +#### 9.2.1 鉴权拦截器 (ApiAuthInterceptor.java) + +```java +@Slf4j +@Component +@RequiredArgsConstructor +public class ApiAuthInterceptor implements HandlerInterceptor { + + private static final String HEADER_APP_ID = "X-App-Id"; + private static final String HEADER_TIMESTAMP = "X-Timestamp"; + private static final String HEADER_SIGN = "X-Sign"; + private static final long TIMESTAMP_EXPIRE_MS = 5 * 60 * 1000L; // 5分钟 + + private final IPgApplicationService applicationService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + // 1. 参数校验 + String appId = request.getHeader(HEADER_APP_ID); + String timestamp = request.getHeader(HEADER_TIMESTAMP); + String sign = request.getHeader(HEADER_SIGN); + if (StrUtil.isBlank(appId) || StrUtil.isBlank(timestamp) || StrUtil.isBlank(sign)) { + throw new ServiceException("缺少认证参数"); + } + + // 2. 时间戳校验(防重放攻击) + long reqTime = Long.parseLong(timestamp.trim()); + if (Math.abs(System.currentTimeMillis() - reqTime) > TIMESTAMP_EXPIRE_MS) { + throw new ServiceException("请求已过期"); + } + + // 3. 应用状态校验 + PgApplication app = applicationService.selectByAppCode(appId.trim()); + if (app == null) { + throw new ServiceException("应用不存在"); + } + if ("1".equals(app.getStatus())) { + throw new ServiceException("应用已停用"); + } + + // 4. 签名校验 + String expectedSign = buildSign(request, app.getAppSecret()); + if (!expectedSign.equalsIgnoreCase(sign.trim())) { + throw new ServiceException("签名验证失败"); + } + + // 5. 接口权限校验 + String apiPath = request.getRequestURI(); + if (!applicationService.checkApiPermission(appId.trim(), apiPath)) { + throw new ServiceException("无权访问该接口"); + } + + return true; + } + + private String buildSign(HttpServletRequest request, String appSecret) { + // 参数按 key ASCII 升序排序,拼接后追加 appSecret,MD5 大写 + Map params = new TreeMap<>(); + request.getParameterMap().forEach((key, values) -> { + if (values != null && values.length > 0 && StrUtil.isNotBlank(values[0])) { + params.put(key, values[0].trim()); + } + }); + StringBuilder sb = new StringBuilder(); + params.forEach((k, v) -> sb.append(sb.length() > 0 ? "&" : "").append(k).append("=").append(v)); + sb.append("&appSecret=").append(appSecret); + return DigestUtil.md5Hex(sb.toString()).toUpperCase(); + } +} +``` + +#### 9.2.2 拦截器注册 (OpenApiWebMvcConfig.java) + +```java +@Configuration +@RequiredArgsConstructor +public class OpenApiWebMvcConfig implements WebMvcConfigurer { + + private final ApiAuthInterceptor apiAuthInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(apiAuthInterceptor) + .addPathPatterns("/open/api/**"); // 仅对开放接口生效 + } +} +``` + +#### 9.2.3 开放接口示例 (OpenApiStudentController.java) + +```java +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/open/api/student") +public class OpenApiStudentController extends BaseController { + + private final IOpenApiStudentService openApiStudentService; // 调用开放接口专用服务 + + /** + * 学生列表分页查询(对外开放接口) + * + * 请求示例: + * GET /open/api/student/list?pageNum=1&pageSize=10&studentName=张 + * Headers: + * X-App-Id: YY000001 + * X-Timestamp: 1738656000000 + * X-Sign: A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6 + */ + @GetMapping("/list") + public TableDataInfo list(PgStudent student, PageQuery pageQuery) { + return openApiStudentService.selectPageList(student, pageQuery); + } + + /** + * 学生详情查询(对外开放接口) + */ + @GetMapping("/{studentId}") + public R getInfo(@PathVariable Long studentId) { + return R.ok(openApiStudentService.selectById(studentId)); + } +} +``` + +#### 9.2.4 开放接口业务层 (OpenApiStudentService) + +**说明**:开放接口单独创建 Service 层,用于处理脱敏、数据转换、字段过滤等业务逻辑,与内部业务服务解耦。 + +**服务接口**: + +```java +/** + * 开放接口学生服务接口 + */ +public interface IOpenApiStudentService { + + /** + * 分页查询学生列表(脱敏版本) + */ + TableDataInfo selectPageList(PgStudent student, PageQuery pageQuery); + + /** + * 查询学生详情(脱敏版本) + */ + OpenApiStudentVo selectById(Long studentId); +} +``` + +**服务实现**: + +```java +@Service +@RequiredArgsConstructor +public class OpenApiStudentServiceImpl implements IOpenApiStudentService { + + private final IPgStudentService studentService; // 复用原有业务服务 + + @Override + public TableDataInfo selectPageList(PgStudent student, PageQuery pageQuery) { + // 1. 调用原有业务服务获取数据 + TableDataInfo result = studentService.selectPageList(student, pageQuery); + + // 2. 转换为开放接口VO并脱敏 + List openApiList = result.getRows().stream() + .map(this::convertToOpenApiVo) + .collect(Collectors.toList()); + + // 3. 返回脱敏后的数据 + TableDataInfo openApiResult = new TableDataInfo<>(); + openApiResult.setRows(openApiList); + openApiResult.setTotal(result.getTotal()); + return openApiResult; + } + + @Override + public OpenApiStudentVo selectById(Long studentId) { + StudentVo student = studentService.selectById(studentId); + return convertToOpenApiVo(student); + } + + /** + * 内部转换方法:原始VO -> 开放接口VO(脱敏处理) + */ + private OpenApiStudentVo convertToOpenApiVo(StudentVo source) { + if (source == null) { + return null; + } + + OpenApiStudentVo vo = new OpenApiStudentVo(); + vo.setStudentId(source.getStudentId()); + vo.setStudentCode(source.getStudentCode()); + + // 敏感字段脱敏 + vo.setStudentName(DataMaskUtil.maskName(source.getStudentName())); + + // 非敏感字段直接复制 + vo.setSchoolName(source.getSchoolName()); + vo.setGradeName(source.getGradeName()); + vo.setClassName(source.getClassName()); + + // 敏感字段不对外暴露(身份证号、手机号等) + // 不设置 idCard、phone 等字段 + + return vo; + } +} +``` + +#### 9.2.5 开放接口专用 VO (OpenApiStudentVo.java) + +```java +@Data +@Schema(description = "开放接口学生信息") +public class OpenApiStudentVo implements Serializable { + + @Schema(description = "学生ID") + private Long studentId; + + @Schema(description = "学生姓名(脱敏)") + private String studentName; + + @Schema(description = "学号") + private String studentCode; + + @Schema(description = "学校名称") + private String schoolName; + + @Schema(description = "年级名称") + private String gradeName; + + @Schema(description = "班级名称") + private String className; + + // 注意:敏感字段如身份证号、手机号等不对外暴露 +} +``` + +#### 9.2.6 数据脱敏工具类 (DataMaskUtil.java) + +```java +/** + * 数据脱敏工具类 + */ +public class DataMaskUtil { + + /** + * 姓名脱敏:张三 -> 张* + */ + public static String maskName(String name) { + if (StrUtil.isBlank(name) || name.length() == 1) { + return name; + } + return name.charAt(0) + "*".repeat(name.length() - 1); + } + + /** + * 手机号脱敏:13812345678 -> 138****5678 + */ + public static String maskPhone(String phone) { + if (StrUtil.isBlank(phone) || phone.length() != 11) { + return phone; + } + return phone.substring(0, 3) + "****" + phone.substring(7); + } + + /** + * 身份证脱敏:110101199001011234 -> 110101********1234 + */ + public static String maskIdCard(String idCard) { + if (StrUtil.isBlank(idCard) || idCard.length() < 8) { + return idCard; + } + return idCard.substring(0, 6) + "********" + idCard.substring(idCard.length() - 4); + } +} +``` + +### 9.3 前端代码结构 + +``` +frontend/src/ +├── api/pangu/ +│ └── application.js # 应用管理API +├── views/application/ +│ ├── index.vue # 应用列表页面 +│ └── components/ +│ ├── AppDialog.vue # 新增/编辑弹窗 +│ ├── SecretDialog.vue # 密钥展示弹窗 +│ └── AuthDialog.vue # 接口授权弹窗(新增) +``` + +--- + +## 10. 二次开发指南 + +### 10.1 新增开放接口步骤 + +#### 步骤一:定义接口字典 + +在数据库 `pg_api_dict` 表中新增一条记录: + +```sql +INSERT INTO pg_api_dict (api_id, api_code, api_name, api_path, api_method, api_desc, status, order_num) +VALUES (1700000000000000002, 'OPEN_TEACHER_LIST', '教师列表查询', '/open/api/teacher/list', 'GET', '分页查询教师信息', '0', 20); +``` + +#### 步骤二:创建开放接口专用 VO + +在 `openapi/domain/vo` 目录下新建 VO: + +```java +@Data +@Schema(description = "开放接口教师信息") +public class OpenApiTeacherVo implements Serializable { + + @Schema(description = "教师ID") + private Long teacherId; + + @Schema(description = "教师姓名(脱敏)") + private String teacherName; + + @Schema(description = "教师工号") + private String teacherCode; + + @Schema(description = "学校名称") + private String schoolName; + + // 敏感字段不对外暴露 +} +``` + +#### 步骤三:创建开放接口服务层 + +在 `openapi/service` 目录下新建服务接口和实现类: + +**服务接口**: + +```java +public interface IOpenApiTeacherService { + TableDataInfo selectPageList(PgTeacher teacher, PageQuery pageQuery); +} +``` + +**服务实现**: + +```java +@Service +@RequiredArgsConstructor +public class OpenApiTeacherServiceImpl implements IOpenApiTeacherService { + + private final IPgTeacherService teacherService; // 复用原有业务服务 + + @Override + public TableDataInfo selectPageList(PgTeacher teacher, PageQuery pageQuery) { + // 1. 调用原有业务服务 + TableDataInfo result = teacherService.selectPageList(teacher, pageQuery); + + // 2. 转换并脱敏 + List openApiList = result.getRows().stream() + .map(this::convertToOpenApiVo) + .collect(Collectors.toList()); + + // 3. 返回 + TableDataInfo openApiResult = new TableDataInfo<>(); + openApiResult.setRows(openApiList); + openApiResult.setTotal(result.getTotal()); + return openApiResult; + } + + private OpenApiTeacherVo convertToOpenApiVo(TeacherVo source) { + if (source == null) return null; + + OpenApiTeacherVo vo = new OpenApiTeacherVo(); + vo.setTeacherId(source.getTeacherId()); + vo.setTeacherCode(source.getTeacherCode()); + vo.setTeacherName(DataMaskUtil.maskName(source.getTeacherName())); // 脱敏 + vo.setSchoolName(source.getSchoolName()); + return vo; + } +} +``` + +#### 步骤四:创建接口控制器 + +在 `openapi/controller` 目录下新建控制器: + +```java +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/open/api/teacher") +public class OpenApiTeacherController extends BaseController { + + private final IOpenApiTeacherService openApiTeacherService; // 调用开放接口专用服务 + + @GetMapping("/list") + public TableDataInfo list(PgTeacher teacher, PageQuery pageQuery) { + return openApiTeacherService.selectPageList(teacher, pageQuery); + } +} +``` + +#### 步骤五:为应用授权 + +在应用管理界面,勾选新增的接口授权。 + +### 10.2 接口开发规范 + +1. **路径规范**:所有开放接口必须以 `/open/api/` 开头 +2. **分层规范**: + - Controller 层仅负责接收请求和返回响应 + - Service 层处理业务逻辑(脱敏、转换、字段过滤等) + - 复用原有业务服务,避免重复代码 +3. **VO 设计规范**: + - 为开放接口单独创建 VO,避免直接使用内部实体 + - VO 中只包含需要对外暴露的字段 + - 敏感字段在 Service 层进行脱敏处理 +4. **返回格式**:使用统一的 `R` 或 `TableDataInfo` 返回格式 +5. **参数校验**:使用 `@Validated` 注解进行参数校验 +6. **日志记录**:重要操作需记录日志 +7. **异常处理**:业务异常使用 `ServiceException` + +### 10.3 调用示例代码 + +#### Java 调用示例 + +```java +public class OpenApiClient { + private static final String BASE_URL = "http://your-domain.com"; + private static final String APP_CODE = "YY000001"; + private static final String APP_SECRET = "your-app-secret"; + + public String callApi(String path, Map params) throws Exception { + // 1. 添加时间戳 + String timestamp = String.valueOf(System.currentTimeMillis()); + + // 2. 计算签名 + TreeMap sortedParams = new TreeMap<>(params); + StringBuilder sb = new StringBuilder(); + sortedParams.forEach((k, v) -> sb.append(sb.length() > 0 ? "&" : "").append(k).append("=").append(v)); + sb.append("&appSecret=").append(APP_SECRET); + String sign = DigestUtils.md5Hex(sb.toString()).toUpperCase(); + + // 3. 构造请求 + HttpRequest request = HttpRequest.get(BASE_URL + path + "?" + buildQueryString(params)) + .header("X-App-Id", APP_CODE) + .header("X-Timestamp", timestamp) + .header("X-Sign", sign); + + return request.execute().body(); + } +} +``` + +#### Python 调用示例 + +```python +import hashlib +import time +import requests + +APP_CODE = "YY000001" +APP_SECRET = "your-app-secret" +BASE_URL = "http://your-domain.com" + +def call_api(path, params): + # 1. 添加时间戳 + timestamp = str(int(time.time() * 1000)) + + # 2. 计算签名 + sorted_params = sorted(params.items()) + sign_str = "&".join([f"{k}={v}" for k, v in sorted_params]) + sign_str += f"&appSecret={APP_SECRET}" + sign = hashlib.md5(sign_str.encode()).hexdigest().upper() + + # 3. 发送请求 + headers = { + "X-App-Id": APP_CODE, + "X-Timestamp": timestamp, + "X-Sign": sign + } + response = requests.get(f"{BASE_URL}{path}", params=params, headers=headers) + return response.json() + +# 调用示例 +result = call_api("/open/api/student/list", {"pageNum": "1", "pageSize": "10"}) +print(result) +``` + +--- + +## 11. 部署与运维 + +### 11.1 SQL 脚本执行顺序 + +1. `pangu_tables.sql` - 创建表结构 +2. `pangu_menu.sql` - 插入菜单数据 +3. `open_api_dict_data.sql` - 插入API字典初始数据 + +### 11.2 配置项 + +```yaml +# application.yml +pangu: + openapi: + # 签名有效期(毫秒) + timestamp-expire: 300000 + # 是否开启调用日志 + log-enabled: true +``` + +### 11.3 监控指标 + +| 指标 | 说明 | +|------|------| +| 接口调用次数 | 按应用、接口维度统计 | +| 调用成功率 | 成功/总调用 | +| 平均响应时间 | 接口性能监控 | +| 异常次数 | 签名失败、权限不足等 | + +--- + +## 12. 文件清单 + +### 12.1 后端文件 + +| 文件 | 说明 | +|------|------| +| `application/controller/PgApplicationController.java` | 应用管理控制器 | +| `application/domain/PgApplication.java` | 第三方应用实体 | +| `application/domain/PgApiDict.java` | API字典实体 | +| `application/domain/PgAppApi.java` | 应用API授权实体 | +| `application/mapper/PgApplicationMapper.java` | 应用Mapper | +| `application/mapper/PgApiDictMapper.java` | API字典Mapper | +| `application/mapper/PgAppApiMapper.java` | 应用API授权Mapper | +| `application/service/IPgApplicationService.java` | 应用服务接口 | +| `application/service/impl/PgApplicationServiceImpl.java` | 应用服务实现 | +| `openapi/config/ApiAuthInterceptor.java` | 开放API鉴权拦截器 | +| `openapi/config/OpenApiWebMvcConfig.java` | 拦截器配置 | +| `openapi/controller/OpenApiStudentController.java` | 学生列表开放接口 | +| `openapi/service/IOpenApiStudentService.java` | 开放接口学生服务接口 | +| `openapi/service/impl/OpenApiStudentServiceImpl.java` | 开放接口学生服务实现(脱敏、转换) | +| `openapi/domain/vo/OpenApiStudentVo.java` | 开放接口专用VO | +| `openapi/utils/DataMaskUtil.java` | 数据脱敏工具类 | + +### 12.2 前端文件 + +| 文件 | 说明 | +|------|------| +| `api/pangu/application.js` | 应用管理API | +| `views/application/index.vue` | 应用列表页面 | +| `views/application/components/AppDialog.vue` | 新增/编辑弹窗 | +| `views/application/components/SecretDialog.vue` | 密钥展示弹窗 | + +### 12.3 SQL 文件 + +| 文件 | 说明 | +|------|------| +| `sql/pangu_tables.sql` | 表结构(pg_application、pg_api_dict、pg_app_api) | +| `sql/pangu_menu.sql` | 菜单数据 | +| `sql/open_api_dict_data.sql` | API字典初始数据 | + +--- + +## 附录 + +### A. 术语表 + +| 术语 | 说明 | +|------|------| +| AppCode | 应用编码,唯一标识一个第三方应用 | +| AppSecret | 应用密钥,用于签名计算,需保密 | +| 开放接口 | 对外提供的数据查询接口,需鉴权后访问 | +| 接口授权 | 为应用配置可调用的接口列表 | + +### B. 修订历史 + +| 版本 | 日期 | 修订人 | 说明 | +|------|------|--------|------| +| V1.0 | 2026-02-04 | pangu | 初稿 | + +--- + +*文档结束* diff --git a/docs/应用管理使用说明.md b/docs/应用管理使用说明.md new file mode 100644 index 0000000..d9b26d2 --- /dev/null +++ b/docs/应用管理使用说明.md @@ -0,0 +1,118 @@ +# 应用管理使用说明 + +## 功能概述 + +应用管理用于管理接入盘古用户认证中心的第三方应用系统。通过该功能,可以为外部系统分配唯一的应用编码(AppCode)和密钥(AppSecret),并控制其可调用的开放接口权限。 + +## 访问路径 + +管理后台地址:`http://localhost/application` + +## 功能说明 + +### 1. 应用列表 + +列表展示所有已接入的第三方应用,包含以下信息: + +| 字段 | 说明 | +|------|------| +| 应用名称 | 第三方应用的名称 | +| 应用编码 | 系统自动生成的唯一标识(AppCode) | +| 授权接口 | 该应用被授权可调用的 API 接口 | +| 状态 | 正常/停用 | +| 创建时间 | 应用创建时间 | +| 创建人 | 创建该应用的管理员 | + +**搜索功能**:支持按应用名称、应用编码、状态进行筛选查询。 + +### 2. 新增应用 + +点击【新增】按钮,填写以下信息: + +| 字段 | 必填 | 说明 | +|------|------|------| +| 应用名称 | 是 | 第三方应用的名称,最多50字符 | +| 应用编码 | - | 保存后系统自动生成,无需填写 | +| 应用描述 | 否 | 应用的用途说明,最多200字符 | +| 联系人 | 否 | 第三方应用对接负责人 | +| 联系电话 | 否 | 联系人手机号 | +| 状态 | 是 | 默认为"正常",停用后该应用无法调用接口 | +| 接口授权 | 否 | 勾选该应用可调用的开放接口 | + +保存成功后,系统会自动生成: +- **AppCode**:应用唯一编码 +- **AppSecret**:32位应用密钥 + +### 3. 编辑应用 + +点击操作列的【编辑】按钮,可修改应用信息和接口授权。 + +> 注意:应用编码(AppCode)创建后不可修改。 + +### 4. 重置密钥 + +点击【重置密钥】按钮,系统会重新生成一个32位的新密钥。 + +⚠️ **重要提醒**: +- 重置后原密钥立即失效 +- 新密钥只显示一次,请务必复制保存 +- 第三方应用需要同步更新密钥配置 + +### 5. 删除应用 + +点击【删除】按钮,删除该应用。 + +⚠️ **注意**:删除后该应用的 AppCode 和 AppSecret 将永久失效,第三方系统将无法继续调用接口。 + +## 第三方应用接入指南 + +### 接入流程 + +1. 在应用管理中创建新应用 +2. 获取 AppCode 和 AppSecret +3. 在第三方系统中配置凭证 +4. 按照接口规范调用开放接口 + +### 接口调用认证 + +第三方应用调用开放接口时,需要在请求头中携带认证信息: + +```http +GET /open/api/student/list HTTP/1.1 +Host: your-domain.com +X-App-Code: {应用编码} +X-App-Secret: {应用密钥} +X-Timestamp: {时间戳} +X-Sign: {签名} +``` + +### 签名规则 + +``` +sign = MD5(appCode + appSecret + timestamp) +``` + +### 可用的开放接口 + +| 接口编码 | 接口名称 | 请求方式 | 路径 | +|---------|---------|---------|------| +| OPEN_STUDENT_LIST | 学生列表 | GET | /open/api/student/list | + +> 更多接口请联系管理员开放授权。 + +## 常见问题 + +**Q: 忘记了应用密钥怎么办?** +A: 密钥无法找回,请使用【重置密钥】功能生成新密钥。 + +**Q: 应用被停用后还能调用接口吗?** +A: 不能,停用状态的应用所有接口调用都会返回"应用已停用"错误。 + +**Q: 如何新增开放接口?** +A: 需要联系系统管理员在 API 字典表中添加新接口,并在应用管理中授权。 + +--- + +*文档版本:v1.0* +*更新日期:2026-02-04* +*维护团队:盘古研发团队* diff --git a/docs/应用管理技术方案.md b/docs/应用管理技术方案.md new file mode 100644 index 0000000..fb054e4 --- /dev/null +++ b/docs/应用管理技术方案.md @@ -0,0 +1,417 @@ +# 应用管理技术方案 + +## 一、功能概述 + +应用管理模块用于管理接入盘古用户认证中心的第三方应用系统,实现应用注册、密钥管理、接口授权等功能。 + +## 二、数据库设计 + +### 2.1 ER 关系图 + +``` +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ pg_application │ │ pg_app_api │ │ pg_api_dict │ +│ (第三方应用表) │ 1───n │ (应用API授权表) │ n───1 │ (API接口字典表) │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ +``` + +### 2.2 表结构设计 + +#### 2.2.1 第三方应用表 (pg_application) + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| app_id | bigint | 是 | 应用ID(主键,雪花算法) | +| app_code | varchar(32) | 是 | 应用编码(唯一,格式:YY000001) | +| app_name | varchar(100) | 是 | 应用名称 | +| app_secret | varchar(100) | 是 | 应用密钥(32位UUID) | +| contact_person | varchar(50) | 否 | 联系人 | +| contact_phone | varchar(20) | 否 | 联系电话 | +| status | char(1) | 是 | 状态(0正常 1停用) | +| tenant_id | varchar(20) | 是 | 租户编号 | +| create_dept | bigint | 否 | 创建部门 | +| create_by | bigint | 否 | 创建者 | +| create_time | datetime | 否 | 创建时间 | +| update_by | bigint | 否 | 更新者 | +| update_time | datetime | 否 | 更新时间 | +| del_flag | char(1) | 是 | 删除标志(0存在 1删除) | +| remark | varchar(500) | 否 | 备注 | + +**索引**: +- PRIMARY KEY (`app_id`) +- UNIQUE KEY `uk_app_code` (`app_code`) + +#### 2.2.2 API接口字典表 (pg_api_dict) + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| api_id | bigint | 是 | API ID(主键) | +| api_code | varchar(50) | 是 | API编码(唯一) | +| api_name | varchar(100) | 是 | API名称 | +| api_path | varchar(200) | 是 | API路径 | +| api_method | varchar(10) | 是 | 请求方法(GET/POST/PUT/DELETE) | +| api_desc | varchar(500) | 否 | API描述 | +| status | char(1) | 是 | 状态(0正常 1停用) | +| order_num | int | 是 | 排序号 | + +**索引**: +- PRIMARY KEY (`api_id`) +- UNIQUE KEY `uk_api_code` (`api_code`) + +#### 2.2.3 应用API授权表 (pg_app_api) + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | bigint | 是 | 主键 | +| app_id | bigint | 是 | 应用ID | +| api_id | bigint | 是 | API ID | +| create_time | datetime | 否 | 创建时间 | + +**索引**: +- PRIMARY KEY (`id`) +- UNIQUE KEY `uk_app_api` (`app_id`, `api_id`) + +### 2.3 SQL 脚本 + +```sql +-- 第三方应用表 +DROP TABLE IF EXISTS `pg_application`; +CREATE TABLE `pg_application` ( + `app_id` bigint NOT NULL COMMENT '应用ID', + `app_code` varchar(32) NOT NULL COMMENT '应用编码', + `app_name` varchar(100) NOT NULL COMMENT '应用名称', + `app_secret` varchar(100) NOT NULL COMMENT '应用密钥', + `contact_person` varchar(50) DEFAULT NULL COMMENT '联系人', + `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话', + `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint DEFAULT NULL COMMENT '创建部门', + `create_by` bigint DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`app_id`), + UNIQUE KEY `uk_app_code` (`app_code`) +) ENGINE=InnoDB COMMENT='第三方应用表'; + +-- API接口字典表 +DROP TABLE IF EXISTS `pg_api_dict`; +CREATE TABLE `pg_api_dict` ( + `api_id` bigint NOT NULL COMMENT 'API ID', + `api_code` varchar(50) NOT NULL COMMENT 'API编码', + `api_name` varchar(100) NOT NULL COMMENT 'API名称', + `api_path` varchar(200) NOT NULL COMMENT 'API路径', + `api_method` varchar(10) DEFAULT 'GET' COMMENT '请求方法', + `api_desc` varchar(500) DEFAULT NULL COMMENT 'API描述', + `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', + `order_num` int DEFAULT 0 COMMENT '排序', + PRIMARY KEY (`api_id`), + UNIQUE KEY `uk_api_code` (`api_code`) +) ENGINE=InnoDB COMMENT='API接口字典表'; + +-- 应用API授权表 +DROP TABLE IF EXISTS `pg_app_api`; +CREATE TABLE `pg_app_api` ( + `id` bigint NOT NULL COMMENT '主键', + `app_id` bigint NOT NULL COMMENT '应用ID', + `api_id` bigint NOT NULL COMMENT 'API ID', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_app_api` (`app_id`, `api_id`) +) ENGINE=InnoDB COMMENT='应用API授权表'; + +-- 菜单数据 +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time) +VALUES (2300, '应用管理', 0, 4, 'application', 'business/application/index', '', 1, 0, 'C', '0', '0', 'business:application:list', 'component', 103, 1, NOW()); +INSERT INTO sys_menu VALUES (2301, '应用查询', 2300, 1, '', '', '', 1, 0, 'F', '0', '0', 'business:application:query', '#', 103, 1, NOW(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (2302, '应用新增', 2300, 2, '', '', '', 1, 0, 'F', '0', '0', 'business:application:add', '#', 103, 1, NOW(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (2303, '应用修改', 2300, 3, '', '', '', 1, 0, 'F', '0', '0', 'business:application:edit', '#', 103, 1, NOW(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (2304, '应用删除', 2300, 4, '', '', '', 1, 0, 'F', '0', '0', 'business:application:remove', '#', 103, 1, NOW(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (2305, '重置密钥', 2300, 5, '', '', '', 1, 0, 'F', '0', '0', 'business:application:resetSecret', '#', 103, 1, NOW(), NULL, NULL, ''); +INSERT INTO sys_menu VALUES (2306, '接口授权', 2300, 6, '', '', '', 1, 0, 'F', '0', '0', 'business:application:api', '#', 103, 1, NOW(), NULL, NULL, ''); + +-- API字典初始数据 +INSERT INTO pg_api_dict (api_id, api_code, api_name, api_path, api_method, api_desc, status, order_num) +VALUES (1700000000000000001, 'OPEN_STUDENT_LIST', '学生列表', '/open/api/student/list', 'GET', '开放API-学生列表分页查询', '0', 10); +``` + +## 三、后端代码结构 + +### 3.1 目录结构 + +``` +pangu-modules/pangu-business/src/main/java/org/dromara/pangu/application/ +├── controller/ +│ └── PgApplicationController.java # 应用管理控制器 +├── domain/ +│ ├── PgApplication.java # 第三方应用实体 +│ ├── PgApiDict.java # API字典实体 +│ └── PgAppApi.java # 应用API授权实体 +├── mapper/ +│ ├── PgApplicationMapper.java # 应用Mapper +│ ├── PgApiDictMapper.java # API字典Mapper +│ └── PgAppApiMapper.java # 应用API授权Mapper +└── service/ + ├── IPgApplicationService.java # 应用服务接口 + ├── IPgApiDictService.java # API字典服务接口 + └── impl/ + ├── PgApplicationServiceImpl.java # 应用服务实现 + └── PgApiDictServiceImpl.java # API字典服务实现 +``` + +### 3.2 API 接口列表 + +| 接口 | 方法 | 路径 | 权限标识 | 说明 | +|------|------|------|----------|------| +| 应用列表 | GET | /business/application/list | business:application:list | 分页查询应用列表 | +| 应用详情 | GET | /business/application/{appId} | business:application:query | 获取应用详情 | +| 新增应用 | POST | /business/application | business:application:add | 新增第三方应用 | +| 修改应用 | PUT | /business/application | business:application:edit | 修改应用信息 | +| 删除应用 | DELETE | /business/application/{appIds} | business:application:remove | 删除应用 | +| 重置密钥 | PUT | /business/application/resetSecret/{appId} | business:application:edit | 重置应用密钥 | +| 接口列表 | GET | /business/application/apiList | business:application:list | 获取可授权的API列表 | + +### 3.3 核心代码 + +#### 3.3.1 控制器 (PgApplicationController.java) + +```java +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/business/application") +public class PgApplicationController extends BaseController { + + private final IPgApplicationService applicationService; + private final IPgApiDictService apiDictService; + + @SaCheckPermission("business:application:list") + @GetMapping("/list") + public TableDataInfo list(PgApplication app, PageQuery pageQuery) { + return applicationService.selectPageList(app, pageQuery); + } + + @SaCheckPermission("business:application:edit") + @Log(title = "应用管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetSecret/{appId}") + public R resetSecret(@PathVariable Long appId) { + PgApplication app = applicationService.selectById(appId); + if (app == null) { + return R.fail("应用不存在"); + } + String newSecret = IdUtil.fastSimpleUUID(); + app.setAppSecret(newSecret); + applicationService.update(app); + return R.ok(app); + } +} +``` + +#### 3.3.2 服务实现 (PgApplicationServiceImpl.java) + +```java +@RequiredArgsConstructor +@Service +public class PgApplicationServiceImpl implements IPgApplicationService { + + private final PgApplicationMapper baseMapper; + private final PgAppApiMapper appApiMapper; + private final PgApiDictMapper apiDictMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public int insert(PgApplication app) { + // 自动生成应用编码(格式:YY000001) + String appCode = generateAppCode(); + app.setAppCode(appCode); + // 自动生成32位密钥 + app.setAppSecret(IdUtil.fastSimpleUUID()); + int rows = baseMapper.insert(app); + // 保存接口授权 + if (rows > 0 && app.getApiCodes() != null && !app.getApiCodes().isEmpty()) { + saveAppApis(app.getAppId(), app.getApiCodes()); + } + return rows; + } + + private String generateAppCode() { + // 查询当前最大编码,生成下一个序号 + // 格式:YY + 6位数字,如 YY000001 + } + + @Override + public boolean checkApiPermission(String appCode, String apiPath) { + // 校验应用是否有访问该接口的权限 + List paths = appApiMapper.selectApiPathsByAppCode(appCode); + return paths != null && paths.contains(apiPath); + } +} +``` + +#### 3.3.3 实体类 (PgApplication.java) + +```java +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("pg_application") +public class PgApplication extends BaseEntity { + + @TableId(type = IdType.ASSIGN_ID) + private Long appId; + private String appCode; + private String appName; + private String appSecret; + private String contactPerson; + private String contactPhone; + private String status; + private String tenantId; + @TableLogic + private String delFlag; + private String remark; + + /** 接口授权:API编码列表(不落库) */ + @TableField(exist = false) + private List apiCodes; +} +``` + +## 四、前端代码结构 + +### 4.1 目录结构 + +``` +frontend/src/ +├── api/pangu/ +│ └── application.js # API接口定义 +└── views/application/ + ├── index.vue # 应用列表页面 + └── components/ + ├── AppDialog.vue # 新增/编辑弹窗 + └── SecretDialog.vue # 密钥展示弹窗 +``` + +### 4.2 API 接口 (application.js) + +```javascript +import request from '@/utils/request' + +// 获取应用列表 +export function getApplicationList(params) { + return request({ url: '/business/application/list', method: 'get', params }) +} + +// 新增应用 +export function addApplication(data) { + return request({ url: '/business/application', method: 'post', data }) +} + +// 修改应用 +export function updateApplication(data) { + return request({ url: '/business/application', method: 'put', data }) +} + +// 删除应用 +export function deleteApplication(appId) { + return request({ url: `/business/application/${appId}`, method: 'delete' }) +} + +// 重置应用密钥 +export function resetAppSecret(appId) { + return request({ url: `/business/application/resetSecret/${appId}`, method: 'put' }) +} + +// 获取接口授权选项列表 +export function getApiAuthOptions() { + return request({ url: '/business/application/apiList', method: 'get' }) +} +``` + +### 4.3 页面组件 + +#### 列表页面 (index.vue) + +- 搜索条件:应用名称、应用编码、状态 +- 列表字段:应用名称、应用编码、授权接口、状态、创建时间、创建人 +- 操作按钮:新增、编辑、重置密钥、删除 + +#### 新增/编辑弹窗 (AppDialog.vue) + +- 表单字段:应用名称、应用描述、联系人、联系电话、状态、接口授权 +- 接口授权:多选框组,从 API 字典加载 + +## 五、业务流程 + +### 5.1 新增应用流程 + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 填写表单 │───>│ 提交保存 │───>│ 生成编码 │───>│ 生成密钥 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ │ + v v + ┌──────────────────────────┐ + │ 保存应用 + 接口授权 │ + └──────────────────────────┘ +``` + +### 5.2 第三方调用接口流程 + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 携带凭证 │───>│ 拦截校验 │───>│ 权限检查 │───>│ 执行业务 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ │ │ + │ v v + │ 校验AppCode 校验该应用 + │ 和AppSecret 是否有权限 + │ 访问该接口 + v + 请求头携带: + X-App-Code + X-App-Secret + X-Timestamp + X-Sign +``` + +## 六、文件清单 + +### 6.1 后端文件 + +| 文件路径 | 说明 | +|----------|------| +| `pangu-business/src/.../application/controller/PgApplicationController.java` | 应用管理控制器 | +| `pangu-business/src/.../application/domain/PgApplication.java` | 第三方应用实体 | +| `pangu-business/src/.../application/domain/PgApiDict.java` | API字典实体 | +| `pangu-business/src/.../application/domain/PgAppApi.java` | 应用API授权实体 | +| `pangu-business/src/.../application/mapper/PgApplicationMapper.java` | 应用Mapper | +| `pangu-business/src/.../application/mapper/PgApiDictMapper.java` | API字典Mapper | +| `pangu-business/src/.../application/mapper/PgAppApiMapper.java` | 应用API授权Mapper | +| `pangu-business/src/.../application/service/IPgApplicationService.java` | 应用服务接口 | +| `pangu-business/src/.../application/service/IPgApiDictService.java` | API字典服务接口 | +| `pangu-business/src/.../application/service/impl/PgApplicationServiceImpl.java` | 应用服务实现 | +| `pangu-business/src/.../application/service/impl/PgApiDictServiceImpl.java` | API字典服务实现 | + +### 6.2 前端文件 + +| 文件路径 | 说明 | +|----------|------| +| `frontend/src/api/pangu/application.js` | API接口定义 | +| `frontend/src/views/application/index.vue` | 应用列表页面 | +| `frontend/src/views/application/components/AppDialog.vue` | 新增/编辑弹窗 | +| `frontend/src/views/application/components/SecretDialog.vue` | 密钥展示弹窗 | + +### 6.3 SQL 文件 + +| 文件路径 | 说明 | +|----------|------| +| `pangu-business/sql/pangu_tables.sql` | 表结构(包含pg_application、pg_api_dict、pg_app_api) | +| `pangu-business/sql/pangu_menu.sql` | 菜单数据 | +| `pangu-business/sql/open_api_dict_data.sql` | API字典初始数据 | + +--- + +*文档版本:v1.0* +*更新日期:2026-02-04* +*作者:pangu* diff --git a/docs/开放接口实现说明.md b/docs/开放接口实现说明.md new file mode 100644 index 0000000..758c6e4 --- /dev/null +++ b/docs/开放接口实现说明.md @@ -0,0 +1,382 @@ +# 开放接口实现说明 + +## 📋 实现概述 + +已按照方案一(独立 OpenApi Service 层)完成了开放接口的完整实现,包括后端业务逻辑和前端管理界面。 + +--- + +## ✅ 已完成的工作 + +### 1️⃣ 后端实现 + +#### 核心文件清单 + +| 文件路径 | 说明 | 状态 | +|---------|------|------| +| `openapi/utils/DataMaskUtil.java` | 数据脱敏工具类 | ✅ 新建 | +| `openapi/domain/vo/OpenStudentVo.java` | 开放接口学生VO | ✅ 已优化 | +| `openapi/service/IOpenApiStudentService.java` | 开放接口服务接口 | ✅ 已存在 | +| `openapi/service/impl/OpenApiStudentServiceImpl.java` | 开放接口服务实现 | ✅ 已完善 | +| `openapi/controller/OpenApiStudentController.java` | 开放接口控制器 | ✅ 已更新 | + +#### 实现细节 + +**1. DataMaskUtil 工具类** + +```java +位置:org.dromara.pangu.openapi.utils.DataMaskUtil + +提供的脱敏方法: +- maskName() // 姓名脱敏:张三 -> 张* +- maskPhone() // 手机号脱敏:13812345678 -> 138****5678 +- maskIdCard() // 身份证脱敏:110101199001011234 -> 110101********1234 +- maskEmail() // 邮箱脱敏:example@qq.com -> e****e@qq.com +- maskAddress() // 地址脱敏:保留省市区 +``` + +**2. OpenApiStudentServiceImpl 服务实现** + +核心逻辑: +``` +1. 调用原有业务服务(IPgStudentService)获取数据 +2. 在 Service 层进行数据转换(StudentVo -> OpenStudentVo) +3. 使用 DataMaskUtil 对敏感字段进行脱敏 +4. 敏感字段不返回(身份证号、住址、会员信息等) +5. 返回开放接口专用 VO +``` + +**3. OpenApiStudentController 控制器** + +接口定义: +``` +GET /open/api/student/list + +查询参数: +- studentName: 学生姓名(模糊查询) +- schoolId: 学校ID +- gradeId: 年级ID +- classId: 班级ID +- pageNum: 页码 +- pageSize: 每页条数 + +返回数据: +{ + "code": 200, + "msg": "操作成功", + "rows": [ + { + "studentId": 1, + "studentCode": "S2024001", + "studentName": "张*", // 已脱敏 + "gender": "1", + "schoolId": 1, + "schoolName": "第一小学", + "gradeId": 1, + "gradeName": "三年级", + "classId": 1, + "className": "1班" + } + ], + "total": 100 +} +``` + +#### 技术亮点 + +1. **分层清晰** + - Controller 只负责接收请求 + - Service 处理业务逻辑(脱敏、转换) + - 复用原有 Service,避免重复代码 + +2. **数据安全** + - 敏感字段脱敏(姓名使用 maskName) + - 高敏感字段不返回(身份证、住址等) + - 使用专用 VO,与内部数据结构解耦 + +3. **易于扩展** + - 新增开放接口只需: + - 创建专用 VO + - 创建 Service 接口和实现 + - 创建 Controller + - DataMaskUtil 可复用 + +--- + +### 2️⃣ 前端实现 + +#### 核心文件清单 + +| 文件路径 | 说明 | 状态 | +|---------|------|------| +| `views/application/index.vue` | 应用管理主页面 | ✅ 已优化 | +| `views/application/components/AppDialog.vue` | 新增/编辑弹窗 | ✅ 已优化 | +| `views/application/components/SecretDialog.vue` | 密钥展示弹窗 | ✅ 已存在 | +| `api/pangu/application.js` | 应用管理API | ✅ 已存在 | + +#### 功能实现 + +**1. 应用列表页面** + +功能点: +- ✅ 搜索:应用名称、应用编码、状态 +- ✅ 列表展示:应用信息、授权接口、状态 +- ✅ 新增应用 +- ✅ 编辑应用 +- ✅ 查看密钥 +- ✅ 重置密钥(需二次确认) +- ✅ 删除应用(需二次确认) +- ✅ 分页功能 + +**2. 新增/编辑弹窗** + +表单字段: +- 应用名称(必填) +- 应用编码(自动生成) +- 应用描述 +- 联系人 +- 联系电话(手机号格式校验) +- 状态(正常/停用) +- 接口授权(多选框,展示接口名称、路径、描述) + +特性: +- ✅ 表单校验 +- ✅ 接口授权选项动态加载 +- ✅ 新增成功后自动显示密钥 +- ✅ 编辑时回显数据 + +**3. 密钥展示弹窗** + +功能: +- 展示应用名称、编码、密钥 +- 一键复制密钥 +- 安全提示(密钥重置后旧密钥失效) + +--- + +## 🔍 使用示例 + +### 第三方应用调用示例 + +**1. Java 调用** + +```java +// 1. 准备请求参数 +Map params = new TreeMap<>(); +params.put("pageNum", "1"); +params.put("pageSize", "10"); +params.put("studentName", "张"); + +// 2. 计算签名 +String timestamp = String.valueOf(System.currentTimeMillis()); +StringBuilder signStr = new StringBuilder(); +params.forEach((k, v) -> signStr.append(k).append("=").append(v).append("&")); +signStr.append("appSecret=").append(APP_SECRET); +String sign = DigestUtils.md5Hex(signStr.toString()).toUpperCase(); + +// 3. 发送请求 +HttpRequest request = HttpRequest.get(BASE_URL + "/open/api/student/list") + .header("X-App-Id", APP_CODE) + .header("X-Timestamp", timestamp) + .header("X-Sign", sign) + .form(params); + +String response = request.execute().body(); +``` + +**2. Python 调用** + +```python +import hashlib +import time +import requests + +# 1. 准备参数 +params = { + "pageNum": "1", + "pageSize": "10", + "studentName": "张" +} + +# 2. 计算签名 +timestamp = str(int(time.time() * 1000)) +sorted_params = sorted(params.items()) +sign_str = "&".join([f"{k}={v}" for k, v in sorted_params]) +sign_str += f"&appSecret={APP_SECRET}" +sign = hashlib.md5(sign_str.encode()).hexdigest().upper() + +# 3. 发送请求 +headers = { + "X-App-Id": APP_CODE, + "X-Timestamp": timestamp, + "X-Sign": sign +} +response = requests.get( + f"{BASE_URL}/open/api/student/list", + params=params, + headers=headers +) +print(response.json()) +``` + +--- + +## 🧪 测试建议 + +### 后端测试 + +1. **单元测试 DataMaskUtil** + ```java + @Test + public void testMaskName() { + assertEquals("张*", DataMaskUtil.maskName("张三")); + assertEquals("李**", DataMaskUtil.maskName("李四五")); + } + ``` + +2. **集成测试 OpenApiStudentService** + - 测试分页查询 + - 测试数据脱敏是否生效 + - 测试敏感字段是否被过滤 + +3. **接口测试 OpenApiStudentController** + - 使用 Postman 或 curl 测试 + - 验证鉴权是否生效 + - 验证返回数据格式 + +### 前端测试 + +1. **功能测试** + - 应用列表加载 + - 新增应用(含接口授权) + - 编辑应用 + - 查看密钥 + - 重置密钥 + - 删除应用 + +2. **表单校验** + - 必填项校验 + - 手机号格式校验 + +--- + +## 📝 后续扩展指南 + +### 新增开放接口(以教师接口为例) + +**步骤一:创建专用 VO** + +```java +// openapi/domain/vo/OpenTeacherVo.java +@Data +@Schema(description = "开放接口教师信息") +public class OpenTeacherVo implements Serializable { + private Long teacherId; + private String teacherName; // 已脱敏 + private String teacherCode; + private String schoolName; + // 敏感字段不暴露 +} +``` + +**步骤二:创建 Service 接口** + +```java +// openapi/service/IOpenApiTeacherService.java +public interface IOpenApiTeacherService { + TableDataInfo selectPageList( + String teacherName, + Long schoolId, + PageQuery pageQuery + ); +} +``` + +**步骤三:创建 Service 实现** + +```java +// openapi/service/impl/OpenApiTeacherServiceImpl.java +@Service +@RequiredArgsConstructor +public class OpenApiTeacherServiceImpl implements IOpenApiTeacherService { + + private final IPgTeacherService teacherService; // 复用原有服务 + + @Override + public TableDataInfo selectPageList(...) { + // 1. 调用原有服务 + // 2. 转换并脱敏 + // 3. 返回 + } + + private OpenTeacherVo convertToOpenApiVo(TeacherVo source) { + // 使用 DataMaskUtil 进行脱敏 + } +} +``` + +**步骤四:创建 Controller** + +```java +// openapi/controller/OpenApiTeacherController.java +@RestController +@RequestMapping("/open/api/teacher") +public class OpenApiTeacherController { + + private final IOpenApiTeacherService openApiTeacherService; + + @GetMapping("/list") + public TableDataInfo list(...) { + return openApiTeacherService.selectPageList(...); + } +} +``` + +**步骤五:添加接口字典** + +```sql +INSERT INTO pg_api_dict (api_id, api_code, api_name, api_path, api_method, api_desc, status, order_num) +VALUES (1700000000000000002, 'OPEN_TEACHER_LIST', '教师列表查询', '/open/api/teacher/list', 'GET', '分页查询教师信息', '0', 20); +``` + +**步骤六:在应用管理中授权** + +前端应用管理页面 -> 编辑应用 -> 勾选"教师列表查询"接口 + +--- + +## 🎯 核心优势总结 + +1. **安全可控** + - 五重验证机制(参数、时间戳、应用状态、签名、接口权限) + - 敏感数据脱敏 + - 高敏感字段不返回 + +2. **易于扩展** + - Service 层可复用 + - DataMaskUtil 可复用 + - 新增接口遵循统一规范 + +3. **便于维护** + - 分层清晰 + - 代码解耦 + - 文档完善 + +4. **用户友好** + - 前端界面直观 + - 接口授权可视化 + - 密钥管理便捷 + +--- + +## 📞 技术支持 + +如有问题,请参考: +1. 需求与技术设计方案文档 +2. 代码注释 +3. 本实现说明文档 + +--- + +*实现完成时间:2026-02-04* +*实现人员:pangu* diff --git a/docs/接口清单.md b/docs/接口清单.md index 010b82a..adc6feb 100644 --- a/docs/接口清单.md +++ b/docs/接口清单.md @@ -195,6 +195,14 @@ | 重置应用密钥 | PUT | `/business/application/resetSecret/{appId}` | | 获取API接口列表 | GET | `/business/application/apiList` | +### 3.9 开放API(应用签名鉴权,无需登录) + +| 接口说明 | 请求方式 | 接口地址 | 鉴权说明 | +| ---- | ---- | ------------------------ | ------------------------------------------ | +| 学生列表 | GET | `/open/api/student/list` | 请求头 X-App-Id、X-Timestamp、X-Sign,且应用需已授权该接口 | + +详见:`docs/05-模块技术方案/开放API-学生列表授权-调用测试说明.md` + --- ## 四、系统管理接口 diff --git a/docs/接口清单.pdf b/docs/接口清单.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5d8414ed5d2aa5d7cfef25412e4bdcbf70977260 GIT binary patch literal 414135 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

1L&^y!AdFz?#4 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 z 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�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 RAi - + - - + + @@ -44,16 +44,21 @@ inactive-text="停用" /> - - - - {{ item.label }} - + + +

+
+ 暂无可授权的接口 +
- - + @@ -73,7 +78,7 @@ - + @@ -85,10 +90,10 @@ * 应用管理页面 * @author pangu */ -import { Delete, Edit, Key, Plus, Refresh, Search } from '@element-plus/icons-vue' +import { Delete, Edit, Key, Plus, Refresh, Search, View } from '@element-plus/icons-vue' import { ElMessage, ElMessageBox } from 'element-plus' import { onMounted, ref } from 'vue' -import request from '@/utils/request' +import { getApplicationList, deleteApplication, resetAppSecret, getApplicationDetail } from '@/api/pangu/application' import AppDialog from './components/AppDialog.vue' import SecretDialog from './components/SecretDialog.vue' @@ -111,7 +116,7 @@ const secretDialogRef = ref() const getList = async () => { loading.value = true try { - const res = await request.get('/api/application/list', { params: queryParams.value }) + const res = await getApplicationList(queryParams.value) if (res.code === 200) { tableData.value = res.rows total.value = res.total @@ -149,36 +154,70 @@ const handleEdit = (row) => { appDialogRef.value?.open(row) } +// 查看密钥 +const handleViewSecret = async (row) => { + try { + const res = await getApplicationDetail(row.appId) + if (res.code === 200) { + secretDialogRef.value?.open(res.data) + } + } catch (error) { + ElMessage.error('查询应用信息失败') + } +} + // 重置密钥 const handleResetSecret = async (row) => { - ElMessageBox.confirm(`确定要重置应用"${row.appName}"的密钥吗?`, '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(async () => { - const res = await request.put(`/api/application/resetSecret/${row.id}`) - if (res.code === 200) { - ElMessage.success('重置成功') - secretDialogRef.value?.open(res.data) + ElMessageBox.confirm( + `确定要重置应用"${row.appName}"的密钥吗?重置后原密钥将立即失效!`, + '警告', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + } + ).then(async () => { + try { + const res = await resetAppSecret(row.appId) + if (res.code === 200) { + ElMessage.success('密钥重置成功') + secretDialogRef.value?.open(res.data) + getList() + } + } catch (error) { + ElMessage.error('重置密钥失败') } }).catch(() => {}) } // 删除 const handleDelete = (row) => { - ElMessageBox.confirm(`确定要删除应用"${row.appName}"吗?`, '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(async () => { - const res = await request.delete(`/api/application/${row.id}`) - if (res.code === 200) { - ElMessage.success('删除成功') - getList() + ElMessageBox.confirm( + `确定要删除应用"${row.appName}"吗?删除后该应用将无法调用接口!`, + '警告', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + } + ).then(async () => { + try { + const res = await deleteApplication(row.appId) + if (res.code === 200) { + ElMessage.success('删除成功') + getList() + } + } catch (error) { + ElMessage.error('删除失败') } }).catch(() => {}) } +// 显示密钥(新增成功后调用) +const handleShowSecret = (data) => { + secretDialogRef.value?.open(data) +} + onMounted(() => { getList() }) diff --git a/frontend/src/views/business/apiDict/index.vue b/frontend/src/views/business/apiDict/index.vue new file mode 100644 index 0000000..db9f8e3 --- /dev/null +++ b/frontend/src/views/business/apiDict/index.vue @@ -0,0 +1,319 @@ + + + + + diff --git a/frontend/src/views/business/application/index.vue b/frontend/src/views/business/application/index.vue index 917591c..f66ffe2 100644 --- a/frontend/src/views/business/application/index.vue +++ b/frontend/src/views/business/application/index.vue @@ -138,9 +138,18 @@ const handleAdd = () => { appDialogRef.value?.open() } -// 编辑 -const handleEdit = (row) => { - appDialogRef.value?.open(row) +// 编辑:先拉取详情(含接口授权 apiCodes)再打开弹窗 +const handleEdit = async (row) => { + try { + const res = await request.get(`/business/application/${row.appId}`) + if (res.code === 200 && res.data) { + appDialogRef.value?.open(res.data) + } else { + appDialogRef.value?.open(row) + } + } catch { + appDialogRef.value?.open(row) + } } // 重置密钥 diff --git a/frontend/src/views/business/member/components/EducationDialog.vue b/frontend/src/views/business/member/components/EducationDialog.vue index 84c1189..97c50cf 100644 --- a/frontend/src/views/business/member/components/EducationDialog.vue +++ b/frontend/src/views/business/member/components/EducationDialog.vue @@ -1,11 +1,11 @@