签入脚本

This commit is contained in:
小蚂蚁云
2026-10-20 11:37:25 +08:00
commit 7f5e8470af
909 changed files with 4045080 additions and 0 deletions
@@ -0,0 +1,142 @@
================================================================================
EasyGoAdmin 后端开发者文档 · 06 监控体系与在线用户
================================================================================
monitor 域共 7 个模块:operation_log、login_log、job、job_log(四张表)+
online_user、server_monitor、cache_monitor(三个无表模块)。
job/job_log 的调度机制见 09 章;本章聚焦监控与在线用户。
--------------------------------------------------------------------------------
1. 在线用户(logic/online_user.go,无表,数据源 Redis)
--------------------------------------------------------------------------------
1.1 数据结构(见 03 章第 10 节)
zset easygoadmin:online:jti:set score = 访问令牌过期时间戳
键 easygoadmin:online:info:{jti} JSON 详情(TTL = access 剩余期 + 60s)
onlineInfo 字段:jti/userId/username/realname/ip/location/oss/browser/
loginTime/issuedAt/expireAt/refreshJti/refreshIssuedAt/refreshExpireAt/
accessToken/refreshToken(令牌原文,仅详情查看返回)/tokenType/expiresIn
1.2 登记与注销
MarkOnline(登录成功、refresh 轮换后调用):写详情键 + ZAdd zset。
MarkOffline(登出、强退后调用):ZRem + Del。
过期令牌由 zset score 区间过滤自然淘汰(查询只取 score ≥ now 的成员)。
1.3 接口
GET /api/onlineUser/page perm sys:onlineUser:page
流程:ZRangeByScore(now..+∞) → 逐 jti 读详情 → username/ip 子串过滤
→ 按登录时间倒序 → 同用户多会话标注(SessionNo/Sessions 序号与总数)
→ 批量回填头像(按 userId 查 user.avatar,GetFileUrl 补域名,单用户只查一次)
→ 内存分页(NewPageData)。
GET /api/onlineUser/detail/:id perm sys:onlineUser:detail
按 jti 返回完整信息(含令牌原文)。
GET /api/onlineUser/forceLogout/:id perm sys:onlineUser:forceLogout
单会话强退:access jti 拉黑(TTL=剩余期+60s)+ refresh jti 一并拉黑
(防被踢会话经 refresh 换新令牌复活)+ MarkOffline。
GET /api/onlineUser/forceLogoutUser/:userId 同权限
踢出该用户全部设备:遍历 zset 匹配 userId,逐会话双令牌拉黑 + 注销。
1.4 无心跳/续期机制:会话有效期即 access 令牌有效期(2h);
前端 refresh 轮换会刷新在线登记(MarkOnline 覆盖写)。
1.5 在线会话生命周期图
登录/refresh 成功
│ MarkOnline
▼
┌─────────────────────────────────────────────┐
│ zset easygoadmin:online:jti:set │ score=access过期ts
│ 键 easygoadmin:online:info:{jti} = JSON │ TTL=access剩余+60s
└──────────────────┬──────────────────────────┘
页面访问(有效期内)│ │登出 Logout / 强退 ForceLogout
(token 有效,│ ▼ MarkOffline + access/refresh 双拉黑
JWT 放行) │ zset 移除 + info 删除 → 会话消失
▼
access 到期:zset score < now 被区间过滤(列表不可见);
info 键 TTL 到期自动清除
refresh 到期:无法再换新令牌
查询视图(Page)= zset(score≥now) × info 详情 × username/ip 过滤 × 内存分页
--------------------------------------------------------------------------------
2. 服务器监控(logic/server_monitor.go + server_monitor_windows/other.go)
--------------------------------------------------------------------------------
GET /api/server/info(登录即可,log "服务器监控-查询信息")
返回 ServerInfoRes:
Server hostname / goVersion / arch / numCPU / goroutines / uptime
(procStart 为包加载时刻)
Mem allocMB / totalAllocMB / sysMB / heapAllocMB / heapSysMB /
heapObjects / gccycles(runtime.ReadMemStats,MB 保留两位小数)
Disk 平台分支实现:
windows(//go:build windows):GetDiskFreeSpaceEx 读工作目录所在盘符
(wd[:3] 如 "E:\"),返回 totalGB/freeGB/usedPercent
other(!windows):syscall.Statfs
Db SELECT VERSION() 计时(pingMs)+ 版本号;数据库不通不视为整体失败
(版本留空,err 置 nil 返回)
Cache cache.UsingMemory() → {mode:"memory", connected:false}
否则 Redis PING → {mode:"redis", connected:true/false}
Scheduler 调度器健康:统计 gcron 中 "job:" 前缀条目数(mounted)与
goframe_job status=1 计数(expected);enabled=DaemonInit 已执行;
healthy = mounted >= expected(挂载失败或数据被外部改动会出现差值)
--------------------------------------------------------------------------------
3. 缓存监控(logic/cache_monitor.go,无表)
--------------------------------------------------------------------------------
GET /api/cache/info(登录即可,log "缓存监控-查询信息")
内存降级(cache.UsingMemory())→ {mode:"memory", connected:false},仅返回模式标识。
Redis 模式:依次 INFO server/memory/stats/clients/keyspace + DBSIZE,
解析(parseRedisInfo:# 注释行跳过,k:v 映射):
version / uptime / usedMemory / usedMemoryPeak / maxMemory / fragRatio /
connectedClients / expiredKeys / evictedKeys / totalCommands / totalConns /
hits / misses / hitRate(hits/(hits+misses),两位小数)/ keys(DBSIZE)/
keySpace[](每 db 的 keys/expires)
任一 INFO 失败 → connected=false 返回已解析部分。
--------------------------------------------------------------------------------
4. 操作日志(表 goframe_operation_log,采集见 02 章)
--------------------------------------------------------------------------------
4.1 写入:中间件异步批量落库(LogSink),记录 Title/Type/Method/URL/Param(脱敏)/
Result(截断 8KB)/IP/Location/OS/Browser/ConsumeTime/Status/Error/CreateUser。
4.2 查询模块(/api/oper/log,仅 page/list/detail/delete/batchDelete,无增改):
perm sys:operLog:{page|list|detail|delete|batchDelete}。
4.3 log_type 固定枚举(consts/log_type.go,前端按此映射显示,数值勿改):
0=自动推断 1=新增 2=修改 3=删除 4=查询 5=导入 6=导出
7=审批 8=驳回 9=提交 10=撤回 11=关闭 12=开启 13=启用 14=禁用
15=上传 16=下载 17=发送 18=同步 19=代码生成 20=清空 21=还原
22=登录 23=登出 24=重置 25=分配 26=授权 27=执行 28=暂停 29=恢复
30=发布 31=下架 32=复制 33=移动 34=排序 35=锁定 36=解锁
37=归档 38=取消归档 39=绑定 40=解绑 99=其他
gmeta logType 字符串 → 枚举经 LogTypeMap;展示中文经 LogTypeNames
(logic 的 LogTypeText,该字段不走字典)。
4.4 清理:内置 LogClean 定时任务物理删除超保留期记录(见 09 章)。
--------------------------------------------------------------------------------
5. 登录日志(表 goframe_login_log,业务写入)
--------------------------------------------------------------------------------
写入方:logic/auth.go writeLoginLog——登录成功/失败(log_type=1,
失败 status=1 存 error,code 脱敏 ***)、退出(log_type=2)。
记录字段:username/log_type/source(0 后台)/method/request_method/url/param/
result(成功|失败)/ip/location(ip2region)/os/browser/consume_time/status/error。
查询模块:/api/login/log(page/list/detail/delete/batchDelete),
perm sys:loginLog:*;同样受 LogClean 清理。
--------------------------------------------------------------------------------
6. 任务日志(表 goframe_job_log)
--------------------------------------------------------------------------------
写入方:调度器 executeJob 每次执行后写入(create_user="daemon"):
job_id/job_name/job_group/job_trigger/job_message/cron_expression/status
(0 成功 1 失败)/start_time/end_time/consume_time(毫秒)/exception_info
查询模块:/api/job/log(page/list/detail/delete/batchDelete),perm sys:jobLog:*。
--------------------------------------------------------------------------------
7. 监控相关配置与运维入口
--------------------------------------------------------------------------------
operationLog.enable / operationLog.logQuery 操作日志开关(见 02 章)
job.logRetentionDays(默认 90) 三张日志表保留天数(LogClean 消费)
ip2region.path 归属地库路径
api.proxyIps 受信代理(影响 IP 与归属地准确性)
运维排障速查:
调度器异常 GET /api/job/daemonStatus(running/jobIds/startTime)
GET /api/server/info 的 Scheduler 字段(mounted vs expected)
缓存降级 GET /api/cache/info mode=memory(Redis 不可用,限流/锁退化单机)
在线人数 GET /api/onlineUser/page total
日志缺失 检查 operationLog.enable、通道满丢弃告警日志、LogSink 是否注册