feat: 添加用户统计功能,包括统计接口和相关数据结构
This commit is contained in:
@@ -13,7 +13,8 @@ type TenantFilter struct {
|
||||
requests.Pagination
|
||||
requests.SortQueryFilter
|
||||
|
||||
Name *string `json:"name,omitempty" query:"name"`
|
||||
Name *string `json:"name,omitempty" query:"name"`
|
||||
Status *string `json:"status,omitempty" query:"status"`
|
||||
}
|
||||
|
||||
type TenantItem struct {
|
||||
|
||||
@@ -11,6 +11,7 @@ type UserPageFilter struct {
|
||||
requests.SortQueryFilter
|
||||
|
||||
Username *string `query:"username"`
|
||||
Status *string `query:"status"`
|
||||
TenantID *int64 `query:"tenant_id"`
|
||||
}
|
||||
|
||||
@@ -23,3 +24,9 @@ type UserItem struct {
|
||||
type UserStatusUpdateForm struct {
|
||||
Status consts.UserStatus `json:"status" validate:"required,oneof=normal disabled"`
|
||||
}
|
||||
|
||||
type UserStatistics struct {
|
||||
Status consts.UserStatus `json:"status"`
|
||||
StatusDescription string `json:"status_description"`
|
||||
Count int64 `json:"count"`
|
||||
}
|
||||
|
||||
@@ -74,6 +74,10 @@ func (r *Routes) Register(router fiber.Router) {
|
||||
r.user.list,
|
||||
Query[dto.UserPageFilter]("filter"),
|
||||
))
|
||||
r.log.Debugf("Registering route: Get /super/v1/users/statistics -> user.statistics")
|
||||
router.Get("/super/v1/users/statistics", DataFunc0(
|
||||
r.user.statistics,
|
||||
))
|
||||
r.log.Debugf("Registering route: Get /super/v1/users/statuses -> user.statusList")
|
||||
router.Get("/super/v1/users/statuses", DataFunc0(
|
||||
r.user.statusList,
|
||||
|
||||
@@ -61,3 +61,18 @@ func (*user) statusList(ctx fiber.Ctx) ([]requests.KV, error) {
|
||||
return requests.NewKV(item.String(), item.Description())
|
||||
}), nil
|
||||
}
|
||||
|
||||
// statistics
|
||||
//
|
||||
// @Summary 用户统计信息
|
||||
// @Tags Super
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {array} dto.UserStatistics
|
||||
//
|
||||
// @Router /super/v1/users/statistics [get]
|
||||
// @Bind userID path
|
||||
// @Bind form body
|
||||
func (*user) statistics(ctx fiber.Ctx) ([]*dto.UserStatistics, error) {
|
||||
return services.User.Statistics(ctx)
|
||||
}
|
||||
|
||||
@@ -107,3 +107,19 @@ func (t *user) UpdateStatus(ctx context.Context, userID int64, status consts.Use
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Statistics
|
||||
func (t *user) Statistics(ctx context.Context) ([]*dto.UserStatistics, error) {
|
||||
tbl, query := models.UserQuery.QueryContext(ctx)
|
||||
|
||||
var statistics []*dto.UserStatistics
|
||||
err := query.Select(tbl.Status, tbl.ID.Count().As("count")).Group(tbl.Status).Scan(&statistics)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return lo.Map(statistics, func(item *dto.UserStatistics, _ int) *dto.UserStatistics {
|
||||
item.StatusDescription = item.Status.Description()
|
||||
return item
|
||||
}), nil
|
||||
}
|
||||
|
||||
@@ -261,3 +261,15 @@ func (t *UserTestSuite) Test_Relations() {
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func (t *UserTestSuite) Test_Statistics() {
|
||||
Convey("test page", t.T(), func() {
|
||||
Convey("filter tenant users", func() {
|
||||
m, err := User.Statistics(t.T().Context())
|
||||
So(err, ShouldBeNil)
|
||||
// So(m.OwnedTenant, ShouldNotBeNil)
|
||||
// So(m.Tenants, ShouldHaveLength, 10)
|
||||
t.T().Logf("%s", utils.MustJsonString(m))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user