소스 검색

feat: 分类列表

runningwater 6 달 전
부모
커밋
72bc8f0671

+ 14 - 0
app/http/controllers/api/v1/categories_controller.go

@@ -12,6 +12,20 @@ type CategoriesController struct {
 	BaseApiController
 }
 
+func (ctrl *CategoriesController) Index(c *gin.Context) {
+	request := requests.PaginationRequest{}
+	if ok := requests.Validate(c, &request, requests.Pagination); !ok {
+		return
+	}
+
+	data, pager := category.Paginate(c, 10)
+
+	response.JSON(c, gin.H{
+		"data":  data,
+		"pager": pager,
+	})
+}
+
 func (ctrl *CategoriesController) Save(c *gin.Context) {
 
 	request := requests.CategoryRequest{}

+ 1 - 1
app/http/controllers/api/v1/users_controller.go

@@ -28,7 +28,7 @@ func (ctrl *UsersController) Index(c *gin.Context) {
 		return
 	}
 	data, pager := user.Paginate(c, 2)
-	response.Data(c, gin.H{
+	response.JSON(c, gin.H{
 		"data":  data,
 		"pager": pager,
 	})

+ 24 - 0
database/factories/category_factory.go

@@ -0,0 +1,24 @@
+// Package factories 存放 category 工厂方法
+package factories
+
+import (
+	"github.com/bxcodec/faker/v4"
+
+	"github.com/runningwater/gohub/app/models/category"
+)
+
+func MakeCategories(times int) []category.Category {
+	var objs []category.Category
+
+	// 设置唯一值, 如 Category 模型中的某个字段需要唯一
+	faker.SetGenerateUniqueValues(true)
+
+	for range times {
+		model := category.Category{
+			Name:        faker.Username(),
+			Description: faker.Sentence(),
+		}
+		objs = append(objs, model)
+	}
+	return objs
+}

+ 31 - 0
database/seeders/category_seeder.go

@@ -0,0 +1,31 @@
+package seeders
+
+import (
+	"fmt"
+
+	"gorm.io/gorm"
+
+	"github.com/runningwater/gohub/database/factories"
+	"github.com/runningwater/gohub/pkg/console"
+	"github.com/runningwater/gohub/pkg/logger"
+	"github.com/runningwater/gohub/pkg/seed"
+)
+
+func init() {
+	// 添加 Seeder
+	seed.Add("CategoriesTableSeeder", func(db *gorm.DB) {
+		// 创建 100 个用户对象
+		categories := factories.MakeCategories(100)
+
+		// 批量插入到数据库
+		result := db.Table("categories").Create(&categories)
+
+		if err := result.Error; err != nil {
+			logger.LogIf(err)
+			return
+		}
+
+		// 打印成功信息
+		console.Success(fmt.Sprintf("Table [%v] %v rows seeded", result.Statement.Table, result.RowsAffected))
+	})
+}

+ 1 - 0
database/seeders/init.go

@@ -9,5 +9,6 @@ func Initialize() {
 	// 设置按顺序执行的 Seeder
 	seed.SetRunOrder([]string{
 		"UsersTableSeeder",
+		"CategoriesTableSeeder",
 	})
 }

+ 2 - 1
database/seeders/users_seeder.go

@@ -3,11 +3,12 @@ package seeders
 import (
 	"fmt"
 
+	"gorm.io/gorm"
+
 	"github.com/runningwater/gohub/database/factories"
 	"github.com/runningwater/gohub/pkg/console"
 	"github.com/runningwater/gohub/pkg/logger"
 	"github.com/runningwater/gohub/pkg/seed"
-	"gorm.io/gorm"
 )
 
 func init() {

+ 23 - 19
gohub.http

@@ -43,11 +43,11 @@ POST {{base_url}}/v1/auth/signup/using-phone HTTP/1.1
 Content-Type: application/json
 
 {
-    "name":"summer",
-    "password":"secret",
-    "password_confirm":"secret",
-    "verify_code": "439665",
-    "phone": "00011059149"
+  "name": "summer",
+  "password": "secret",
+  "password_confirm": "secret",
+  "verify_code": "439665",
+  "phone": "00011059149"
 }
 
 ### 注册用户
@@ -55,11 +55,11 @@ POST {{base_url}}/v1/auth/signup/using-email HTTP/1.1
 Content-Type: application/json
 
 {
-    "name":"summer3",
-    "password":"secret",
-    "password_confirm":"secret",
-    "verify_code": "123123",
-    "email": "summer3@testing.com"
+  "name": "summer3",
+  "password": "secret",
+  "password_confirm": "secret",
+  "verify_code": "123123",
+  "email": "summer3@testing.com"
 }
 
 ### 登录用户
@@ -67,10 +67,10 @@ POST {{base_url}}/v1/auth/login/using-password HTTP/1.1
 Content-Type: application/json
 
 {
-    "captcha_id" :"xTS6AtcgjUVABJj2M9NE",
-    "captcha_answer": "338750",
-    "login_id": "summer",
-    "password": "secret"
+  "captcha_id": "xTS6AtcgjUVABJj2M9NE",
+  "captcha_answer": "338750",
+  "login_id": "summer",
+  "password": "secret"
 }
 
 ### 刷新token
@@ -102,8 +102,8 @@ Authorization: Bearer {{access_token}}
 Content-Type: application/json
 
 {
-    "name": "分类1",
-    "description": "分类1描述"
+  "name": "分类1",
+  "description": "分类1描述"
 }
 
 ### 更新分类
@@ -112,15 +112,19 @@ Authorization: Bearer {{access_token}}
 Content-Type: application/json
 
 {
-    "name": "新分类名称",
-    "description": "分类1描述"
+  "name": "新分类名称",
+  "description": "分类1描述"
 }
 
+### 分类列表
+GET {{base_url}}/v1/categories?page=2&sort=id&order=asc&per_page=10 HTTP/1.1
+Content-Type: application/json
+
 ### 删除分类
 DELETE {{base_url}}/v1/categories HTTP/1.1
 Authorization: Bearer {{access_token}}
 Content-Type: application/json
 
 {
-    "id": 1
+  "id": 1
 }

+ 1 - 0
routes/api.go

@@ -62,6 +62,7 @@ func RegisterAPIRoutes(router *gin.Engine) {
 		cgc := new(controllers.CategoriesController)
 		categoryGroup := v1.Group("/categories")
 		{
+			categoryGroup.GET("", cgc.Index)
 			categoryGroup.POST("", middlewares.AuthJWT(), cgc.Save)
 			categoryGroup.PUT("/:id", middlewares.AuthJWT(), cgc.Update)
 		}