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 }