71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package api
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// 内存存储登录历史(临时方案,等Ent代码生成后改用数据库)
|
|
type LoginHistoryRecord struct {
|
|
Username string
|
|
IP string
|
|
Location string
|
|
UserAgent string
|
|
LoginTime time.Time
|
|
Success bool
|
|
}
|
|
|
|
var (
|
|
loginHistoryRecords []LoginHistoryRecord
|
|
loginHistoryMutex sync.RWMutex
|
|
maxLoginHistory = 1000 // 最多保存1000条登录记录
|
|
)
|
|
|
|
// 添加登录历史记录
|
|
func addLoginHistory(username, ip, location, userAgent string, success bool) {
|
|
loginHistoryMutex.Lock()
|
|
defer loginHistoryMutex.Unlock()
|
|
|
|
loginHistoryRecords = append(loginHistoryRecords, LoginHistoryRecord{
|
|
Username: username,
|
|
IP: ip,
|
|
Location: location,
|
|
UserAgent: userAgent,
|
|
LoginTime: time.Now(),
|
|
Success: success,
|
|
})
|
|
|
|
// 限制记录数量
|
|
if len(loginHistoryRecords) > maxLoginHistory {
|
|
loginHistoryRecords = loginHistoryRecords[len(loginHistoryRecords)-maxLoginHistory:]
|
|
}
|
|
}
|
|
|
|
// 获取登录历史记录
|
|
func getLoginHistoryRecords(limit int) []LoginHistoryRecord {
|
|
loginHistoryMutex.RLock()
|
|
defer loginHistoryMutex.RUnlock()
|
|
|
|
if limit <= 0 || limit > len(loginHistoryRecords) {
|
|
limit = len(loginHistoryRecords)
|
|
}
|
|
|
|
// 返回最后limit条记录(最新的)
|
|
start := len(loginHistoryRecords) - limit
|
|
if start < 0 {
|
|
start = 0
|
|
}
|
|
|
|
result := make([]LoginHistoryRecord, 0, limit)
|
|
for i := len(loginHistoryRecords) - 1; i >= start; i-- {
|
|
result = append(result, loginHistoryRecords[i])
|
|
}
|
|
|
|
// 反转顺序,使最新的在前
|
|
for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 {
|
|
result[i], result[j] = result[j], result[i]
|
|
}
|
|
|
|
return result
|
|
}
|