Browse Source

feat: 用户列表分页

runningwater 6 months ago
parent
commit
25f91e93a0

+ 6 - 2
app/http/controllers/api/v1/users_controller.go

@@ -20,6 +20,10 @@ func (ctrl *UsersController) CurrentUser(c *gin.Context) {
 
 
 // Index 所有用户
 // Index 所有用户
 func (ctrl *UsersController) Index(c *gin.Context) {
 func (ctrl *UsersController) Index(c *gin.Context) {
-	data := user.All()
-	response.Data(c, data)
+	// data := user.All()
+	data, pager := user.Paginate(c, 2)
+	response.Data(c, gin.H{
+		"data":  data,
+		"pager": pager,
+	})
 }
 }

+ 21 - 1
app/models/user/user_util.go

@@ -1,13 +1,21 @@
 package user
 package user
 
 
-import "github.com/runningwater/gohub/pkg/database"
+import (
+	"github.com/gin-gonic/gin"
 
 
+	"github.com/runningwater/gohub/pkg/app"
+	"github.com/runningwater/gohub/pkg/database"
+	"github.com/runningwater/gohub/pkg/paginator"
+)
+
+// IsEmailExist 检查邮箱是否已存在
 func IsEmailExist(email string) bool {
 func IsEmailExist(email string) bool {
 	var count int64
 	var count int64
 	database.DB.Model(&User{}).Where("email = ?", email).Count(&count)
 	database.DB.Model(&User{}).Where("email = ?", email).Count(&count)
 	return count > 0
 	return count > 0
 }
 }
 
 
+// IsPhoneExist 检查手机号是否已存在
 func IsPhoneExist(phone string) bool {
 func IsPhoneExist(phone string) bool {
 	var count int64
 	var count int64
 	database.DB.Model(&User{}).Where("phone = ?", phone).Count(&count)
 	database.DB.Model(&User{}).Where("phone = ?", phone).Count(&count)
@@ -43,3 +51,15 @@ func All() (users []User) {
 	database.DB.Find(&users)
 	database.DB.Find(&users)
 	return
 	return
 }
 }
+
+// Paginate 分页内容
+func Paginate(c *gin.Context, pageSize int) (users []User, paging paginator.Paging) {
+	paging = paginator.Paginate(
+		c,
+		database.DB.Model(User{}),
+		&users,
+		app.V1URL(database.TableName(&User{})),
+		pageSize,
+	)
+	return
+}

+ 7 - 3
gohub.http

@@ -46,7 +46,7 @@ Content-Type: application/json
     "name":"summer",
     "name":"summer",
     "password":"secret",
     "password":"secret",
     "password_confirm":"secret",
     "password_confirm":"secret",
-    "verify_code": "123123",
+    "verify_code": "439665",
     "phone": "00011059149"
     "phone": "00011059149"
 }
 }
 
 
@@ -55,11 +55,11 @@ POST {{base_url}}/v1/auth/signup/using-email HTTP/1.1
 Content-Type: application/json
 Content-Type: application/json
 
 
 {
 {
-    "name":"summer2",
+    "name":"summer3",
     "password":"secret",
     "password":"secret",
     "password_confirm":"secret",
     "password_confirm":"secret",
     "verify_code": "123123",
     "verify_code": "123123",
-    "email": "summer@testing.com"
+    "email": "summer3@testing.com"
 }
 }
 
 
 ### 登录用户
 ### 登录用户
@@ -91,3 +91,7 @@ Authorization: Bearer {{access_token}}
 ### GET /current_user 当前登陆用户
 ### GET /current_user 当前登陆用户
 GET {{base_url}}/v1/auth/user HTTP/1.1
 GET {{base_url}}/v1/auth/user HTTP/1.1
 Authorization: Bearer {{access_token}}
 Authorization: Bearer {{access_token}}
+
+
+### users
+GET {{base_url}}/v1/users HTTP/1.1

+ 2 - 1
http-client.env.json

@@ -1,5 +1,6 @@
 {
 {
   "dev": {
   "dev": {
-    "base_url": "http://127.0.0.1:3000"
+    "base_url": "http://127.0.0.1:3000",
+    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMSIsInVzZXJfbmFtZSI6InN1bW1lciIsImV4cGlyZV90aW1lIjoxNzU3NzMyNTk3LCJpc3MiOiJHb2h1YiIsInN1YiI6IjEiLCJhdWQiOlsic3VtbWVyIl0sImV4cCI6MTc1NzczMjU5NywibmJmIjoxNzUyNTQ4NTk3LCJpYXQiOjE3NTI1NDg1OTd9.4bE5RE1saBymOUuMewdAUKmy5U6AKM_tc4hQyH9lrk4"
   }
   }
 }
 }

+ 11 - 1
pkg/app/app.go

@@ -1,4 +1,4 @@
-// package app 应用信息包
+// Package app 应用信息包
 package app
 package app
 
 
 import (
 import (
@@ -28,3 +28,13 @@ func TimenowInTimezone() time.Time {
 	chinaTimeZone, _ := time.LoadLocation(timezone)
 	chinaTimeZone, _ := time.LoadLocation(timezone)
 	return time.Now().In(chinaTimeZone)
 	return time.Now().In(chinaTimeZone)
 }
 }
+
+// URL 传参 path 拼接接点的 URL
+func URL(path string) string {
+	return config.GetString("app.url") + path
+}
+
+// V1URL 拼接 v1 版本的 URL
+func V1URL(path string) string {
+	return URL("/v1/" + path)
+}

+ 14 - 5
pkg/database/database.go

@@ -1,5 +1,3 @@
-// Project: go-orm
-// File: pkg/database/database.go
 // Package database 数据库连接
 // Package database 数据库连接
 package database
 package database
 
 
@@ -7,9 +5,10 @@ import (
 	"database/sql"
 	"database/sql"
 	"fmt"
 	"fmt"
 
 
-	"github.com/runningwater/gohub/pkg/config"
 	"gorm.io/gorm"
 	"gorm.io/gorm"
 	gormlgger "gorm.io/gorm/logger"
 	gormlgger "gorm.io/gorm/logger"
+
+	"github.com/runningwater/gohub/pkg/config"
 )
 )
 
 
 // DB 数据库连接实例
 // DB 数据库连接实例
@@ -53,7 +52,7 @@ func DeleteAllTables() error {
 
 
 func deleteMySQLTables() error {
 func deleteMySQLTables() error {
 	dbname := CurrentDatabase()
 	dbname := CurrentDatabase()
-	tables := []string{}
+	var tables []string
 
 
 	err := DB.Table("information_schema.tables").
 	err := DB.Table("information_schema.tables").
 		Where("table_schema = ?", dbname).
 		Where("table_schema = ?", dbname).
@@ -78,7 +77,7 @@ func deleteMySQLTables() error {
 }
 }
 
 
 func deleteAllSQLiteTables() error {
 func deleteAllSQLiteTables() error {
-	tables := []string{}
+	var tables []string
 
 
 	err := DB.Raw("SELECT name FROM sqlite_master WHERE type='table'").
 	err := DB.Raw("SELECT name FROM sqlite_master WHERE type='table'").
 		Pluck("name", &tables).Error
 		Pluck("name", &tables).Error
@@ -95,3 +94,13 @@ func deleteAllSQLiteTables() error {
 
 
 	return nil
 	return nil
 }
 }
+
+// TableName 获取表名
+func TableName(obj any) string {
+	stmt := &gorm.Statement{DB: DB}
+	err := stmt.Parse(obj)
+	if err != nil {
+		return ""
+	}
+	return stmt.Schema.Table
+}

+ 6 - 3
routes/api.go

@@ -20,6 +20,8 @@ func RegisterAPIRoutes(router *gin.Engine) {
 	v1.Use(middlewares.LimitIP("200-H"))
 	v1.Use(middlewares.LimitIP("200-H"))
 
 
 	{
 	{
+		uc := new(controllers.UsersController)
+
 		authGroup := v1.Group("/auth")
 		authGroup := v1.Group("/auth")
 		{
 		{
 			suc := new(auth.SignupController)
 			suc := new(auth.SignupController)
@@ -50,11 +52,12 @@ func RegisterAPIRoutes(router *gin.Engine) {
 			pc := new(auth.PasswordController)
 			pc := new(auth.PasswordController)
 			// 使用手机重置密码
 			// 使用手机重置密码
 			authGroup.POST("/password-reset/using-phone", middlewares.LimitPerRoute("20-H"), pc.ResetByPhone)
 			authGroup.POST("/password-reset/using-phone", middlewares.LimitPerRoute("20-H"), pc.ResetByPhone)
-
-			uc := new(controllers.UsersController)
 			// 当前登录用户信息
 			// 当前登录用户信息
 			authGroup.GET("/user", middlewares.AuthJWT(), uc.CurrentUser)
 			authGroup.GET("/user", middlewares.AuthJWT(), uc.CurrentUser)
-			authGroup.GET("/users", middlewares.AuthJWT(), uc.Index)
+		}
+		userGroup := v1.Group("/users")
+		{
+			userGroup.GET("", uc.Index)
 		}
 		}
 	}
 	}
 }
 }