From 286999438707e825824c14a99fe3d879c0c6a636 Mon Sep 17 00:00:00 2001 From: Doghole Date: Tue, 9 Jun 2026 16:23:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20RequestInfo=20=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=93=8D=E4=BD=9C=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. RequestInfoControllerV1 save 接口对 RequestInfo 参数做 @Valid 校验; 2. RequestInfoControllerV1 去除批量操作中的置匿名/去匿名,因为对于 RequestInfo 而言,当前已无字段标记匿名与否,仅凭是否配置用户名和密码来判断是否为匿名; 3. RequestInfoService 查找不到默认配置时创建 new RequestInfo(),虽数据表有触发器置 isDefault = true,但此处仍手动 set,确保一致性; 4. RequestInfo 一些依赖 DeviceInfo 的字段,不做冗余,直接从 DeviceInfo <- fingerprint/deviceName/softwareType 恢复。 --- .../manage/RequestInfoControllerV1.java | 16 ++--- .../emoney/entity/sqlite/RequestInfo.java | 68 +++++++++++-------- .../service/sqlite/RequestInfoService.java | 1 + .../emoney/validator/RequestInfoValid.java | 2 +- .../validator/RequestInfoValidator.java | 3 + .../admin/v1/manage/requestInfo/include.html | 2 +- .../admin/v1/manage/requestInfo/index.html | 4 +- 7 files changed, 51 insertions(+), 45 deletions(-) diff --git a/src/main/java/quant/rich/emoney/controller/manage/RequestInfoControllerV1.java b/src/main/java/quant/rich/emoney/controller/manage/RequestInfoControllerV1.java index a5f5375..51fe7a1 100644 --- a/src/main/java/quant/rich/emoney/controller/manage/RequestInfoControllerV1.java +++ b/src/main/java/quant/rich/emoney/controller/manage/RequestInfoControllerV1.java @@ -13,7 +13,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -53,7 +52,7 @@ public class RequestInfoControllerV1 extends UpdateBoolServiceController save(@RequestBody @NonNull RequestInfo requestInfo) { + public R save(@RequestBody @Valid @NonNull RequestInfo requestInfo) { return super.save(requestInfo); } @@ -80,19 +79,12 @@ public class RequestInfoControllerV1 extends UpdateBoolServiceController uw = new LambdaUpdateWrapper<>(); - uw.in(RequestInfo::getId, idArray); - switch (op) { - default: - throw RException.badRequest("未知操作"); - } + + throw RException.badRequest("未知操作"); } private static enum RequestInfoBatchOp { - DELETE, - ENABLE_ANONYMOUS, - DISABLE_ANONYMOUS + DELETE } } diff --git a/src/main/java/quant/rich/emoney/entity/sqlite/RequestInfo.java b/src/main/java/quant/rich/emoney/entity/sqlite/RequestInfo.java index 0205eaa..9c005c9 100644 --- a/src/main/java/quant/rich/emoney/entity/sqlite/RequestInfo.java +++ b/src/main/java/quant/rich/emoney/entity/sqlite/RequestInfo.java @@ -4,7 +4,6 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; @@ -12,10 +11,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Setter; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; import quant.rich.emoney.entity.config.AndroidSdkLevelConfig; @@ -28,15 +25,21 @@ import quant.rich.emoney.util.TextUtils; import quant.rich.emoney.validator.RequestInfoValid; /** - * 用于配置请求时的请求行为,一般而言,请求头与安卓系统的信息有关(build.prop) - * 虽然部分请求对应服务器可能不进行审核,但合理的请求头能尽可能模仿真机行为,避免风险 - * @see DeviceInfoConfig - * @see AndroidSdkLevelConfig - * @see ChromeVersionsConfig + * 请求信息 + *

+ * 用于配置请求时的参数,包括请求头等。若使用该请求头登录成功,则将会存储鉴权信息。 + * + * 一般而言,请求头与系统的信息有关(build.prop) + * 虽然服务器可能不进行请求头审核,但合理的请求头能尽可能模仿真机行为,避免风险。 *

* SQLite 表 request_info 使用触发器维护默认请求配置的一致性:新增或更新 is_default = 1 * 时会把其他记录置为非默认;不允许把最后一条默认请求配置改为非默认,也不允许删除默认请求配置。 - * 这部分约束不在 Java 代码里重复实现,调整表结构或导入数据时需要同步检查触发器。 + * 这部分约束不在 Java 代码里重复实现,调整表结构或导入数据时需要同步检查触发器。 + * + * @see DeviceInfoConfig + * @see AndroidSdkLevelConfig + * @see ChromeVersionsConfig + * @See RequestInfoValidator */ @Data @EqualsAndHashCode(callSuper=false) @@ -113,9 +116,10 @@ public class RequestInfo extends Model { * @see DeviceInfoConfig * @see DeviceInfo */ - @Setter(AccessLevel.PRIVATE) - @TableField(exist=false) - private String androidVersion; + public String getAndroidVersion() { + DeviceInfo deviceInfo = getDeviceInfo(); + return deviceInfo == null ? null : deviceInfo.getVersionRelease(); + } /** * 用于:

    @@ -127,9 +131,13 @@ public class RequestInfo extends Model { * @see DeviceInfo * @see AndroidSdkLevelConfig */ - @Setter(AccessLevel.PRIVATE) - @TableField(exist=false) - private String androidSdkLevel; + public String getAndroidSdkLevel() { + String androidVersion = getAndroidVersion(); + if (StringUtils.isBlank(androidVersion)) { + return null; + } + return String.valueOf(androidSdkLevelConfig.getSdkLevel(androidVersion)); + } /** * 用于:
      @@ -183,8 +191,10 @@ public class RequestInfo extends Model { * @see DeviceInfoConfig * */ - @TableField(exist=false) - private String buildId; + public String getBuildId() { + DeviceInfo deviceInfo = getDeviceInfo(); + return deviceInfo == null ? null : deviceInfo.getBuildId(); + } /** * 用于:
        @@ -218,21 +228,29 @@ public class RequestInfo extends Model { /** * 从 deviceInfo 设置相关字段 * @param deviceInfo - * @return + * @return 更新过的 RequestInfo 本身 */ public RequestInfo setRelativeFieldsFromDeviceInfo(DeviceInfo deviceInfo) { if (deviceInfo == null) { throw new NullPointerException("deviceInfo is null"); } deviceName = deviceInfo.getModel(); - androidVersion = deviceInfo.getVersionRelease(); - androidSdkLevel = String.valueOf(androidSdkLevelConfig.getSdkLevel(androidVersion)); softwareType = deviceInfo.getDeviceType(); fingerprint = deviceInfo.getFingerprint(); - buildId = deviceInfo.getBuildId(); return this; } + /** + * @return 获取由相应字段指定的 DeviceInfo + */ + @JsonIgnore + private DeviceInfo getDeviceInfo() { + if (ObjectUtils.anyNull(deviceName, fingerprint, softwareType)) { + return null; + } + return DeviceInfo.from(deviceName, fingerprint, softwareType); + } + /** * 设置密码:
          *
        • null or empty,保存空字符串
        • @@ -264,13 +282,7 @@ public class RequestInfo extends Model { * @see RequestInfo#setRelativeFieldsFromDeviceInfo */ public RequestInfo setFingerprint(String fingerprint) { - if (ObjectUtils.allNotNull(deviceName, softwareType, fingerprint, androidSdkLevelConfig)) { - DeviceInfo deviceInfo = DeviceInfo.from(deviceName, fingerprint, softwareType); - setRelativeFieldsFromDeviceInfo(deviceInfo); - } - else { - this.fingerprint = fingerprint; - } + this.fingerprint = fingerprint; return this; } diff --git a/src/main/java/quant/rich/emoney/service/sqlite/RequestInfoService.java b/src/main/java/quant/rich/emoney/service/sqlite/RequestInfoService.java index 3cd6efb..ee13ea3 100644 --- a/src/main/java/quant/rich/emoney/service/sqlite/RequestInfoService.java +++ b/src/main/java/quant/rich/emoney/service/sqlite/RequestInfoService.java @@ -44,6 +44,7 @@ public class RequestInfoService extends SqliteServiceImpl[] groups() default {}; Class[] payload() default {}; } diff --git a/src/main/java/quant/rich/emoney/validator/RequestInfoValidator.java b/src/main/java/quant/rich/emoney/validator/RequestInfoValidator.java index 8433a61..5e65340 100644 --- a/src/main/java/quant/rich/emoney/validator/RequestInfoValidator.java +++ b/src/main/java/quant/rich/emoney/validator/RequestInfoValidator.java @@ -10,6 +10,9 @@ import quant.rich.emoney.entity.config.DeviceInfoConfig; import quant.rich.emoney.entity.sqlite.RequestInfo; import quant.rich.emoney.interfaces.IValidator; +/** + * RequestInfo 校验器 + */ public class RequestInfoValidator implements IValidator, ConstraintValidator { static final Pattern androidIdPattern = Pattern.compile("^[0-9a-f]{16}$"); diff --git a/src/main/resources/webpage/admin/v1/manage/requestInfo/include.html b/src/main/resources/webpage/admin/v1/manage/requestInfo/include.html index 508419f..e55b91b 100644 --- a/src/main/resources/webpage/admin/v1/manage/requestInfo/include.html +++ b/src/main/resources/webpage/admin/v1/manage/requestInfo/include.html @@ -158,7 +158,7 @@ } else { $(non).children('label').children('span').remove(); - $(non).find('lay-verify').removeAttr('lay-verify'); + $(non).find('[lay-verify]').removeAttr('lay-verify'); } }); }); diff --git a/src/main/resources/webpage/admin/v1/manage/requestInfo/index.html b/src/main/resources/webpage/admin/v1/manage/requestInfo/index.html index e1a0a7e..e9a12c3 100644 --- a/src/main/resources/webpage/admin/v1/manage/requestInfo/index.html +++ b/src/main/resources/webpage/admin/v1/manage/requestInfo/index.html @@ -58,9 +58,7 @@ Helper.renderDropdown({ elem: '.operdown', data: [ - {title: '删除', op: 'DELETE'}, - {title: '开启匿名', op: 'ENABLE_ANONYMOUS'}, - {title: '关闭匿名', op: 'DISABLE_ANONYMOUS'}], + {title: '删除', op: 'DELETE'}], tableFilter: 'requestInfos', url: '/admin/v1/manage/requestInfo/batchOp', idName: 'id'