Files
nl-video-api/internal/dao/user.go
2025-08-03 00:11:15 +08:00

357 lines
8.9 KiB
Go

package dao
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"nl-video-api/internal/model/entity"
)
// UserDao 用户数据访问对象
type UserDao struct {
table string
group string
columns UserColumns
}
// UserColumns 用户表字段
type UserColumns struct {
Id string
Username string
Phone string
Email string
Password string
Nickname string
Avatar string
Gender string
Birthday string
VipLevel string
VipExpireAt string
Balance string
Points string
Status string
LastLoginAt string
LastLoginIp string
CreatedAt string
UpdatedAt string
DeletedAt string
}
// UserListReq 用户列表请求
type UserListReq struct {
Page int `json:"page" d:"1"`
PageSize int `json:"page_size" d:"20"`
Username string `json:"username"`
Phone string `json:"phone"`
Email string `json:"email"`
Status int `json:"status"`
VipLevel int `json:"vip_level"`
Gender int `json:"gender"`
StartTime string `json:"start_time"`
EndTime string `json:"end_time"`
}
// userDao 用户DAO实例
var userDao = UserDao{
table: "nl_user",
group: "default",
columns: UserColumns{
Id: "id",
Username: "username",
Phone: "phone",
Email: "email",
Password: "password",
Nickname: "nickname",
Avatar: "avatar",
Gender: "gender",
Birthday: "birthday",
VipLevel: "vip_level",
VipExpireAt: "vip_expire_at",
Balance: "balance",
Points: "points",
Status: "status",
LastLoginAt: "last_login_at",
LastLoginIp: "last_login_ip",
CreatedAt: "created_at",
UpdatedAt: "updated_at",
DeletedAt: "deleted_at",
},
}
// NewUserDao 创建用户DAO实例
func NewUserDao() *UserDao {
return &userDao
}
// Create 创建用户
func (dao *UserDao) Create(ctx context.Context, data *entity.NlUser) (int64, error) {
data.CreatedAt = int(gtime.Now().Unix())
data.UpdatedAt = int(gtime.Now().Unix())
result, err := g.DB(dao.group).Model(dao.table).Data(data).Insert()
if err != nil {
return 0, err
}
id, err := result.LastInsertId()
return id, err
}
// GetById 根据ID获取用户
func (dao *UserDao) GetById(ctx context.Context, id int) (*entity.NlUser, error) {
var user *entity.NlUser
err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.Id, id).
Where(dao.columns.DeletedAt, 0).
Scan(&user)
return user, err
}
// GetByUsername 根据用户名获取用户
func (dao *UserDao) GetByUsername(ctx context.Context, username string) (*entity.NlUser, error) {
var user *entity.NlUser
err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.Username, username).
Where(dao.columns.DeletedAt, 0).
Scan(&user)
return user, err
}
// GetByPhone 根据手机号获取用户
func (dao *UserDao) GetByPhone(ctx context.Context, phone string) (*entity.NlUser, error) {
var user *entity.NlUser
err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.Phone, phone).
Where(dao.columns.DeletedAt, 0).
Scan(&user)
return user, err
}
// GetByEmail 根据邮箱获取用户
func (dao *UserDao) GetByEmail(ctx context.Context, email string) (*entity.NlUser, error) {
var user *entity.NlUser
err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.Email, email).
Where(dao.columns.DeletedAt, 0).
Scan(&user)
return user, err
}
// Update 更新用户
func (dao *UserDao) Update(ctx context.Context, id int, data g.Map) error {
data[dao.columns.UpdatedAt] = gtime.Now().Unix()
_, err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.Id, id).
Where(dao.columns.DeletedAt, 0).
Data(data).
Update()
return err
}
// Delete 删除用户(软删除)
func (dao *UserDao) Delete(ctx context.Context, id int) error {
_, err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.Id, id).
Data(g.Map{
dao.columns.DeletedAt: gtime.Now().Unix(),
dao.columns.UpdatedAt: gtime.Now().Unix(),
}).
Update()
return err
}
// GetList 获取用户列表
func (dao *UserDao) GetList(ctx context.Context, req *UserListReq) ([]*entity.NlUser, int, error) {
model := g.DB(dao.group).Model(dao.table).Where(dao.columns.DeletedAt, 0)
// 添加查询条件
if req.Username != "" {
model = model.WhereLike(dao.columns.Username, "%"+req.Username+"%")
}
if req.Phone != "" {
model = model.WhereLike(dao.columns.Phone, "%"+req.Phone+"%")
}
if req.Email != "" {
model = model.WhereLike(dao.columns.Email, "%"+req.Email+"%")
}
if req.Status >= 0 {
model = model.Where(dao.columns.Status, req.Status)
}
if req.VipLevel > 0 {
model = model.Where(dao.columns.VipLevel, req.VipLevel)
}
if req.Gender >= 0 {
model = model.Where(dao.columns.Gender, req.Gender)
}
if req.StartTime != "" {
model = model.WhereGTE(dao.columns.CreatedAt, gtime.NewFromStr(req.StartTime).Unix())
}
if req.EndTime != "" {
model = model.WhereLTE(dao.columns.CreatedAt, gtime.NewFromStr(req.EndTime).Unix())
}
// 获取总数
total, err := model.Count()
if err != nil {
return nil, 0, err
}
// 分页查询
var users []*entity.NlUser
err = model.Page(req.Page, req.PageSize).
OrderDesc(dao.columns.CreatedAt).
Scan(&users)
return users, total, err
}
// BatchUpdateStatus 批量更新用户状态
func (dao *UserDao) BatchUpdateStatus(ctx context.Context, ids []int, status int) error {
_, err := g.DB(dao.group).Model(dao.table).
WhereIn(dao.columns.Id, ids).
Where(dao.columns.DeletedAt, 0).
Data(g.Map{
dao.columns.Status: status,
dao.columns.UpdatedAt: gtime.Now().Unix(),
}).
Update()
return err
}
// BatchDelete 批量删除用户
func (dao *UserDao) BatchDelete(ctx context.Context, ids []int) error {
_, err := g.DB(dao.group).Model(dao.table).
WhereIn(dao.columns.Id, ids).
Data(g.Map{
dao.columns.DeletedAt: gtime.Now().Unix(),
dao.columns.UpdatedAt: gtime.Now().Unix(),
}).
Update()
return err
}
// GetUserStats 获取用户统计信息
func (dao *UserDao) GetUserStats(ctx context.Context) (g.Map, error) {
// 总用户数
totalUsers, err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.DeletedAt, 0).
Count()
if err != nil {
return nil, err
}
// 活跃用户数
activeUsers, err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.DeletedAt, 0).
Where(dao.columns.Status, 1).
Count()
if err != nil {
return nil, err
}
// VIP用户数
vipUsers, err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.DeletedAt, 0).
Where(dao.columns.VipLevel+" > ?", 1).
Count()
if err != nil {
return nil, err
}
// 今日新增用户
todayStart := gtime.Now().StartOfDay().Unix()
todayUsers, err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.DeletedAt, 0).
WhereGTE(dao.columns.CreatedAt, todayStart).
Count()
if err != nil {
return nil, err
}
return g.Map{
"total_users": totalUsers,
"active_users": activeUsers,
"vip_users": vipUsers,
"today_users": todayUsers,
}, nil
}
// UpdateLoginInfo 更新登录信息
func (dao *UserDao) UpdateLoginInfo(ctx context.Context, id int, ip string) error {
_, err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.Id, id).
Data(g.Map{
dao.columns.LastLoginAt: gtime.Now().Unix(),
dao.columns.LastLoginIp: ip,
dao.columns.UpdatedAt: gtime.Now().Unix(),
}).
Update()
return err
}
// GetVipUsers 获取VIP用户列表
func (dao *UserDao) GetVipUsers(ctx context.Context, page, pageSize int) ([]*entity.NlUser, int, error) {
model := g.DB(dao.group).Model(dao.table).
Where(dao.columns.DeletedAt, 0).
Where(dao.columns.VipLevel+" > ?", 1)
// 获取总数
total, err := model.Count()
if err != nil {
return nil, 0, err
}
// 分页查询
var users []*entity.NlUser
err = model.Page(page, pageSize).
OrderDesc(dao.columns.VipLevel).
OrderDesc(dao.columns.VipExpireAt).
Scan(&users)
return users, total, err
}
// GetExpiredVipUsers 获取VIP即将过期的用户
func (dao *UserDao) GetExpiredVipUsers(ctx context.Context, days int) ([]*entity.NlUser, error) {
expireTime := gtime.Now().AddDate(0, 0, days).Unix()
var users []*entity.NlUser
err := g.DB(dao.group).Model(dao.table).
Where(dao.columns.DeletedAt, 0).
Where(dao.columns.VipLevel+" > ?", 1).
Where(dao.columns.VipExpireAt+" <= ?", expireTime).
Where(dao.columns.VipExpireAt+" > ?", gtime.Now().Unix()).
Scan(&users)
return users, err
}
// SearchUsers 搜索用户
func (dao *UserDao) SearchUsers(ctx context.Context, keyword string, page, pageSize int) ([]*entity.NlUser, int, error) {
model := g.DB(dao.group).Model(dao.table).
Where(dao.columns.DeletedAt, 0).
Where(g.Map{
dao.columns.Username + " LIKE ? OR " + dao.columns.Phone + " LIKE ? OR " + dao.columns.Email + " LIKE ?": []interface{}{
"%" + keyword + "%",
"%" + keyword + "%",
"%" + keyword + "%",
},
})
// 获取总数
total, err := model.Count()
if err != nil {
return nil, 0, err
}
// 分页查询
var users []*entity.NlUser
err = model.Page(page, pageSize).
OrderDesc(dao.columns.CreatedAt).
Scan(&users)
return users, total, err
}