feat: add user created_at and last_login_at

This commit is contained in:
feitianbubu
2026-04-25 12:41:14 +08:00
parent a7c38ec851
commit 02aacb38a2
3 changed files with 27 additions and 1 deletions
+1
View File
@@ -91,6 +91,7 @@ func Login(c *gin.Context) {
// setup session & cookies and then return user info
func setupLogin(user *model.User, c *gin.Context) {
model.UpdateUserLastLoginAt(user.Id)
session := sessions.Default(c)
session.Set("id", user.Id)
session.Set("username", user.Username)
+8
View File
@@ -50,6 +50,8 @@ type User struct {
Setting string `json:"setting" gorm:"type:text;column:setting"`
Remark string `json:"remark,omitempty" gorm:"type:varchar(255)" validate:"max=255"`
StripeCustomer string `json:"stripe_customer" gorm:"type:varchar(64);column:stripe_customer;index"`
CreatedAt int64 `json:"created_at" gorm:"autoCreateTime;column:created_at"`
LastLoginAt int64 `json:"last_login_at" gorm:"default:0;column:last_login_at"`
}
func (user *User) ToBaseUser() *UserBase {
@@ -951,6 +953,12 @@ func GetRootUser() (user *User) {
return user
}
func UpdateUserLastLoginAt(id int) {
if err := DB.Model(&User{}).Where("id = ?", id).Update("last_login_at", common.GetTimestamp()).Error; err != nil {
common.SysLog("failed to update user last_login_at: " + err.Error())
}
}
func UpdateUserUsedQuotaAndRequestCount(id int, quota int) {
if common.BatchUpdateEnabled {
addNewRecord(BatchUpdateTypeUsedQuota, id, quota)
@@ -29,7 +29,14 @@ import {
Dropdown,
} from '@douyinfe/semi-ui';
import { IconMore } from '@douyinfe/semi-icons';
import { renderGroup, renderNumber, renderQuota } from '../../../helpers';
import {
renderGroup,
renderNumber,
renderQuota,
timestamp2string,
} from '../../../helpers';
const renderTimestamp = (text) => (text ? timestamp2string(text) : '-');
/**
* Render user role
@@ -350,6 +357,16 @@ export const getUsersColumns = ({
dataIndex: 'invite',
render: (text, record, index) => renderInviteInfo(text, record, t),
},
{
title: t('创建时间'),
dataIndex: 'created_at',
render: renderTimestamp,
},
{
title: t('最后登录'),
dataIndex: 'last_login_at',
render: renderTimestamp,
},
{
title: '',
dataIndex: 'operate',