Files
infinite-canvas/repository/user.go
T
HouYunFei fff7074218 feat(admin): 添加管理员用户算力点管理和日志功能
- 在管理员API中新增用户算力点调整功能和信用日志相关接口
- 实现后端用户算力点调整逻辑和信用日志的增删改查操作
- 在管理员界面用户管理页面添加算力点调整功能
- 新增独立的算力点日志管理页面,支持日志查看和编辑
- 添加算力点日志相关的数据模型和服务函数
- 更新数据库文档说明第三方资料存储结构
- 添加dayjs依赖用于时间格式化显示
2026-05-25 12:57:27 +08:00

146 lines
3.5 KiB
Go

package repository
import (
"errors"
"strings"
"github.com/basketikun/infinite-canvas/model"
"gorm.io/gorm"
)
// ListUsers 分页查询用户。
func ListUsers(q model.Query) ([]model.User, int64, error) {
db, err := DB()
if err != nil {
return nil, 0, err
}
q.Normalize()
tx := db.Model(&model.User{})
if keyword := strings.TrimSpace(q.Keyword); keyword != "" {
like := "%" + keyword + "%"
tx = tx.Where("username LIKE ? OR display_name LIKE ? OR email LIKE ? OR linux_do_id LIKE ?", like, like, like, like)
}
var total int64
if err := tx.Count(&total).Error; err != nil {
return nil, 0, err
}
var users []model.User
err = tx.Order("created_at desc").Offset(q.Offset()).Limit(q.PageSize).Find(&users).Error
return users, total, err
}
// CountUsers 返回用户总数。
func CountUsers() (int64, error) {
db, err := DB()
if err != nil {
return 0, err
}
var total int64
return total, db.Model(&model.User{}).Count(&total).Error
}
// HasAdmin 判断系统中是否存在管理员。
func HasAdmin() (bool, error) {
db, err := DB()
if err != nil {
return false, err
}
var total int64
err = db.Model(&model.User{}).Where("role = ?", model.UserRoleAdmin).Count(&total).Error
return total > 0, err
}
// GetUserByID 根据 ID 查询用户。
func GetUserByID(id string) (model.User, bool, error) {
db, err := DB()
if err != nil {
return model.User{}, false, err
}
return findUser(db, "id = ?", id)
}
// GetUserByUsername 根据用户名查询用户。
func GetUserByUsername(username string) (model.User, bool, error) {
db, err := DB()
if err != nil {
return model.User{}, false, err
}
return findUser(db, "username = ?", username)
}
// SaveUser 保存用户信息。
func SaveUser(user model.User) (model.User, error) {
db, err := DB()
if err != nil {
return user, err
}
return user, db.Save(&user).Error
}
// SaveCreditLog 保存算力点变更流水。
func SaveCreditLog(log model.CreditLog) (model.CreditLog, error) {
db, err := DB()
if err != nil {
return log, err
}
return log, db.Save(&log).Error
}
func ListCreditLogs(q model.Query) ([]model.CreditLog, int64, error) {
db, err := DB()
if err != nil {
return nil, 0, err
}
q.Normalize()
tx := db.Model(&model.CreditLog{})
if keyword := strings.TrimSpace(q.Keyword); keyword != "" {
like := "%" + keyword + "%"
tx = tx.Where("user_id LIKE ? OR type LIKE ? OR remark LIKE ? OR related_id LIKE ?", like, like, like, like)
}
var total int64
if err := tx.Count(&total).Error; err != nil {
return nil, 0, err
}
var logs []model.CreditLog
err = tx.Order("created_at desc").Offset(q.Offset()).Limit(q.PageSize).Find(&logs).Error
return logs, total, err
}
func DeleteCreditLog(id string) error {
db, err := DB()
if err != nil {
return err
}
return db.Delete(&model.CreditLog{}, "id = ?", id).Error
}
// DeleteUser 删除指定用户。
func DeleteUser(id string) error {
db, err := DB()
if err != nil {
return err
}
return db.Delete(&model.User{}, "id = ?", id).Error
}
// GetUserByLinuxDoID 根据 Linux.do ID 查询用户。
func GetUserByLinuxDoID(id string) (model.User, bool, error) {
db, err := DB()
if err != nil {
return model.User{}, false, err
}
return findUser(db, "linux_do_id = ?", id)
}
// findUser 查询单个用户,并将未命中转换为 ok=false。
func findUser(db *gorm.DB, query string, args ...any) (model.User, bool, error) {
user := model.User{}
err := db.Where(query, args...).First(&user).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return model.User{}, false, nil
}
return user, err == nil, err
}