diff --git a/api/go/handler/admin/api_key_handler.go b/api/go/handler/admin/api_key_handler.go index 8cbe88a9..06dd4db9 100644 --- a/api/go/handler/admin/api_key_handler.go +++ b/api/go/handler/admin/api_key_handler.go @@ -8,9 +8,10 @@ import ( "chatplus/store/vo" "chatplus/utils" "chatplus/utils/resp" + "time" + "github.com/gin-gonic/gin" "gorm.io/gorm" - "time" ) type ApiKeyHandler struct { @@ -61,7 +62,7 @@ func (h *ApiKeyHandler) Save(c *gin.Context) { func (h *ApiKeyHandler) List(c *gin.Context) { userId := h.GetInt(c, "user_id", -1) - query := h.db.Debug().Session(&gorm.Session{}) + query := h.db.Session(&gorm.Session{}) if userId >= 0 { query = query.Where("user_id", userId) } diff --git a/api/go/handler/admin/user_handler.go b/api/go/handler/admin/user_handler.go index de9954d4..bbb8b90e 100644 --- a/api/go/handler/admin/user_handler.go +++ b/api/go/handler/admin/user_handler.go @@ -118,6 +118,32 @@ func (h *UserHandler) Remove(c *gin.Context) { resp.SUCCESS(c) } +func (h *UserHandler) LoginLog(c *gin.Context) { + page := h.GetInt(c, "page", 1) + pageSize := h.GetInt(c, "page_size", 20) + var total int64 + h.db.Model(&model.UserLoginLog{}).Count(&total) + offset := (page - 1) * pageSize + var items []model.UserLoginLog + res := h.db.Offset(offset).Limit(pageSize).Find(&items) + if res.Error != nil { + resp.ERROR(c, "获取数据失败") + return + } + var logs []vo.UserLoginLog + for _, v := range items { + var log vo.UserLoginLog + err := utils.CopyObject(v, &log) + if err == nil { + log.Id = v.Id + log.CreatedAt = v.CreatedAt.Unix() + logs = append(logs, log) + } + } + + resp.SUCCESS(c, vo.NewPage(total, page, pageSize, logs)) +} + func (h *UserHandler) InitUser(c *gin.Context) { var users []model.User h.db.Find(&users) diff --git a/api/go/main.go b/api/go/main.go index 5ff130ae..9d43fc3f 100644 --- a/api/go/main.go +++ b/api/go/main.go @@ -137,6 +137,7 @@ func main() { group.GET("list", h.List) group.POST("update", h.Update) group.GET("remove", h.Remove) + group.GET("loginLog", h.LoginLog) group.GET("test", h.InitUser) }), fx.Invoke(func(s *core.AppServer, h *admin.ChatRoleHandler) { diff --git a/api/go/store/vo/user_login_log.go b/api/go/store/vo/user_login_log.go new file mode 100644 index 00000000..b4a094aa --- /dev/null +++ b/api/go/store/vo/user_login_log.go @@ -0,0 +1,9 @@ +package vo + +type UserLoginLog struct { + BaseVo + UserId uint `json:"user_id"` + Username string `json:"username"` + LoginIp string `json:"login_ip"` + LoginAddress string `json:"login_address"` +} diff --git a/web/src/views/admin/Admin.vue b/web/src/views/admin/Admin.vue index 2213f8f1..80085bfe 100644 --- a/web/src/views/admin/Admin.vue +++ b/web/src/views/admin/Admin.vue @@ -87,6 +87,9 @@ + + + @@ -108,10 +111,10 @@ import {httpGet} from "@/utils/http"; import {ElMessage} from "element-plus"; import {useRouter} from "vue-router"; import ApiKey from "@/views/admin/ApiKey.vue"; +import LoginLog from "@/views/admin/LoginLog.vue"; const title = ref('Chat-Plus 控制台') const logo = ref('images/logo.png') -const user = ref({}) const navs = ref([ { id: 1, @@ -136,6 +139,12 @@ const navs = ref([ title: 'API KEY', tab: 'apikey', active: false, + }, + { + id: 5, + title: '登录日志', + tab: 'loginLog', + active: false, } ]) const tabs = ref([]) @@ -155,22 +164,22 @@ const nodeListPaddingLeft = computed(() => { }) const router = useRouter() -onMounted(() => { - window.addEventListener("resize", function () { - winHeight.value = window.innerHeight - }) - - // 获取会话信息 - httpGet("/api/admin/session").catch(() => { - router.push('/admin/login') - }) - +// 获取会话信息 +httpGet("/api/admin/session").then(() => { // 加载系统配置 httpGet('/api/admin/config/get?key=system').then(res => { title.value = res.data['admin_title']; }).catch(e => { ElMessage.error("加载系统配置失败: " + e.message) }) +}).catch(() => { + router.push('/admin/login') +}) + +onMounted(() => { + window.addEventListener("resize", function () { + winHeight.value = window.innerHeight + }) }) const logout = function () { @@ -354,3 +363,12 @@ $borderColor = #4676d0; + + diff --git a/web/src/views/admin/ApiKey.vue b/web/src/views/admin/ApiKey.vue index d6e3bd3a..84279894 100644 --- a/web/src/views/admin/ApiKey.vue +++ b/web/src/views/admin/ApiKey.vue @@ -1,11 +1,11 @@