diff --git a/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/controller/LogController.java b/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/controller/LogController.java index 93a9a39..3b28e62 100644 --- a/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/controller/LogController.java +++ b/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/controller/LogController.java @@ -147,9 +147,8 @@ public class LogController { @Operation(summary = "登录日志", description = "Query:`tenantId` `userId` `userType` `result` `from` `to` + 分页。" + "范围同操作日志(`log:viewAll` 可跨租户,学校管理员恒为本租户)。" - + "⚠️ 一期的登录日志**只有 PC 账号密码登录**(`loginType=PASSWORD`)—— " - + "学生从小程序/H5 进来走的是微信授权,目前不写这张表(见 F-31)。" - + "所以「学生登录记录为空」是已知情况,不是查询条件写错了") + + "登录方式 `loginType`:`PASSWORD`(PC 账号密码)/ `WECHAT`(学生从小程序、H5 走微信授权)。" + + "⚠️ `location`(IP 归属地)一期**恒为 null** —— 没接 IP 库,返回 null 而不是编一个") public ApiResult> logins( @RequestParam(required = false) Long tenantId, @RequestParam(required = false) Long userId, diff --git a/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/dto/LogDtos.java b/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/dto/LogDtos.java index 2df49a3..929dcf6 100644 --- a/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/dto/LogDtos.java +++ b/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/dto/LogDtos.java @@ -49,6 +49,25 @@ public final class LogDtos { private String userAgent; + /** + * 请求方法({@code GET} / {@code POST} / {@code PUT} / {@code DELETE})。 + * + *

与 {@link #requestUri}、{@link #extraJson} 一起是「日志详情」要用的三列 —— + * 它们都是**轻字段**(实测最大 45 / 125 字节级),所以列表直接带上, + * 不需要为详情再开一个按 id 查的接口。 + */ + private String requestMethod; + + /** 请求路径(不含 query string)。 */ + private String requestUri; + + /** + * 补充上下文(JSON 串),如批量操作命中的 id 列表 / 停用组织时的 {@code deactivated}。 + * + *

⚠️ 不是每一条都有(一期只有一部分动作带它)。 + */ + private String extraJson; + private Integer bizCode; private String traceId; @@ -74,11 +93,28 @@ public final class LogDtos { private Long id; + /** + * 登录者所属租户({@code 0} = 平台)。 + * + *

平台运营看到的登录日志是**跨单位**的,没有这一列就分不清一行是哪所学校的 —— + * 而"某个账号什么时候登进来的"这个问题,在平台视角下**一定**要连着"哪个单位"一起回答。 + * {@code sys_login_log.tenant_id} 本来就有(V2 建表时的 {@code NOT NULL DEFAULT 0}), + * 只是这个 VO 此前没把它带出来。 + */ + private Long tenantId; + private Long userId; private String userName; - /** 用户类型:1 超管 / 2 管理员 / 3 教师 / 4 学生 */ + /** + * 用户类型:{@code 1} 平台运营 / {@code 2} 学校管理员 / {@code 3} 班主任 / {@code 4} 学生。 + * + *

⚠️ 这里以前写的是「1 超管 / 2 管理员 / 3 教师 / 4 学生」,**是错的**。 + * 权威来源是 {@code BuiltinRole.UserType} 与 {@code UserService.USER_TYPE_NAMES}, + * 库列注释({@code sys_user.user_type})也与它们一致 —— + * 别按 `教师/学生` 那套去映射,本仓库曾因此把班主任当成社会人员拒掉过一次。 + */ private Integer userType; /** {@code PASSWORD} / {@code WECHAT} / {@code PHONE} */ diff --git a/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/mapper/LoginLogMapper.java b/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/mapper/LoginLogMapper.java index 9b34f4b..d570d53 100644 --- a/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/mapper/LoginLogMapper.java +++ b/backend/xt-server/src/main/java/cn/tianbaotong/fill/module/log/mapper/LoginLogMapper.java @@ -45,7 +45,7 @@ public interface LoginLogMapper extends BaseMapper { @InterceptorIgnore(tenantLine = "true") @Select("""