用户同步
This commit is contained in:
@@ -3,7 +3,10 @@ package com.rj.service;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import com.rj.config.HxrAdminProperties;
|
||||
import com.rj.dto.hxr.HxrLbUserSelectResponse;
|
||||
import com.rj.dto.hxr.HxrSimpleApiResponse;
|
||||
import com.rj.dto.hxr.HxrUserRow;
|
||||
import com.rj.dto.hxr.HxrUserSelectResponse;
|
||||
@@ -33,10 +36,19 @@ import java.util.Optional;
|
||||
@RequiredArgsConstructor
|
||||
public class HxrAdminUserService {
|
||||
|
||||
/** 与后台 user/select 默认 limit 一致,用于判断是否还有下一页 */
|
||||
public static final int USER_SELECT_PAGE_SIZE = 90;
|
||||
|
||||
private static final ObjectMapper JSON = new ObjectMapper()
|
||||
.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
|
||||
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
|
||||
private static final ObjectMapper USER_JSON = new ObjectMapper()
|
||||
.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
|
||||
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
|
||||
.registerModule(new JavaTimeModule())
|
||||
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
||||
|
||||
private static final DateTimeFormatter VIP_TIME_FORMAT =
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
@@ -89,6 +101,61 @@ public class HxrAdminUserService {
|
||||
return LocalDateTime.of(applyDate.plusDays(calendarDays), now.toLocalTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页拉取用户列表,{@code data} 解析为 {@link LbUser}(与 lb_user 字段对应)。
|
||||
*
|
||||
* @param page 页码,从 1 开始
|
||||
*/
|
||||
public Optional<HxrLbUserSelectResponse> fetchUserSelectPage(int page) throws Exception {
|
||||
String cookieHeader = properties.resolveCookieHeader();
|
||||
if (cookieHeader == null || cookieHeader.isBlank()) {
|
||||
log.warn("hxr.admin 未配置 cookie 或 phpsid,跳过 user/select");
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
String uri = UriComponentsBuilder.fromUriString(properties.getUserSelectUrl())
|
||||
.replaceQueryParam("page", Math.max(1, page))
|
||||
.replaceQueryParam("limit", USER_SELECT_PAGE_SIZE)
|
||||
.replaceQueryParam("mobile", "")
|
||||
.replaceQueryParam("id", "")
|
||||
.replaceQueryParam("pid", "")
|
||||
.build()
|
||||
.encode()
|
||||
.toUriString();
|
||||
|
||||
HttpClient client = HttpClient.newBuilder()
|
||||
.connectTimeout(java.time.Duration.ofSeconds(35))
|
||||
.followRedirects(HttpClient.Redirect.NORMAL)
|
||||
.build();
|
||||
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(URI.create(uri))
|
||||
.timeout(java.time.Duration.ofSeconds(120))
|
||||
.header("Accept", "application/json, text/javascript, */*; q=0.01")
|
||||
.header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
|
||||
.header("Cookie", cookieHeader)
|
||||
.header("Priority", "u=1, i")
|
||||
.header("Referer", "https://hxrdhoutai.hxrdsm.cn/app/admin/user/index")
|
||||
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0")
|
||||
.GET()
|
||||
.build();
|
||||
|
||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
int status = response.statusCode();
|
||||
if (status < 200 || status >= 300) {
|
||||
log.warn("hxr admin user/select HTTP {} page={} bodyPrefix={}",
|
||||
status, page, abbreviate(response.body(), 400));
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
HxrLbUserSelectResponse body = USER_JSON.readValue(response.body(), HxrLbUserSelectResponse.class);
|
||||
if (body.code() != 0) {
|
||||
log.warn("hxr admin user/select api code={} msg={} page={}", body.code(), body.msg(), page);
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(body);
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用第三方接口
|
||||
* 按手机号查询用户列表,返回第一条。
|
||||
|
||||
Reference in New Issue
Block a user