diff --git a/src/main/java/com/youlai/boot/auth/security/filter/CaptchaValidationFilter.java b/src/main/java/com/youlai/boot/auth/security/filter/CaptchaValidationFilter.java index 34f569ab..67423451 100644 --- a/src/main/java/com/youlai/boot/auth/security/filter/CaptchaValidationFilter.java +++ b/src/main/java/com/youlai/boot/auth/security/filter/CaptchaValidationFilter.java @@ -29,9 +29,7 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; /** - * 图形验证码校验过滤器。 - *

- * 归使用方,因为验证码规则(哪些接口需要验证码、验证码类型)因项目而异。 + * 图形验证码校验过滤器 */ public class CaptchaValidationFilter extends OncePerRequestFilter { diff --git a/src/main/java/com/youlai/boot/auth/security/handler/JsonAccessDeniedHandler.java b/src/main/java/com/youlai/boot/auth/security/handler/JsonAccessDeniedHandler.java index 3124829f..20de72db 100644 --- a/src/main/java/com/youlai/boot/auth/security/handler/JsonAccessDeniedHandler.java +++ b/src/main/java/com/youlai/boot/auth/security/handler/JsonAccessDeniedHandler.java @@ -9,9 +9,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; /** - * 无权限访问处理器。 - *

- * 归使用方,因为 JSON 响应格式因项目而异。 + * 无权限访问处理器 * * @author Ray.Hao * @since 2.0.0 diff --git a/src/main/java/com/youlai/boot/auth/security/handler/JsonAuthenticationEntryPoint.java b/src/main/java/com/youlai/boot/auth/security/handler/JsonAuthenticationEntryPoint.java index 0a265125..b7d11849 100644 --- a/src/main/java/com/youlai/boot/auth/security/handler/JsonAuthenticationEntryPoint.java +++ b/src/main/java/com/youlai/boot/auth/security/handler/JsonAuthenticationEntryPoint.java @@ -14,9 +14,7 @@ import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** - * 统一处理 Spring Security 认证失败响应。 - *

- * 归使用方,因为 JSON 响应格式(Result 结构、错误码)因项目而异。 + * 统一处理 Spring Security 认证失败响应 * * @author Ray.Hao * @since 2.0.0 diff --git a/src/main/java/com/youlai/boot/common/aspect/RepeatSubmitAspect.java b/src/main/java/com/youlai/boot/common/aspect/RepeatSubmitAspect.java index 976c0f5d..256930ee 100644 --- a/src/main/java/com/youlai/boot/common/aspect/RepeatSubmitAspect.java +++ b/src/main/java/com/youlai/boot/common/aspect/RepeatSubmitAspect.java @@ -57,10 +57,8 @@ public class RepeatSubmitAspect { /** * 生成防重复提交锁的 key - *

- * key 由「用户标识 + 接口(method:URI) + 请求体哈希」组成:只有同一用户在同一接口提交 - * 完全相同的请求体才视为重复提交;若仅按 method:URI 生成,同一接口的不同提交 - * (如新增菜单与新增目录)会在窗口内被误判为重复。 + * + *

请求体哈希用于区分同一接口的不同提交(如新增菜单与新增目录)

*/ private String buildLockKey(ProceedingJoinPoint pjp) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); diff --git a/src/main/java/com/youlai/boot/common/constant/JwtClaimConstants.java b/src/main/java/com/youlai/boot/common/constant/JwtClaimConstants.java index 61be1d98..8b9463ef 100644 --- a/src/main/java/com/youlai/boot/common/constant/JwtClaimConstants.java +++ b/src/main/java/com/youlai/boot/common/constant/JwtClaimConstants.java @@ -2,8 +2,6 @@ package com.youlai.boot.common.constant; /** * JWT Claims声明常量 - *

- * JWT Claims 属于 Payload 的一部分,包含了一些实体(通常指的用户)的状态和额外的元数据。 * * @author haoxr * @since 2023/11/24 diff --git a/src/main/java/com/youlai/boot/common/result/ResultCode.java b/src/main/java/com/youlai/boot/common/result/ResultCode.java index bdfb1c3b..1469802f 100644 --- a/src/main/java/com/youlai/boot/common/result/ResultCode.java +++ b/src/main/java/com/youlai/boot/common/result/ResultCode.java @@ -17,7 +17,7 @@ import java.io.Serializable; * - 错误码后三位编号与 HTTP 状态码无关。 *

* 说明: - * - 本项目仅保留实际使用的错误码,并在 A/B/C 各保留少量示例,避免枚举无限膨胀。 + * - 本项目仅保留实际使用的错误码,A/B/C 各保留少量示例。 * - 如需扩展业务错误码,建议在对应宏观分类下按场景划分号段并保持全局唯一。 *

* 附表(节选):错误码列表(示例/项目使用项) diff --git a/src/main/java/com/youlai/boot/common/util/IPUtils.java b/src/main/java/com/youlai/boot/common/util/IPUtils.java index ae1480cc..68bd3e89 100644 --- a/src/main/java/com/youlai/boot/common/util/IPUtils.java +++ b/src/main/java/com/youlai/boot/common/util/IPUtils.java @@ -17,12 +17,6 @@ import java.nio.file.StandardCopyOption; /** * IP工具类 - *

- * 获取客户端IP地址和IP地址对应的地理位置信息 - *

- * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 - * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 - *

* * @author Ray * @since 2.10.0 diff --git a/src/main/java/com/youlai/boot/config/JacksonConfig.java b/src/main/java/com/youlai/boot/config/JacksonConfig.java index f9ed47af..ce221e06 100644 --- a/src/main/java/com/youlai/boot/config/JacksonConfig.java +++ b/src/main/java/com/youlai/boot/config/JacksonConfig.java @@ -27,9 +27,6 @@ public class JacksonConfig { /** * 全局 JsonMapper - * - *

由 Spring Boot 自动装配到 Jackson 相关的 HttpMessageConverter 中,作为全局 JSON 序列化/反序列化 - * 行为的唯一入口。

*/ @Bean public JsonMapper objectMapper() { diff --git a/src/main/java/com/youlai/boot/config/SecurityConfig.java b/src/main/java/com/youlai/boot/config/SecurityConfig.java index fd2037d2..8a3b450d 100644 --- a/src/main/java/com/youlai/boot/config/SecurityConfig.java +++ b/src/main/java/com/youlai/boot/config/SecurityConfig.java @@ -36,10 +36,7 @@ import org.springframework.security.web.access.intercept.AuthorizationFilter; import jakarta.servlet.DispatcherType; /** - * Spring Security 配置类。 - *

- * 归使用方(auth 模块),安全规则(放行路径、CORS、Provider 装配、响应格式) - * 因项目而异,不应由框架层强制装配。 + * Spring Security 配置类 * * @author Ray.Hao * @since 4.3.1 diff --git a/src/main/java/com/youlai/boot/module/form/enums/FormStatusEnum.java b/src/main/java/com/youlai/boot/module/form/enums/FormStatusEnum.java index 197aa0f2..d64cd17b 100644 --- a/src/main/java/com/youlai/boot/module/form/enums/FormStatusEnum.java +++ b/src/main/java/com/youlai/boot/module/form/enums/FormStatusEnum.java @@ -9,8 +9,7 @@ import lombok.Getter; /** * 表单状态枚举 * - *

正数为有效生命周期(草稿/已发布),-1 为退役态(已停用), - * 与字典等模块"启停"语义(1/0)不同类,故独立定义

+ *

-1 为停用态,其余为正常生命周期

* * @author Ray.Hao * @since 4.8.0 diff --git a/src/main/java/com/youlai/boot/module/form/service/FormDefinitionService.java b/src/main/java/com/youlai/boot/module/form/service/FormDefinitionService.java index c896661c..587b5221 100644 --- a/src/main/java/com/youlai/boot/module/form/service/FormDefinitionService.java +++ b/src/main/java/com/youlai/boot/module/form/service/FormDefinitionService.java @@ -89,9 +89,6 @@ public interface FormDefinitionService extends IService { /** * 按 formKey 获取公开表单的渲染规则(匿名接口) * - *

公开访问总闸:仅 is_public=1 且已发布的表单可获取, - * 否则视为不存在(分享链接立即失效,无需召回)

- * * @param formKey 表单唯一标识 * @return 表单渲染数据 */ @@ -108,9 +105,6 @@ public interface FormDefinitionService extends IService { /** * 生成表单访问菜单并授权可见角色(幂等:已生成时更新原菜单) * - *

菜单 component 指向通用承载页 dynamic-form/render,路由参数携带 formKey; - * 角色授权沿 tree_path 补齐祖先目录,防止侧边栏构树出现孤儿节点

- * * @param formId 表单ID * @param menuForm 菜单发布参数 * @return 是否生成成功 diff --git a/src/main/java/com/youlai/boot/module/form/service/impl/FormDataServiceImpl.java b/src/main/java/com/youlai/boot/module/form/service/impl/FormDataServiceImpl.java index 8992a98b..02185698 100644 --- a/src/main/java/com/youlai/boot/module/form/service/impl/FormDataServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/form/service/impl/FormDataServiceImpl.java @@ -92,9 +92,6 @@ public class FormDataServiceImpl extends ServiceImpl i /** * 数据落库(登录/匿名提交共用) * - *

后端基础校验(必填/类型)+ 字段白名单过滤:前端校验可被绕过, - * 恶意构造的未声明字段不会入库;匿名提交 create_by 由字段填充器留空

- * * @param form 表单定义 * @param data 提交数据 */ @@ -111,9 +108,6 @@ public class FormDataServiceImpl extends ServiceImpl i /** * 公开表单按 formKey + IP 限流(固定窗口计数) * - *

Redis 异常时 Fail-Open 放行,与 IpRateLimitFilter 策略一致: - * 限流是防刷兜底而非业务正确性保障,不能因 Redis 抖动拒绝正常提交

- * * @param formKey 表单唯一标识 * @param ip 提交方 IP */ @@ -154,9 +148,6 @@ public class FormDataServiceImpl extends ServiceImpl i /** * 获取表单数据详情(只读回显) * - *

版本快照严格回显:优先按提交时版本加载规则快照, - * 防止表单定义变更(字段删除/改名)导致历史数据回显漂移

- * * @param dataId 数据ID */ @Override diff --git a/src/main/java/com/youlai/boot/module/form/service/impl/FormDefinitionServiceImpl.java b/src/main/java/com/youlai/boot/module/form/service/impl/FormDefinitionServiceImpl.java index 8fce5878..a7b70755 100644 --- a/src/main/java/com/youlai/boot/module/form/service/impl/FormDefinitionServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/form/service/impl/FormDefinitionServiceImpl.java @@ -109,8 +109,7 @@ public class FormDefinitionServiceImpl extends ServiceImplformKey 创建后不可修改;草稿态可修改元数据与规则, - * 非草稿态仅可修改规则(元数据只读,防止已发布表单的语义漂移)

+ *

formKey 创建后不可修改;草稿态可修改元数据与规则,非草稿态仅可修改规则

* * @param id 表单ID * @param formData 表单定义表单数据 @@ -262,8 +261,8 @@ public class FormDefinitionServiceImpl extends ServiceImpl不复用 {@link #getFormRender(String)} 的 Redis 缓存:缓存 VO 不含 isPublic, - * 开关切换需额外失效逻辑;公开页非高频路径(IP 全局限流兜底),直查更简单可靠

+ *

仅返回已发布且 isPublic=1 的表单;直查库,不读 {@link #getFormRender(String)} 的 + * Redis 缓存——缓存 VO 不含 isPublic,命中会绕过公开开关校验

* * @param formKey 表单唯一标识 */ @@ -311,9 +310,6 @@ public class FormDefinitionServiceImpl extends ServiceImpl菜单 component 指向通用承载页 dynamic-form/render,路由参数携带 formKey, - * 承载页从 route.meta.params 读取后按 formKey 加载渲染规则

- * * @param formId 表单ID * @param menuForm 菜单发布参数 */ @@ -380,14 +376,8 @@ public class FormDefinitionServiceImpl extends ServiceImpl挂载位置:"动态表单"目录下(顶级入口聚合,员工侧边栏为 动态表单 > 表单中心 > 各表单; - * 管理菜单不授权给填写角色即不渲染,无需顶级分离); - * "动态表单"目录缺失时(未执行 form.sql 的环境)退化为顶级创建兜底

- * - *

懒创建而非 SQL 预置:预置空目录在侧边栏是点不开的孤菜单(无子路由不注册); - * 首个表单发布时才建目录,目录一出现就有子菜单

- * - *

踩坑:saveMenu 内部 saveOrUpdate 不回写表单对象主键,需按路由名称反查实体

+ *

挂到顶级"动态表单"目录下,该目录缺失时退化为顶级创建; + * 无子菜单的目录在侧边栏不渲染

* * @return 默认目录实体 */ diff --git a/src/main/java/com/youlai/boot/module/form/util/FormRuleValidator.java b/src/main/java/com/youlai/boot/module/form/util/FormRuleValidator.java index bd05b2a9..8e2bbb24 100644 --- a/src/main/java/com/youlai/boot/module/form/util/FormRuleValidator.java +++ b/src/main/java/com/youlai/boot/module/form/util/FormRuleValidator.java @@ -13,12 +13,8 @@ import java.util.Map; /** * 表单规则校验器(后端基础校验 + 字段白名单) * - *

前端校验可被绕过,后端基于 form-create rule 的 validate 规则做兜底校验: - * 必填(required)与基础类型(number/array),并按 rule 声明的 field 做白名单过滤, - * 恶意构造的未声明字段不会入库

- * - *

仅做基础校验(与 rule validate 语义对齐),pattern/min/max 等复杂规则 - * 由前端 form-create 完整执行,后端不重复实现整套校验引擎

+ *

按 form-create rule 的 validate 声明校验必填(required)与基础类型(number/array), + * 并按 rule 声明的 field 过滤数据

* * @author Ray.Hao * @since 4.8.0 diff --git a/src/main/java/com/youlai/boot/support/file/service/impl/AliyunFileServiceImpl.java b/src/main/java/com/youlai/boot/support/file/service/impl/AliyunFileServiceImpl.java index b40fbab5..ef8ee8e4 100644 --- a/src/main/java/com/youlai/boot/support/file/service/impl/AliyunFileServiceImpl.java +++ b/src/main/java/com/youlai/boot/support/file/service/impl/AliyunFileServiceImpl.java @@ -111,7 +111,7 @@ public class AliyunFileServiceImpl implements FileService { /** * 获取文件访问主机地址(含协议),如 {@code https://bucket.oss-cn-hangzhou.aliyuncs.com}。 *

- * 协议以 endpoint 配置为准,未指定时默认 https;上传拼接 URL 与删除解析 URL 共用,保证两处口径一致。 + * 协议以 endpoint 配置为准,未指定时默认 https。 */ private String getFileHost() { String endpointWithProtocol = endpointWithProtocol();