初始化v1
This commit is contained in:
356
internal/dao/user.go
Normal file
356
internal/dao/user.go
Normal file
@@ -0,0 +1,356 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user