feat(用户管理): 添加最后登录时间和会员状态功能
Build docker and publish / build (20.15.1) (push) Successful in 4m57s

- 新增数据库迁移文件添加last_login_time字段
- 在登录逻辑中更新最后登录时间
- 添加FindActiveSubscribesByUserIds方法查询用户订阅状态
- 在用户列表接口中聚合最后登录时间和会员状态信息
- 更新相关API定义和模型结构
- 修复迁移文件版本号冲突问题
- 移除omitempty标签确保字段始终返回
This commit is contained in:
2026-01-05 01:46:39 -08:00
parent 5598181a48
commit 657c2930b1
13 changed files with 279 additions and 76 deletions
+6
View File
@@ -114,6 +114,12 @@ type customUserLogicModel interface {
QueryDailyUserStatisticsList(ctx context.Context, date time.Time) ([]UserStatisticsWithDate, error)
QueryMonthlyUserStatisticsList(ctx context.Context, date time.Time) ([]UserStatisticsWithDate, error)
FindActiveSubscribesByUserIds(ctx context.Context, userIds []int64) (map[int64]*UserStatusInfo, error)
}
type UserStatusInfo struct {
MemberStatus string
LastTrafficAt *time.Time
}
type UserStatisticsWithDate struct {
+45
View File
@@ -0,0 +1,45 @@
package user
import (
"context"
"time"
"gorm.io/gorm"
)
// FindActiveSubscribesByUserIds Find active subscriptions for multiple users
func (m *customUserModel) FindActiveSubscribesByUserIds(ctx context.Context, userIds []int64) (map[int64]*UserStatusInfo, error) {
if len(userIds) == 0 {
return map[int64]*UserStatusInfo{}, nil
}
type Result struct {
UserId int64
Name string
UpdatedAt *time.Time
}
var results []Result
// Query latest active subscription for each user
err := m.QueryNoCacheCtx(ctx, &results, func(conn *gorm.DB, v interface{}) error {
return conn.Table("user_subscribe").
Select("user_subscribe.user_id, subscribe.name, user_subscribe.updated_at").
Joins("LEFT JOIN subscribe ON user_subscribe.subscribe_id = subscribe.id").
Where("user_subscribe.user_id IN ? AND user_subscribe.status IN (0, 1) AND user_subscribe.expire_time > ?", userIds, time.Now()).
Order("user_subscribe.created_at ASC"). // Ascending so we can overwrite in map to get the latest
Scan(v).Error
})
if err != nil {
return nil, err
}
userMap := make(map[int64]*UserStatusInfo)
for _, r := range results {
userMap[r.UserId] = &UserStatusInfo{
MemberStatus: r.Name,
LastTrafficAt: r.UpdatedAt,
}
}
return userMap, nil
}
+1
View File
@@ -23,6 +23,7 @@ type User struct {
EnableLoginNotify *bool `gorm:"default:false;not null;comment:Enable Login Notifications"`
EnableSubscribeNotify *bool `gorm:"default:false;not null;comment:Enable Subscription Notifications"`
EnableTradeNotify *bool `gorm:"default:false;not null;comment:Enable Trade Notifications"`
LastLoginTime *time.Time `gorm:"comment:Last Login Time"`
AuthMethods []AuthMethods `gorm:"foreignKey:UserId;references:Id"`
UserDevices []Device `gorm:"foreignKey:UserId;references:Id"`
CreatedAt time.Time `gorm:"<-:create;comment:Creation Time"`