From f593526bd45b79033979b04f61f594668215a533 Mon Sep 17 00:00:00 2001 From: RockYang Date: Tue, 20 Jun 2023 11:46:13 +0800 Subject: [PATCH] refactor: chat role manage for admin is ready --- api/go/core/types/session.go | 1 - api/go/handler/admin/chat_role_handler.go | 79 ++++++++++---- api/go/handler/chat_role_handler.go | 2 +- api/go/main.go | 5 +- api/go/utils/resp/response.go | 4 + api/go/utils/string.go | 9 +- web/package-lock.json | 11 ++ web/package.json | 1 + web/src/views/ChatPlus.vue | 2 +- web/src/views/admin/RoleList.vue | 125 ++++++++++++++++------ 10 files changed, 175 insertions(+), 64 deletions(-) diff --git a/api/go/core/types/session.go b/api/go/core/types/session.go index ffe6fd21..5d66bdb6 100644 --- a/api/go/core/types/session.go +++ b/api/go/core/types/session.go @@ -4,4 +4,3 @@ const SessionName = "ChatGPT-TOKEN" const SessionUser = "SESSION_USER" // 存储用户信息的 session key const SessionAdmin = "SESSION_ADMIN" //存储管理员信息的 session key const LoginUserCache = "LOGIN_USER_CACHE" // 已登录用户缓存 -const AdminUserCache = "ADMIN_USER_CACHE" // 管理员用户信息缓存 diff --git a/api/go/handler/admin/chat_role_handler.go b/api/go/handler/admin/chat_role_handler.go index 12cdca60..9ed6fa5b 100644 --- a/api/go/handler/admin/chat_role_handler.go +++ b/api/go/handler/admin/chat_role_handler.go @@ -10,6 +10,7 @@ import ( "chatplus/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" + "time" ) type ChatRoleHandler struct { @@ -23,42 +24,38 @@ func NewChatRoleHandler(app *core.AppServer, db *gorm.DB) *ChatRoleHandler { return &h } -// Add 添加一个聊天角色 -func (h *ChatRoleHandler) Add(c *gin.Context) { +// Update 更新某个聊天角色信息,这里只允许更改名称以及启用和禁用角色操作 +func (h *ChatRoleHandler) Update(c *gin.Context) { var data vo.ChatRole if err := c.ShouldBindJSON(&data); err != nil { resp.ERROR(c, types.InvalidArgs) return } - - if data.Key == "" || data.Name == "" || data.Icon == "" { + var role model.ChatRole + err := utils.CopyObject(data, &role) + if err != nil { resp.ERROR(c, types.InvalidArgs) return } - - //err := h.service.Create(data) - //if err != nil { - // resp.ERROR(c, "Save failed: "+err.Error()) - // return - //} - + role.Id = data.Id + if data.CreatedAt > 0 { + role.CreatedAt = time.Unix(data.CreatedAt, 0) + } + res := h.db.Save(&role) + if res.Error != nil { + resp.ERROR(c, "更新数据库失败!") + return + } + // 填充 ID 数据 + data.Id = role.Id + data.CreatedAt = role.CreatedAt.Unix() resp.SUCCESS(c, data) } -// Get 获取指定的角色 -func (h *ChatRoleHandler) Get(c *gin.Context) { - -} - -// Update 更新某个聊天角色信息,这里只允许更改名称以及启用和禁用角色操作 -func (h *ChatRoleHandler) Update(c *gin.Context) { - -} - func (h *ChatRoleHandler) List(c *gin.Context) { var items []model.ChatRole var roles = make([]vo.ChatRole, 0) - res := h.db.Where("enable", true).Order("sort ASC").Find(&items) + res := h.db.Debug().Order("sort ASC").Find(&items) if res.Error != nil { resp.ERROR(c, "No data found") return @@ -77,3 +74,41 @@ func (h *ChatRoleHandler) List(c *gin.Context) { resp.SUCCESS(c, roles) } + +// SetSort 更新角色排序 +func (h *ChatRoleHandler) SetSort(c *gin.Context) { + var data struct { + Id uint `json:"id"` + Sort int `json:"sort"` + } + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + if data.Id <= 0 { + resp.HACKER(c) + return + } + res := h.db.Debug().Model(&model.ChatRole{}).Where("id = ?", data.Id).Update("sort", data.Sort) + if res.Error != nil { + resp.ERROR(c, "更新数据库失败!") + return + } + + resp.SUCCESS(c) +} + +func (h *ChatRoleHandler) Remove(c *gin.Context) { + id := h.GetInt(c, "id", 0) + if id <= 0 { + resp.ERROR(c, types.InvalidArgs) + return + } + + res := h.db.Where("id = ?", id).Delete(&model.ChatRole{}) + if res.Error != nil { + resp.ERROR(c, "删除失败!") + return + } + resp.SUCCESS(c) +} diff --git a/api/go/handler/chat_role_handler.go b/api/go/handler/chat_role_handler.go index 2a0f9f08..6b875d94 100644 --- a/api/go/handler/chat_role_handler.go +++ b/api/go/handler/chat_role_handler.go @@ -25,7 +25,7 @@ func NewChatRoleHandler(app *core.AppServer, db *gorm.DB) *ChatRoleHandler { // List get user list func (h *ChatRoleHandler) List(c *gin.Context) { var roles []model.ChatRole - res := h.db.Find(&roles) + res := h.db.Where("enable", true).Order("sort ASC").Find(&roles) if res.Error != nil { resp.ERROR(c, "No roles found,"+res.Error.Error()) return diff --git a/api/go/main.go b/api/go/main.go index 8b80793c..918fcc03 100644 --- a/api/go/main.go +++ b/api/go/main.go @@ -89,7 +89,7 @@ func main() { // 注册路由 fx.Invoke(func(s *core.AppServer, h *handler.ChatRoleHandler) { - group := s.Engine.Group("/api/chat/role/") + group := s.Engine.Group("/api/role/") group.GET("list", h.List) }), fx.Invoke(func(s *core.AppServer, h *handler.UserHandler) { @@ -141,8 +141,9 @@ func main() { fx.Invoke(func(s *core.AppServer, h *admin.ChatRoleHandler) { group := s.Engine.Group("/api/admin/role/") group.GET("list", h.List) - group.POST("add", h.Add) group.POST("update", h.Update) + group.POST("sort", h.SetSort) + group.GET("remove", h.Remove) }), fx.Invoke(func(s *core.AppServer, db *gorm.DB) { diff --git a/api/go/utils/resp/response.go b/api/go/utils/resp/response.go index e12345cb..68e593aa 100644 --- a/api/go/utils/resp/response.go +++ b/api/go/utils/resp/response.go @@ -23,6 +23,10 @@ func ERROR(c *gin.Context, messages ...string) { } } +func HACKER(c *gin.Context) { + c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Hacker attempt!!!"}) +} + func NotAuth(c *gin.Context) { c.JSON(http.StatusOK, types.BizVo{Code: types.NotAuthorized, Message: "Not Authorized"}) } diff --git a/api/go/utils/string.go b/api/go/utils/string.go index 0237cb87..174c4783 100644 --- a/api/go/utils/string.go +++ b/api/go/utils/string.go @@ -109,13 +109,18 @@ func CopyObject(src interface{}, dst interface{}) error { if err == nil { value.Set(reflect.ValueOf(v2).Elem()) } - // string to map, struct, slice + // map, struct, slice to string } else if (field.Type.Kind() == reflect.Struct || field.Type.Kind() == reflect.Map || field.Type.Kind() == reflect.Slice) && value.Type().Kind() == reflect.String { ba, err := json.Marshal(v.Interface()) if err == nil { - value.Set(reflect.ValueOf(string(ba))) + val := string(ba) + if strings.Contains(val, "{") { + value.Set(reflect.ValueOf(string(ba))) + } else { + value.Set(reflect.ValueOf("")) + } } } else { // 简单数据类型的强制类型转换 switch value.Kind() { diff --git a/web/package-lock.json b/web/package-lock.json index e9048114..1e07dcf3 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -18,6 +18,7 @@ "json-bigint": "^1.0.0", "markdown-it": "^13.0.1", "qs": "^6.11.1", + "sortablejs": "^1.15.0", "vue": "^3.2.13", "vue-router": "^4.0.15" }, @@ -9595,6 +9596,11 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", @@ -18759,6 +18765,11 @@ "websocket-driver": "^0.7.4" } }, + "sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", diff --git a/web/package.json b/web/package.json index 7d578127..b0164e2c 100644 --- a/web/package.json +++ b/web/package.json @@ -18,6 +18,7 @@ "json-bigint": "^1.0.0", "markdown-it": "^13.0.1", "qs": "^6.11.1", + "sortablejs": "^1.15.0", "vue": "^3.2.13", "vue-router": "^4.0.15" }, diff --git a/web/src/views/ChatPlus.vue b/web/src/views/ChatPlus.vue index cee1e7a3..f6a000b0 100644 --- a/web/src/views/ChatPlus.vue +++ b/web/src/views/ChatPlus.vue @@ -245,7 +245,7 @@ if (!user.value) { resizeElement(); checkSession().then(() => { // 加载角色列表 - httpGet(`/api/chat/role/list?user_id=${user.value.id}`).then((res) => { + httpGet(`/api/role/list?user_id=${user.value.id}`).then((res) => { roles.value = res.data; roleId.value = roles.value[0]['id']; // 获取会话列表 diff --git a/web/src/views/admin/RoleList.vue b/web/src/views/admin/RoleList.vue index 40ff1d04..44719776 100644 --- a/web/src/views/admin/RoleList.vue +++ b/web/src/views/admin/RoleList.vue @@ -1,13 +1,13 @@