跳到主要内容

System:登录、操作与访问审计

登录与操作审计​

业务流程与读写职责​

LoginLogServiceImpl.createLoginLog(service/logger/LoginLogServiceImpl.java:30)与 OperateLogServiceImpl.createOperateLog(同目录:29)写入审计记录,后台通过对应 Mapper 分页读取。result/log_type 表达身份验证或登出结果;type/sub_type/biz_id/action 表达对哪类对象做了什么操作。username 冗余值辅助解释历史账号,trace_id 支持关联跨服务事件,extra 保存业务扩展内容,不能把它当作其他表的结构定义。

对象关系与设计约定​

登录日志覆盖登录和退出事件;操作日志以 type/sub_type/biz_id 标记业务操作,以 user_id + user_type 标记主体。trace_id 可与其他服务日志做逻辑关联,不是数据库外键。biz_id 的目标随业务类型变化,不固定关联某一张表。

核验日期:2026-09-18。以下为源码预期结构,Java 类型不等同于 SQL 列型、长度、可空性或默认值。实际结构与索引见实测对照。各表继承字段已逐表展开;公共映射解释来源。下述关联均为代码逻辑关联,物理外键以实测为准。

system_login_log​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/LoginLogDO.java:20;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/LoginLogMapper.java:12。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long日志主键30
log_typelogType: Integer日志类型 枚举 LoginLogTypeEnum36
trace_idtraceId: String链路追踪编号40
user_iduserId: Long用户编号44
user_typeuserType: Integer用户类型 枚举 UserTypeEnum50
usernameusername: String用户账号 冗余,因为账号可以变更56
resultresult: Integer登录结果 枚举 LoginResultEnum62
user_ipuserIp: String用户 IP66
user_agentuserAgent: String浏览器 UA70
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(框架按 id 命名识别,实体未显式标注 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectPage()(13)。以上方法行号相对该表 Mapper。

system_operate_log​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogDO.java:15;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogMapper.java:12。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long日志主键;@TableId24
trace_idtraceId: String链路追踪编号 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。30
user_iduserId: Long用户编号 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性36
user_typeuserType: Integer用户类型 关联 UserTypeEnum42
typetype: String操作模块类型46
sub_typesubType: String操作名50
biz_idbizId: Long操作模块业务编号54
actionaction: String日志内容,记录整个操作的明细 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。60
extraextra: String拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ) 例如说,记录订单编号, orderId: "1"66
request_methodrequestMethod: String请求方法名71
request_urlrequestUrl: String请求地址75
user_ipuserIp: String用户 IP79
user_agentuserAgent: String浏览器 UA83
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectPage()(13)、selectPage()(24)。以上方法行号相对该表 Mapper。

返回 System 总览

分钟访问统计​

System 消费 TDengine monitor.visit_minute 做接口访问聚合。实体路径:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/visit/VisitMinuteDO.java:25。Mapper 路径:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/tdengine/visit/VisitMinuteMppaer.java:26,标注 @DS(DataSourceConstants.TD_API_VISIT),常量值为 tdApiVisit。Service 也在 service/visit/VisitMinuteServiceImpl.java:30 指定相同数据源。

doc/数据库设计管理/nacos/system-server.yaml:15 的 tdApiVisit 引用未在所给 datasource.yaml 中定义的 td_api_visit。Mapper SQL 从 34 行起显式使用 monitor.visit_minute;实测库来自统一采集补充,不视为服务启动配置验证。

实体与实测字段​

实测时间 2026-09-18T12:51:31.419241+00:00,TDengine 3.3.8.4。SQL 类型及 TAG/COMPOSITE KEY 来自 DESCRIBE;业务语义来自实体。

实库字段SQL 类型Java 字段 / 类型含义
tsTIMESTAMPts: Date统计时间戳,精确分钟
data_keyVARCHAR(300);COMPOSITE KEYdataKey: String和ts一起构成子表主键。为serverIp+domain
urlVARCHAR(200)url: String请求的原始接口
server_ipVARCHAR(20)serverIp: String请求的服务器IP
domainVARCHAR(255)domain: String请求的域名
visit_countINTvisitCount: int请求总次数
sucess_countINTsucessCount: int请求成功次数
fail_countINTfailCount: int请求失败次数
create_timeTIMESTAMPcreateTime: Date创建时间
portINTport: int请求的端口
url_aliasVARCHAR(200);TAGurlAlias: String请求的接口,tag字段
monthINT;TAGmonth: intmonth格式为202408,tag字段

tbname: String 是实体辅助字段和 TDengine 伪列,不是 DESCRIBE 返回的物理列;也未标注 exist=false。当前 Mapper 使用显式 SQL,不代表任意继承的 BaseMapper 通用写入都安全可用。

动态子表与查询语义​

  • 实体 getTbname()(125 行)计算 visit_minute + ("_" + url).replace(".", "_") + "_" + yyyyMM + "_v2"。该方法只替换点号;不要按旧注释补造 MAC、CPU 或包名规则。
  • getMonth() 从 ts 格式化 yyyyMM,ts 为空时返回 0;setTs() 取分钟起点。该命名算法是代码表达,未逐一验证 20 个现存子表名均由此算法生成。
  • data_key 实测为 COMPOSITE KEY;实体 getDataKey() 拼接 serverIp + "_" + domain + "_" + port,与 ts 一起表达时间与来源组合。
  • 字段名沿用源码与实库的 sucess_count(原有拼写);响应查询将其别名为 successCount。
  • Mapper 按时间范围、server_ip 查询,按 url_alias、域名、端口或服务器聚合,没有写表 SQL。System 侧源码不能单独证明外部统计生产者和建表流程。
  • 实测 1 个超级表、20 个子表、0 个普通表。TAG 为 url_alias、month;未采集独立 TAG 索引列表,不能以 DESCRIBE 推断全部索引策略。

完整实测结构 · 返回 System 总览

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答