feat: 登录管理设备列表显示会话类型和剩余有效期
- 临时会话显示橙色'临时会话'徽章 - 非当前设备显示剩余有效时间(临时/长期均显示) - 当前设备不显示剩余时间(持续续期,显示无意义) - 新增 formatTTL 模板函数,分钟数转人类可读格式 - sessionConfig 接口增加 GetRememberTimeout 方法
This commit is contained in:
@ -3,6 +3,7 @@ package controller
|
||||
import (
|
||||
"io"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"metazone.cc/metalab/internal/common"
|
||||
"metazone.cc/metalab/internal/model"
|
||||
@ -33,17 +34,24 @@ type auditSubmittable interface {
|
||||
GetPendingTypes(userID uint) ([]string, error)
|
||||
}
|
||||
|
||||
// sessionConfig 登录管理对配置的最小依赖(ISP:2 个方法)
|
||||
type sessionConfig interface {
|
||||
GetIdleTimeout() int // 分钟
|
||||
GetRememberTimeout() int // 分钟
|
||||
}
|
||||
|
||||
// SettingsController 个人设置控制器
|
||||
type SettingsController struct {
|
||||
authService profileProvider
|
||||
avatarService avatarProvider
|
||||
auditService auditSubmittable
|
||||
sessionMgr sessionManager
|
||||
sessionCfg sessionConfig
|
||||
}
|
||||
|
||||
// NewSettingsController 构造函数
|
||||
func NewSettingsController(authService profileProvider, avatarService avatarProvider, auditService auditSubmittable, sessionMgr sessionManager) *SettingsController {
|
||||
return &SettingsController{authService: authService, avatarService: avatarService, auditService: auditService, sessionMgr: sessionMgr}
|
||||
func NewSettingsController(authService profileProvider, avatarService avatarProvider, auditService auditSubmittable, sessionMgr sessionManager, sessionCfg sessionConfig) *SettingsController {
|
||||
return &SettingsController{authService: authService, avatarService: avatarService, auditService: auditService, sessionMgr: sessionMgr, sessionCfg: sessionCfg}
|
||||
}
|
||||
|
||||
// SettingsPage 个人设置页面(需登录)
|
||||
@ -94,13 +102,24 @@ func (sc *SettingsController) SettingsPage(c *gin.Context) {
|
||||
*session.Session
|
||||
DeviceInfo session.DeviceInfo
|
||||
IsCurrent bool
|
||||
TTLMinutes int // 剩余有效分钟数(仅非当前设备显示)
|
||||
}
|
||||
var views []sessionView
|
||||
for _, s := range sessions {
|
||||
timeout := sc.sessionCfg.GetIdleTimeout() // 临时会话超时(分钟)
|
||||
if s.RememberMe {
|
||||
timeout = sc.sessionCfg.GetRememberTimeout() // 记住我超时(分钟)
|
||||
}
|
||||
elapsed := int(time.Since(s.LastAccess).Minutes())
|
||||
ttl := timeout - elapsed
|
||||
if ttl < 0 {
|
||||
ttl = 0
|
||||
}
|
||||
views = append(views, sessionView{
|
||||
Session: s,
|
||||
DeviceInfo: session.ParseUA(s.UserAgent),
|
||||
IsCurrent: s.ID == currentSID,
|
||||
TTLMinutes: ttl,
|
||||
})
|
||||
}
|
||||
data["Sessions"] = views
|
||||
|
||||
Reference in New Issue
Block a user