feat: 重构用户列表查询,支持通过手机号和用户名搜索

This commit is contained in:
2025-12-20 21:27:48 +08:00
parent 80b94739c0
commit 3313c3aa7d
4 changed files with 32 additions and 27 deletions

View File

@@ -0,0 +1,8 @@
package dto
import "quyun/v2/app/requests"
type UserListQuery struct {
*requests.Pagination
Keyword *string `query:"keyword"`
}

View File

@@ -162,10 +162,9 @@ func (r *Routes) Register(router fiber.Router) {
)) ))
// Register routes for controller: users // Register routes for controller: users
r.log.Debugf("Registering route: Get /admin/v1/users -> users.List") r.log.Debugf("Registering route: Get /admin/v1/users -> users.List")
router.Get("/admin/v1/users"[len(r.Path()):], DataFunc2( router.Get("/admin/v1/users"[len(r.Path()):], DataFunc1(
r.users.List, r.users.List,
Query[requests.Pagination]("pagination"), Query[dto.UserListQuery]("query"),
Query[UserListQuery]("query"),
)) ))
r.log.Debugf("Registering route: Get /admin/v1/users/:id -> users.Show") r.log.Debugf("Registering route: Get /admin/v1/users/:id -> users.Show")
router.Get("/admin/v1/users/:id"[len(r.Path()):], DataFunc1( router.Get("/admin/v1/users/:id"[len(r.Path()):], DataFunc1(

View File

@@ -1,19 +1,14 @@
package admin package admin
import ( import (
"quyun/v2/app/http/admin/dto"
"quyun/v2/app/requests" "quyun/v2/app/requests"
"quyun/v2/app/services" "quyun/v2/app/services"
"quyun/v2/database"
"quyun/v2/database/models" "quyun/v2/database/models"
"github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3"
"go.ipao.vip/gen"
) )
type UserListQuery struct {
Keyword *string `query:"keyword"`
}
// @provider // @provider
type users struct{} type users struct{}
@@ -22,20 +17,12 @@ type users struct{}
// @Summary 用户列表 // @Summary 用户列表
// @Tags Admin Users // @Tags Admin Users
// @Produce json // @Produce json
// @Param pagination query requests.Pagination false "分页参数"
// @Param query query UserListQuery false "筛选条件" // @Param query query UserListQuery false "筛选条件"
// @Success 200 {object} requests.Pager{items=models.User} "成功" // @Success 200 {object} requests.Pager{items=models.User} "成功"
// @Router /admin/v1/users [get] // @Router /admin/v1/users [get]
// @Bind pagination query
// @Bind query query // @Bind query query
func (ctl *users) List(ctx fiber.Ctx, pagination *requests.Pagination, query *UserListQuery) (*requests.Pager, error) { func (ctl *users) List(ctx fiber.Ctx, query *dto.UserListQuery) (*requests.Pager, error) {
conds := []gen.Condition{} return services.Users.List(ctx, query)
if query.Keyword != nil && *query.Keyword != "" {
conds = append(conds,
models.UserQuery.Phone.Like(database.WrapLike(*query.Keyword)),
)
}
return services.Users.List(ctx, pagination, conds...)
} }
// Show user // Show user

View File

@@ -5,11 +5,14 @@ import (
"crypto/rand" "crypto/rand"
"fmt" "fmt"
"math/big" "math/big"
"strconv"
"strings" "strings"
"sync" "sync"
"time" "time"
"quyun/v2/app/http/admin/dto"
"quyun/v2/app/requests" "quyun/v2/app/requests"
"quyun/v2/database"
"quyun/v2/database/models" "quyun/v2/database/models"
"github.com/pkg/errors" "github.com/pkg/errors"
@@ -38,16 +41,24 @@ func (m *users) Prepare() error {
// List returns a paginated list of users // List returns a paginated list of users
func (m *users) List( func (m *users) List(
ctx context.Context, ctx context.Context,
pagination *requests.Pagination, filter *dto.UserListQuery,
conds ...gen.Condition,
) (*requests.Pager, error) { ) (*requests.Pager, error) {
pagination.Format() filter.Pagination.Format()
tbl, query := models.UserQuery.QueryContext(ctx) tbl, query := models.UserQuery.QueryContext(ctx)
items, cnt, err := query. query = query.Order(tbl.ID.Desc())
Where(conds...).
Order(tbl.ID.Desc()). if filter.Keyword != nil && *filter.Keyword != "" {
FindByPage(int(pagination.Offset()), int(pagination.Limit)) query = query.
Where(tbl.Phone.Like(database.WrapLike(*filter.Keyword))).
Or(tbl.Username.Like(database.WrapLike(*filter.Keyword)))
if id, err := strconv.ParseInt(strings.TrimSpace(*filter.Keyword), 10, 64); err == nil && id > 0 {
query = query.Or(tbl.ID.Eq(id))
}
}
items, cnt, err := query.FindByPage(int(filter.Pagination.Offset()), int(filter.Pagination.Limit))
if err != nil { if err != nil {
return nil, errors.Wrap(err, "query users error") return nil, errors.Wrap(err, "query users error")
} }
@@ -55,7 +66,7 @@ func (m *users) List(
return &requests.Pager{ return &requests.Pager{
Items: items, Items: items,
Total: cnt, Total: cnt,
Pagination: *pagination, Pagination: *filter.Pagination,
}, nil }, nil
} }