357 lines
8.9 KiB
Go
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
|
|
}
|