From e3c08870bb916f76dc9cb484ddb3202da130bc44 Mon Sep 17 00:00:00 2001 From: TrafficLight6 Date: Fri, 4 Sep 2026 11:08:00 +0800 Subject: [PATCH 1/7] Edit Sub Package Name --- {controllor => adminControllor}/adminAdd.go | 2 +- .../adminDelete.go | 2 +- {controllor => adminControllor}/adminEdit.go | 2 +- {controllor => adminControllor}/adminGet.go | 2 +- {controllor => adminControllor}/adminLogin.go | 2 +- .../adminLogout.go | 2 +- .../characterAdd.go | 2 +- .../characterEdit.go | 2 +- .../characterGet.go | 2 +- .../charaterDelete.go | 2 +- .../rootControllor.go | 2 +- {controllor => adminControllor}/userAdd.go | 2 +- {controllor => adminControllor}/userDelete.go | 2 +- {controllor => adminControllor}/userEdit.go | 2 +- {controllor => adminControllor}/userGet.go | 2 +- router/router.go | 32 +++++++++---------- 16 files changed, 31 insertions(+), 31 deletions(-) rename {controllor => adminControllor}/adminAdd.go (98%) rename {controllor => adminControllor}/adminDelete.go (98%) rename {controllor => adminControllor}/adminEdit.go (99%) rename {controllor => adminControllor}/adminGet.go (97%) rename {controllor => adminControllor}/adminLogin.go (99%) rename {controllor => adminControllor}/adminLogout.go (97%) rename {controllor => adminControllor}/characterAdd.go (99%) rename {controllor => adminControllor}/characterEdit.go (98%) rename {controllor => adminControllor}/characterGet.go (97%) rename {controllor => adminControllor}/charaterDelete.go (98%) rename {controllor => adminControllor}/rootControllor.go (88%) rename {controllor => adminControllor}/userAdd.go (98%) rename {controllor => adminControllor}/userDelete.go (97%) rename {controllor => adminControllor}/userEdit.go (99%) rename {controllor => adminControllor}/userGet.go (98%) diff --git a/controllor/adminAdd.go b/adminControllor/adminAdd.go similarity index 98% rename from controllor/adminAdd.go rename to adminControllor/adminAdd.go index 8046426..9771fca 100644 --- a/controllor/adminAdd.go +++ b/adminControllor/adminAdd.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/adminDelete.go b/adminControllor/adminDelete.go similarity index 98% rename from controllor/adminDelete.go rename to adminControllor/adminDelete.go index 3bf8ee9..3d08db1 100644 --- a/controllor/adminDelete.go +++ b/adminControllor/adminDelete.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/adminEdit.go b/adminControllor/adminEdit.go similarity index 99% rename from controllor/adminEdit.go rename to adminControllor/adminEdit.go index 76d32bf..aeaa7d6 100644 --- a/controllor/adminEdit.go +++ b/adminControllor/adminEdit.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/adminGet.go b/adminControllor/adminGet.go similarity index 97% rename from controllor/adminGet.go rename to adminControllor/adminGet.go index 34a95ed..a736a9a 100644 --- a/controllor/adminGet.go +++ b/adminControllor/adminGet.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/adminLogin.go b/adminControllor/adminLogin.go similarity index 99% rename from controllor/adminLogin.go rename to adminControllor/adminLogin.go index 433350f..d8bdcd3 100644 --- a/controllor/adminLogin.go +++ b/adminControllor/adminLogin.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "errors" diff --git a/controllor/adminLogout.go b/adminControllor/adminLogout.go similarity index 97% rename from controllor/adminLogout.go rename to adminControllor/adminLogout.go index 5e424b8..e684099 100644 --- a/controllor/adminLogout.go +++ b/adminControllor/adminLogout.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/characterAdd.go b/adminControllor/characterAdd.go similarity index 99% rename from controllor/characterAdd.go rename to adminControllor/characterAdd.go index 0724198..00e6c85 100644 --- a/controllor/characterAdd.go +++ b/adminControllor/characterAdd.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/characterEdit.go b/adminControllor/characterEdit.go similarity index 98% rename from controllor/characterEdit.go rename to adminControllor/characterEdit.go index f4f995b..df9b0b9 100644 --- a/controllor/characterEdit.go +++ b/adminControllor/characterEdit.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/characterGet.go b/adminControllor/characterGet.go similarity index 97% rename from controllor/characterGet.go rename to adminControllor/characterGet.go index 5a50e4e..f18f45f 100644 --- a/controllor/characterGet.go +++ b/adminControllor/characterGet.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/charaterDelete.go b/adminControllor/charaterDelete.go similarity index 98% rename from controllor/charaterDelete.go rename to adminControllor/charaterDelete.go index cb08dca..c9db246 100644 --- a/controllor/charaterDelete.go +++ b/adminControllor/charaterDelete.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/rootControllor.go b/adminControllor/rootControllor.go similarity index 88% rename from controllor/rootControllor.go rename to adminControllor/rootControllor.go index 78320ec..3cbf74c 100644 --- a/controllor/rootControllor.go +++ b/adminControllor/rootControllor.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/userAdd.go b/adminControllor/userAdd.go similarity index 98% rename from controllor/userAdd.go rename to adminControllor/userAdd.go index f4cdb11..2d98603 100644 --- a/controllor/userAdd.go +++ b/adminControllor/userAdd.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/userDelete.go b/adminControllor/userDelete.go similarity index 97% rename from controllor/userDelete.go rename to adminControllor/userDelete.go index f968a61..10caf85 100644 --- a/controllor/userDelete.go +++ b/adminControllor/userDelete.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/userEdit.go b/adminControllor/userEdit.go similarity index 99% rename from controllor/userEdit.go rename to adminControllor/userEdit.go index 8bd620b..d948f97 100644 --- a/controllor/userEdit.go +++ b/adminControllor/userEdit.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/userGet.go b/adminControllor/userGet.go similarity index 98% rename from controllor/userGet.go rename to adminControllor/userGet.go index ed90c7a..85efa98 100644 --- a/controllor/userGet.go +++ b/adminControllor/userGet.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/router/router.go b/router/router.go index c1a33b1..3e4fba9 100644 --- a/router/router.go +++ b/router/router.go @@ -1,8 +1,8 @@ package router import ( + "github.com/TrafficLight6/GoAccountHub/adminControllor" "github.com/TrafficLight6/GoAccountHub/config" - "github.com/TrafficLight6/GoAccountHub/controllor" "github.com/TrafficLight6/GoAccountHub/middleware" sqlOperator "github.com/TrafficLight6/GoAccountHub/sql" "github.com/gin-gonic/gin" @@ -22,7 +22,7 @@ func ReturnRouter(config config.Config) (*gin.Engine, *gorm.DB) { router.RouterGroup.Group("/") //Root Page - router.GET("/", controllor.Root) + router.GET("/", adminControllor.Root) //v1 Api v1 := router.Group("/api/v1") @@ -31,29 +31,29 @@ func ReturnRouter(config config.Config) (*gin.Engine, *gorm.DB) { //Admin Api //Login & Logout - v1.GET("/admin/login", controllor.AdminLogin) - v1.DELETE("/admin/logout", controllor.AdminLogout) + v1.GET("/admin/login", adminControllor.AdminLogin) + v1.DELETE("/admin/logout", adminControllor.AdminLogout) //Admin Operation - v1.POST("/admin/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_add_admin"), controllor.AdminAdd) - v1.DELETE("/admin/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_delete_admin"), controllor.AdminDelete) - v1.PUT("/admin/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_edit_admin"), controllor.AdminEdit) - v1.GET("/admin/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_get_admin"), controllor.AdminGet) + v1.POST("/admin/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_add_admin"), adminControllor.AdminAdd) + v1.DELETE("/admin/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_delete_admin"), adminControllor.AdminDelete) + v1.PUT("/admin/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_edit_admin"), adminControllor.AdminEdit) + v1.GET("/admin/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_get_admin"), adminControllor.AdminGet) //User Api - v1.POST("/user/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), controllor.UserAdd) - v1.DELETE("/user/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), controllor.UserDelete) - v1.PUT("/user/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), controllor.UserEdit) - v1.GET("/user/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), controllor.UserGet) + v1.POST("/user/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserAdd) + v1.DELETE("/user/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserDelete) + v1.PUT("/user/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserEdit) + v1.GET("/user/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserGet) //Character Api //Check is Allowed to Use Multi Character Functions v1.Use(middleware.ConfigBlocker("allow_multi_character")) //Character Operation - v1.POST("/character/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), controllor.CharacterAdd) - v1.DELETE("/character/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), controllor.CharacterDelete) - v1.PUT("/character/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), controllor.CharacterEdit) - v1.GET("/character/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), controllor.CharacterGet) + v1.POST("/character/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterAdd) + v1.DELETE("/character/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterDelete) + v1.PUT("/character/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterEdit) + v1.GET("/character/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterGet) } return router, db From d8ab672b32c3755bf2de6cc3931ee8b52b013352 Mon Sep 17 00:00:00 2001 From: TrafficLight6 Date: Fri, 4 Sep 2026 11:34:49 +0800 Subject: [PATCH 2/7] Add AdminRange Api, To Search --- adminControllor/adminRange.go | 81 +++++++++++++++++++++++++++++++++++ router/router.go | 1 + 2 files changed, 82 insertions(+) create mode 100644 adminControllor/adminRange.go diff --git a/adminControllor/adminRange.go b/adminControllor/adminRange.go new file mode 100644 index 0000000..9d4f069 --- /dev/null +++ b/adminControllor/adminRange.go @@ -0,0 +1,81 @@ +package adminControllor + +import ( + "net/http" + "strings" + + "github.com/TrafficLight6/GoAccountHub/sqlTable" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type AdminRangeRequestBody struct { + //It the Length is -1, It Means Get All Admin from BeginTableId to The End + BeginTableId int `json:"begin_table_id"` + Length int `json:"length"` + SearchCondition SearchCondition `json:"search_condition"` +} + +type SearchCondition struct { + //If The Field is Empty, It Means Ignore This Condition + Username string `json:"username"` + PasswordHash string `json:"password_hash"` + UUHash string `json:"uu_hash"` +} + +func AdminRange(c *gin.Context) { + var body AdminRangeRequestBody + if err := c.ShouldBindJSON(&body); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Invalid Request Body"}) + c.Abort() + return + } + if body.BeginTableId < 0 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "BeginTableId Begin From 1"}) + c.Abort() + return + } + //Check Length is Valid + if body.Length < -1 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Length Must Be Greater Than -1"}) + c.Abort() + return + } + var isReturnAll bool + if body.Length == -1 { + isReturnAll = true + } else { + isReturnAll = false + } + //Get Db + db := c.Value("db").(*gorm.DB) + //Build Search Query (only non-empty fields, combined with OR) + condition := body.SearchCondition + var conditions []string + var args []interface{} + if condition.Username != "" { + conditions = append(conditions, "username LIKE ?") + args = append(args, "%"+condition.Username+"%") + } + if condition.PasswordHash != "" { + conditions = append(conditions, "password_hash LIKE ?") + args = append(args, "%"+condition.PasswordHash+"%") + } + if condition.UUHash != "" { + conditions = append(conditions, "uu_hash LIKE ?") + args = append(args, "%"+condition.UUHash+"%") + } + query := db.Model(&sqlTable.Admin{}) + if len(conditions) > 0 { + query = query.Where(strings.Join(conditions, " OR "), args...) + } + //Search + var admins []sqlTable.Admin + if isReturnAll { + query.Find(&admins) + } else { + query.Limit(body.Length).Offset((body.BeginTableId - 1) * body.Length).Find(&admins) + } + //Return Result + c.JSON(http.StatusOK, gin.H{"code": http.StatusOK, "message": "Success(not include root admin)", "data": admins}) +} diff --git a/router/router.go b/router/router.go index 3e4fba9..acb614e 100644 --- a/router/router.go +++ b/router/router.go @@ -39,6 +39,7 @@ func ReturnRouter(config config.Config) (*gin.Engine, *gorm.DB) { v1.DELETE("/admin/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_delete_admin"), adminControllor.AdminDelete) v1.PUT("/admin/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_edit_admin"), adminControllor.AdminEdit) v1.GET("/admin/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_get_admin"), adminControllor.AdminGet) + v1.GET("/admin/range", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_get_admin_range"), adminControllor.AdminRange) //User Api v1.POST("/user/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserAdd) From 1bb67f4deb3f61fc85dfaf971c192324bbb152c7 Mon Sep 17 00:00:00 2001 From: TrafficLight6 Date: Fri, 4 Sep 2026 11:36:57 +0800 Subject: [PATCH 3/7] Change Field Name --- adminControllor/adminRange.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adminControllor/adminRange.go b/adminControllor/adminRange.go index 9d4f069..fdc427e 100644 --- a/adminControllor/adminRange.go +++ b/adminControllor/adminRange.go @@ -11,12 +11,12 @@ import ( type AdminRangeRequestBody struct { //It the Length is -1, It Means Get All Admin from BeginTableId to The End - BeginTableId int `json:"begin_table_id"` - Length int `json:"length"` - SearchCondition SearchCondition `json:"search_condition"` + BeginTableId int `json:"begin_table_id"` + Length int `json:"length"` + SearchCondition AdminSearchCondition `json:"search_condition"` } -type SearchCondition struct { +type AdminSearchCondition struct { //If The Field is Empty, It Means Ignore This Condition Username string `json:"username"` PasswordHash string `json:"password_hash"` From a4f42490c61626b565553e0c4373286e640e6e9f Mon Sep 17 00:00:00 2001 From: TrafficLight6 Date: Fri, 4 Sep 2026 11:48:58 +0800 Subject: [PATCH 4/7] Add User Range --- adminControllor/userRanger.go | 81 +++++++++++++++++++++++++++++++++++ router/router.go | 1 + 2 files changed, 82 insertions(+) create mode 100644 adminControllor/userRanger.go diff --git a/adminControllor/userRanger.go b/adminControllor/userRanger.go new file mode 100644 index 0000000..5c0c1a6 --- /dev/null +++ b/adminControllor/userRanger.go @@ -0,0 +1,81 @@ +package adminControllor + +import ( + "net/http" + "strings" + + "github.com/TrafficLight6/GoAccountHub/sqlTable" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type UserRangeRequestBody struct { + //It the Length is -1, It Means Get All User from BeginTableId to The End + BeginTableId int `json:"begin_table_id"` + Length int `json:"length"` + SearchCondition UserSearchCondition `json:"search_condition"` +} + +type UserSearchCondition struct { + //If The Field is Empty, It Means Ignore This Condition + Username string `json:"username"` + PasswordHash string `json:"password_hash"` + UUHash string `json:"uu_hash"` +} + +func UserRange(c *gin.Context) { + var body UserRangeRequestBody + if err := c.ShouldBindJSON(&body); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Invalid Request Body"}) + c.Abort() + return + } + if body.BeginTableId < 0 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "BeginTableId Begin From 1"}) + c.Abort() + return + } + //Check Length is Valid + if body.Length < -1 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Length Must Be Greater Than -1"}) + c.Abort() + return + } + var isReturnAll bool + if body.Length == -1 { + isReturnAll = true + } else { + isReturnAll = false + } + //Get Db + db := c.Value("db").(*gorm.DB) + //Build Search Query (only non-empty fields, combined with AND) + condition := body.SearchCondition + var conditions []string + var args []interface{} + if condition.Username != "" { + conditions = append(conditions, "username LIKE ?") + args = append(args, "%"+condition.Username+"%") + } + if condition.PasswordHash != "" { + conditions = append(conditions, "password_hash LIKE ?") + args = append(args, "%"+condition.PasswordHash+"%") + } + if condition.UUHash != "" { + conditions = append(conditions, "uu_hash LIKE ?") + args = append(args, "%"+condition.UUHash+"%") + } + query := db.Model(&sqlTable.User{}) + if len(conditions) > 0 { + query = query.Where(strings.Join(conditions, " AND "), args...) + } + //Search + var users []sqlTable.User + if isReturnAll { + query.Find(&users) + } else { + query.Limit(body.Length).Offset((body.BeginTableId - 1) * body.Length).Find(&users) + } + //Return Result + c.JSON(http.StatusOK, gin.H{"code": http.StatusOK, "message": "Success", "data": users}) +} diff --git a/router/router.go b/router/router.go index acb614e..ce8ac63 100644 --- a/router/router.go +++ b/router/router.go @@ -46,6 +46,7 @@ func ReturnRouter(config config.Config) (*gin.Engine, *gorm.DB) { v1.DELETE("/user/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserDelete) v1.PUT("/user/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserEdit) v1.GET("/user/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserGet) + v1.GET("/user/range", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user_range"), adminControllor.UserRange) //Character Api //Check is Allowed to Use Multi Character Functions From 889c2abf89c0f3cf835a95303c687e8f184a6b20 Mon Sep 17 00:00:00 2001 From: TrafficLight6 Date: Fri, 4 Sep 2026 11:49:46 +0800 Subject: [PATCH 5/7] Fix: Fix the Search SQL Generate Bug --- adminControllor/adminRange.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adminControllor/adminRange.go b/adminControllor/adminRange.go index fdc427e..68a601c 100644 --- a/adminControllor/adminRange.go +++ b/adminControllor/adminRange.go @@ -49,7 +49,7 @@ func AdminRange(c *gin.Context) { } //Get Db db := c.Value("db").(*gorm.DB) - //Build Search Query (only non-empty fields, combined with OR) + //Build Search Query (only non-empty fields, combined with AND) condition := body.SearchCondition var conditions []string var args []interface{} @@ -67,7 +67,7 @@ func AdminRange(c *gin.Context) { } query := db.Model(&sqlTable.Admin{}) if len(conditions) > 0 { - query = query.Where(strings.Join(conditions, " OR "), args...) + query = query.Where(strings.Join(conditions, " AND "), args...) } //Search var admins []sqlTable.Admin From c8cd88c377b544f9e024e196469b73cc24066aa3 Mon Sep 17 00:00:00 2001 From: TrafficLight6 Date: Fri, 4 Sep 2026 11:55:37 +0800 Subject: [PATCH 6/7] Nothing --- adminControllor/userRanger.go | 1 + 1 file changed, 1 insertion(+) diff --git a/adminControllor/userRanger.go b/adminControllor/userRanger.go index 5c0c1a6..c18b681 100644 --- a/adminControllor/userRanger.go +++ b/adminControllor/userRanger.go @@ -78,4 +78,5 @@ func UserRange(c *gin.Context) { } //Return Result c.JSON(http.StatusOK, gin.H{"code": http.StatusOK, "message": "Success", "data": users}) + return } From 344a010f87e41658c655d785d7d32006a943d5ac Mon Sep 17 00:00:00 2001 From: TrafficLight6 Date: Fri, 4 Sep 2026 11:58:52 +0800 Subject: [PATCH 7/7] Add Character Range --- adminControllor/characterRange.go | 81 +++++++++++++++++++++++++++++++ router/router.go | 1 + 2 files changed, 82 insertions(+) create mode 100644 adminControllor/characterRange.go diff --git a/adminControllor/characterRange.go b/adminControllor/characterRange.go new file mode 100644 index 0000000..ad63cff --- /dev/null +++ b/adminControllor/characterRange.go @@ -0,0 +1,81 @@ +package adminControllor + +import ( + "net/http" + "strings" + + "github.com/TrafficLight6/GoAccountHub/sqlTable" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type CharacterRangeRequestBody struct { + //It the Length is -1, It Means Get All User from BeginTableId to The End + BeginTableId int `json:"begin_table_id"` + Length int `json:"length"` + SearchCondition CharacterSearchCondition `json:"search_condition"` +} + +type CharacterSearchCondition struct { + //If The Field is Empty, It Means Ignore This Condition + CharacterName string `json:"character_name"` + PasswordHash string `json:"password_hash"` + UserUUHash string `json:"user_uu_hash"` + UUHash string `json:"uu_hash"` +} + +func CharacterRange(c *gin.Context) { + var body CharacterRangeRequestBody + if err := c.ShouldBindJSON(&body); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": err.Error()}) + return + } + //Check Length is Valid + if body.Length < -1 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Length Must Be Greater Than -1"}) + c.Abort() + return + } + var isReturnAll bool + if body.Length == -1 { + isReturnAll = true + } else { + isReturnAll = false + } + //Get Db + db := c.Value("db").(*gorm.DB) + //Build Search Query (only non-empty fields, combined with AND) + condition := body.SearchCondition + var conditions []string + var args []interface{} + if condition.CharacterName != "" { + conditions = append(conditions, "character_name LIKE ?") + args = append(args, "%"+condition.CharacterName+"%") + } + if condition.PasswordHash != "" { + conditions = append(conditions, "password_hash LIKE ?") + args = append(args, "%"+condition.PasswordHash+"%") + } + if condition.UserUUHash != "" { + conditions = append(conditions, "user_uu_hash LIKE ?") + args = append(args, "%"+condition.UserUUHash+"%") + } + if condition.UUHash != "" { + conditions = append(conditions, "uu_hash LIKE ?") + args = append(args, "%"+condition.UUHash+"%") + } + query := db.Model(&sqlTable.Character{}) + if len(conditions) > 0 { + query = query.Where(strings.Join(conditions, " AND "), args...) + } + //Search + var characters []sqlTable.Character + if isReturnAll { + query.Find(&characters) + } else { + query.Limit(body.Length).Offset((body.BeginTableId - 1) * body.Length).Find(&characters) + } + //Return Result + c.JSON(http.StatusOK, gin.H{"code": http.StatusOK, "message": "Success", "data": characters}) + return +} diff --git a/router/router.go b/router/router.go index ce8ac63..781f1ef 100644 --- a/router/router.go +++ b/router/router.go @@ -56,6 +56,7 @@ func ReturnRouter(config config.Config) (*gin.Engine, *gorm.DB) { v1.DELETE("/character/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterDelete) v1.PUT("/character/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterEdit) v1.GET("/character/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterGet) + v1.GET("/character/range", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character_range"), adminControllor.CharacterRange) } return router, db