Add files via upload
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user