feat: update admin
This commit is contained in:
@@ -54,16 +54,18 @@ func Provide(opts ...opt.Option) error {
|
||||
medias *medias,
|
||||
orders *orders,
|
||||
posts *posts,
|
||||
statistics *statistics,
|
||||
uploads *uploads,
|
||||
users *users,
|
||||
) (contracts.HttpRoute, error) {
|
||||
obj := &Routes{
|
||||
auth: auth,
|
||||
medias: medias,
|
||||
orders: orders,
|
||||
posts: posts,
|
||||
uploads: uploads,
|
||||
users: users,
|
||||
auth: auth,
|
||||
medias: medias,
|
||||
orders: orders,
|
||||
posts: posts,
|
||||
statistics: statistics,
|
||||
uploads: uploads,
|
||||
users: users,
|
||||
}
|
||||
if err := obj.Prepare(); err != nil {
|
||||
return nil, err
|
||||
@@ -73,6 +75,13 @@ func Provide(opts ...opt.Option) error {
|
||||
}, atom.GroupRoutes); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := container.Container.Provide(func() (*statistics, error) {
|
||||
obj := &statistics{}
|
||||
|
||||
return obj, nil
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := container.Container.Provide(func(
|
||||
app *app.Config,
|
||||
job *job.Job,
|
||||
|
||||
@@ -13,13 +13,14 @@ import (
|
||||
|
||||
// @provider contracts.HttpRoute atom.GroupRoutes
|
||||
type Routes struct {
|
||||
log *log.Entry `inject:"false"`
|
||||
auth *auth
|
||||
medias *medias
|
||||
orders *orders
|
||||
posts *posts
|
||||
uploads *uploads
|
||||
users *users
|
||||
log *log.Entry `inject:"false"`
|
||||
auth *auth
|
||||
medias *medias
|
||||
orders *orders
|
||||
posts *posts
|
||||
statistics *statistics
|
||||
uploads *uploads
|
||||
users *users
|
||||
}
|
||||
|
||||
func (r *Routes) Prepare() error {
|
||||
@@ -96,6 +97,11 @@ func (r *Routes) Register(router fiber.Router) {
|
||||
PathParam[int64]("userId"),
|
||||
))
|
||||
|
||||
// 注册路由组: statistics
|
||||
router.Get("/admin/statistics", DataFunc0(
|
||||
r.statistics.statistics,
|
||||
))
|
||||
|
||||
// 注册路由组: uploads
|
||||
router.Get("/admin/uploads/pre-uploaded-check/:md5.:ext", DataFunc3(
|
||||
r.uploads.PreUploadCheck,
|
||||
|
||||
61
backend/app/http/admin/statistics.go
Normal file
61
backend/app/http/admin/statistics.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"quyun/app/models"
|
||||
"quyun/database/fields"
|
||||
"quyun/database/schemas/public/table"
|
||||
|
||||
. "github.com/go-jet/jet/v2/postgres"
|
||||
"github.com/gofiber/fiber/v3"
|
||||
)
|
||||
|
||||
// @provider
|
||||
type statistics struct{}
|
||||
|
||||
type StatisticsResponse struct {
|
||||
PostDraft int64 `json:"post_draft"`
|
||||
PostPublished int64 `json:"post_published"`
|
||||
Media int64 `json:"media"`
|
||||
Order int64 `json:"order"`
|
||||
User int64 `json:"user"`
|
||||
Amount int64 `json:"amount"`
|
||||
}
|
||||
|
||||
// dashboard statistics
|
||||
// @Router /admin/statistics [get]
|
||||
func (s *statistics) statistics(ctx fiber.Ctx) (*StatisticsResponse, error) {
|
||||
statistics := &StatisticsResponse{}
|
||||
|
||||
var err error
|
||||
|
||||
statistics.PostDraft, err = models.Posts.Count(ctx.Context(), table.Posts.Status.EQ(Int(int64(fields.PostStatusDraft))))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
statistics.PostPublished, err = models.Posts.Count(ctx.Context(), table.Posts.Status.EQ(Int(int64(fields.PostStatusPublished))))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
statistics.Media, err = models.Medias.Count(ctx.Context())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
statistics.Order, err = models.Orders.Count(ctx.Context(), table.Orders.Status.EQ(Int(int64(fields.OrderStatusPaid))))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
statistics.User, err = models.Users.Count(ctx.Context(), BoolExp(Bool(true)))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
statistics.Amount, err = models.Orders.SumAmount(ctx.Context())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return statistics, nil
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
)
|
||||
|
||||
func (f *Middlewares) AuthAdmin(ctx fiber.Ctx) error {
|
||||
return ctx.Next()
|
||||
if !strings.HasPrefix(ctx.Path(), "/v1/admin") {
|
||||
return ctx.Next()
|
||||
}
|
||||
|
||||
@@ -257,3 +257,21 @@ func (m *mediasModel) GetRelations(ctx context.Context, hash string) ([]*model.M
|
||||
return &media
|
||||
}), nil
|
||||
}
|
||||
|
||||
// Count
|
||||
func (m *mediasModel) Count(ctx context.Context) (int64, error) {
|
||||
tbl := table.Medias
|
||||
stmt := tbl.SELECT(COUNT(tbl.ID).AS("count"))
|
||||
m.log.Infof("sql: %s", stmt.DebugSql())
|
||||
|
||||
var count struct {
|
||||
Count int64
|
||||
}
|
||||
|
||||
if err := stmt.QueryContext(ctx, db, &count); err != nil {
|
||||
m.log.Errorf("error counting media items: %v", err)
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return count.Count, nil
|
||||
}
|
||||
|
||||
@@ -203,3 +203,43 @@ func (m *ordersModel) SetStatus(ctx context.Context, orderNo string, status fiel
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Count
|
||||
func (m *ordersModel) Count(ctx context.Context, cond BoolExpression) (int64, error) {
|
||||
tbl := table.Orders
|
||||
stmt := SELECT(COUNT(tbl.ID).AS("cnt")).FROM(tbl).WHERE(cond)
|
||||
m.log.Infof("sql: %s", stmt.DebugSql())
|
||||
|
||||
var cnt struct {
|
||||
Cnt int64
|
||||
}
|
||||
|
||||
err := stmt.QueryContext(ctx, db, &cnt)
|
||||
if err != nil {
|
||||
m.log.Errorf("error counting orders: %v", err)
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return cnt.Cnt, nil
|
||||
}
|
||||
|
||||
// SumAmount
|
||||
func (m *ordersModel) SumAmount(ctx context.Context) (int64, error) {
|
||||
tbl := table.Orders
|
||||
stmt := SELECT(SUM(tbl.Price).AS("cnt")).FROM(tbl).WHERE(
|
||||
tbl.Status.EQ(Int(int64(fields.OrderStatusPaid))),
|
||||
)
|
||||
m.log.Infof("sql: %s", stmt.DebugSql())
|
||||
|
||||
var cnt struct {
|
||||
Cnt int64
|
||||
}
|
||||
|
||||
err := stmt.QueryContext(ctx, db, &cnt)
|
||||
if err != nil {
|
||||
m.log.Errorf("error summing order amount: %v", err)
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return cnt.Cnt, nil
|
||||
}
|
||||
|
||||
@@ -395,3 +395,21 @@ func (m *postsModel) GetMediaByIds(ctx context.Context, ids []int64) ([]model.Me
|
||||
|
||||
return medias, nil
|
||||
}
|
||||
|
||||
// Count
|
||||
func (m *postsModel) Count(ctx context.Context, cond BoolExpression) (int64, error) {
|
||||
tbl := table.Posts
|
||||
stmt := tbl.
|
||||
SELECT(COUNT(tbl.ID).AS("count")).
|
||||
WHERE(cond)
|
||||
|
||||
var count struct {
|
||||
Count int64
|
||||
}
|
||||
if err := stmt.QueryContext(ctx, db, &count); err != nil {
|
||||
m.log.Errorf("error counting posts: %v", err)
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return count.Count, nil
|
||||
}
|
||||
|
||||
@@ -310,3 +310,24 @@ func (m *usersModel) HasBought(ctx context.Context, userID, postID int64) (bool,
|
||||
|
||||
return userPost.ID > 0, nil
|
||||
}
|
||||
|
||||
// Count
|
||||
func (m *usersModel) Count(ctx context.Context, cond BoolExpression) (int64, error) {
|
||||
tbl := table.Users
|
||||
stmt := tbl.
|
||||
SELECT(COUNT(tbl.ID).AS("cnt")).
|
||||
WHERE(cond)
|
||||
|
||||
m.log.Infof("sql: %s", stmt.DebugSql())
|
||||
|
||||
var cnt struct {
|
||||
Cnt int64
|
||||
}
|
||||
|
||||
if err := stmt.QueryContext(ctx, db, &cnt); err != nil {
|
||||
m.log.Errorf("error counting users: %v", err)
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return cnt.Cnt, nil
|
||||
}
|
||||
|
||||
@@ -71,4 +71,8 @@ authorization: {{token}}
|
||||
|
||||
### get media url
|
||||
GET {{host}}/v1/admin/medias/6 HTTP/1.1
|
||||
Authorization: {{token}}
|
||||
|
||||
### get statistics
|
||||
GET {{host}}/v1/admin/statistics HTTP/1.1
|
||||
Authorization: {{token}}
|
||||
Reference in New Issue
Block a user