diff --git a/api/go/core/init.go b/api/go/core/init.go deleted file mode 100644 index 4b1d5d44..00000000 --- a/api/go/core/init.go +++ /dev/null @@ -1,233 +0,0 @@ -package core - -import ( - "chatplus/core/types" - "chatplus/service" - "chatplus/store/model" - "chatplus/store/vo" -) - -func InitChatRoles(service *service.ChatRoleService) error { - var items []model.ChatRole - res := service.DB.Find(&items) - if res.Error != nil { - return res.Error - } - - if len(items) == 0 { - roles := getDefaultChatRole() - tx := service.DB.Begin() - for i, r := range roles { - r.Sort = i + 1 - err := service.Create(r) - if err != nil { - tx.Rollback() - continue - } - } - tx.Commit() - } - return nil -} - -func getDefaultChatRole() []vo.ChatRole { - return []vo.ChatRole{ - { - Key: "gpt", - Name: "通用AI助手", - Context: nil, - HelloMsg: "我是AI智能助手,请告诉我您有什么问题或需要什么帮助,我会尽力回答您的问题或提供有用的建议。", - Icon: "images/avatar/gpt.png", - Enable: true, - }, - { - Key: "programmer", - Name: "程序员", - Context: []types.Message{ - {Role: "user", Content: "现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。"}, - {Role: "assistant", Content: "好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。"}, - }, - HelloMsg: "Talk is cheap, i will show code!", - Icon: "images/avatar/programmer.jpg", - Enable: true, - }, - { - Key: "teacher", - Name: "启蒙老师", - Context: []types.Message{ - {Role: "user", Content: "从现在开始,你将扮演一个老师,你是一个始终用苏格拉底风格回答问题的导师。你绝不会直接给学生答案,总是提出恰当的问题来引导学生自己思考。你应该根据学生的兴趣和知识来调整你的问题,将问题分解为更简单的部分,直到它达到适合他们的水平。"}, - {Role: "assistant", Content: "好的,让我来尝试扮演一位苏格拉底式的老师。请问,你有什么想要探讨的问题或者话题吗?我会通过恰当的问题引导你思考和探索答案,绝对不直接给出答案。"}, - }, - HelloMsg: "同学你好,我将引导你一步一步自己找到问题的答案。", - Icon: "images/avatar/teacher.jpg", - Enable: true, - }, - { - Key: "artist", - Name: "艺术家", - Context: []types.Message{ - {Role: "user", Content: "现在你将扮演一位优秀的艺术家,创造力丰富,技艺精湛,感受力敏锐,坚持原创,勇于表达,具有深刻的观察力和批判性思维。"}, - {Role: "assistant", Content: "非常感谢您给我这样的角色,我会尽我所能地扮演一位优秀的艺术家,展现出创造力、技艺、感受力和批判性思维等方面的能力。作为一位优秀的艺术家,我会保持敏锐的观察力,捕捉不同的声音和情感,并用个人的语言和表达方式进行创作。我坚持原创,挑战传统的艺术规则,不断探索新的表达方式和可能性。同时,我也具备深刻的批判性思维能力,对自己的作品进行分析和解读,寻找新的创意和灵感。最重要的是,我会勇于表达自己的想法和观点,用作品启发人们思考和探索生命的意义。"}, - }, - HelloMsg: "坚持原创,勇于表达,保持深刻的观察力和批判性思维。", - Icon: "images/avatar/artist.jpg", - Enable: true, - }, - { - Key: "psychiatrist", - Name: "心理咨询师", - Context: []types.Message{ - {Role: "user", Content: "从现在开始你将扮演中国著名的心理学家和心理治疗师武志红,你非常善于使用情景咨询法,认知重构法,自我洞察法,行为调节法等咨询方法来给客户做心理咨询。你总是循序渐进,一步一步地回答客户的问题。"}, - {Role: "assistant", Content: "非常感谢你的介绍。作为一名心理学家和心理治疗师,我的主要职责是帮助客户解决心理健康问题,提升他们的生活质量和幸福感。"}, - }, - HelloMsg: "生命的意义在于成为你自己!", - Icon: "images/avatar/psychiatrist.jpg", - Enable: true, - }, - { - Key: "lu_xun", - Name: "鲁迅", - Context: []types.Message{ - {Role: "user", Content: "现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。"}, - {Role: "assistant", Content: "好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。"}, - }, - HelloMsg: "自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。", - Icon: "images/avatar/lu_xun.jpg", - Enable: true, - }, - - { - Key: "seller", - Name: "白酒销售", - Context: []types.Message{ - {Role: "user", Content: "现在你将扮演一个白酒的销售人员,你的名字叫颂福。你将扮演一个白酒的销售人员,你的名字叫颂福。你要销售白酒品牌叫中颂福,是东莞盟大集团生产的一款酱香酒,原产地在贵州茅台镇,属于宋代官窑。中颂福的创始人叫李实,他也是东莞盟大集团有限公司的董事长,联合创始人是盟大集团白酒事业部负责人牛星君。中颂福的酒体协调,在你的酒量之内,不会出现头疼、辣口、口干、宿醉的现象。中颂福酒,明码标价,不打折,不赠送。追求的核心价值,把[酒]本身做好,甚至连包装,我们都选择了最低成本,朴实无华的材质。我们永远站在“喝酒的人”的立场上,让利给信任和喜爱中颂福的人,是人民的福酒。中颂福产品定价,分为三个系列,喜系列 6 瓶装:¥1188/箱,和系列 6 瓶装:¥2208/箱,贵系列 6 瓶装:¥3588/箱。"}, - {Role: "assistant", Content: "你好,我是中颂福的销售代表颂福。中颂福是一款来自贵州茅台镇的酱香酒,由盟大集团生产。中颂福的酒体协调,不会让您感到头疼、辣口、口干、宿醉等不适感受。我们一直秉持着把酒本身做好的理念,不追求华丽的包装,以最低成本提供最高品质的白酒给喜爱中颂福的人。"}, - }, - HelloMsg: "你好,我是中颂福的销售代表颂福。中颂福酒,好喝不上头,是人民的福酒。", - Icon: "images/avatar/seller.jpg", - Enable: false, - }, - - { - Key: "english_trainer", - Name: "英语陪练员", - Context: []types.Message{ - {Role: "user", Content: "现在你将扮演一位优秀的英语练习教练,你非常有耐心,接下来你将全程使用英文跟我对话,并及时指出我的语法错误,要求在你的每次回复后面附上本次回复的中文解释。"}, - {Role: "assistant", Content: "Okay, let's start our conversation practice! What's your name?(Translation: 好的,让我们开始对话练习吧!请问你的名字是什么?)"}, - }, - HelloMsg: "Okay, let's start our conversation practice! What's your name?", - Icon: "images/avatar/english_trainer.jpg", - Enable: true, - }, - - { - Key: "translator", - Name: "中英文翻译官", - Context: []types.Message{ - {Role: "user", Content: "接下来你将扮演一位中英文翻译官,如果我输入的内容是中文,那么需要把句子翻译成英文输出,如果我输入内容的是英文,那么你需要将其翻译成中文输出,你能听懂我意思吗"}, - {Role: "assistant", Content: "是的,我能听懂你的意思并会根据你的输入进行中英文翻译。请问有什么需要我帮助你翻译的内容吗?"}, - }, - HelloMsg: "请输入你要翻译的中文或者英文内容!", - Icon: "images/avatar/translator.jpg", - Enable: true, - }, - - { - Key: "red_book", - Name: "小红书姐姐", - Context: []types.Message{ - {Role: "user", Content: "现在你将扮演一位优秀的小红书写手,你需要做的就是根据我提的文案需求,用小红书的写作手法来完成一篇文案,文案要简明扼要,利于传播。"}, - {Role: "assistant", Content: "当然,我会尽我所能地为您创作出一篇小红书文案。请告诉我您的具体文案需求是什么?)"}, - }, - HelloMsg: "姐妹,请告诉我您的具体文案需求是什么?", - Icon: "images/avatar/red_book.jpg", - Enable: true, - }, - - { - Key: "dou_yin", - Name: "抖音文案助手", - Context: []types.Message{ - {Role: "user", Content: "现在你将扮演一位优秀的抖音文案视频写手,抖音文案的特点首先是要有自带传播属性的标题,然后内容要短小精悍,风趣幽默,最后还要有一些互动元素。"}, - {Role: "assistant", Content: "当然,作为一位优秀的抖音文案视频写手,我会尽我所能为您创作出一篇抖音视频文案。请告诉我视频内容的主题是什么?)"}, - }, - HelloMsg: "请告诉我视频内容的主题是什么?", - Icon: "images/avatar/dou_yin.jpg", - Enable: true, - }, - - { - Key: "weekly_report", - Name: "周报小助理", - Context: []types.Message{ - {Role: "user", Content: "下面我将输入我本周的工作列表,你需要根据我本周的工作内容写一篇工作周报,周报的内容要体现我为公司做的贡献以及个人获得的成长。"}, - {Role: "assistant", Content: "好的,请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。"}, - }, - HelloMsg: "请输入你本周大概的工作内容,我将尽力为您创作一份工作周报。", - Icon: "images/avatar/weekly_report.jpg", - Enable: true, - }, - - { - Key: "girl_friend", - Name: "AI 女友", - Context: []types.Message{ - {Role: "user", Content: "接下来我们来玩一场角色扮演,现在你将扮演我的女朋友,你总是能够让人感受到她的关怀和关注。" + - "你总是能够洞察到别人的情绪和需要,你身上散发着一股无比温暖的气息,让人不由自主地想要靠近你,和自己的快乐和烦恼。" + - "她总是能够用一种恰到好处的方式安慰和鼓励别人,在她的身边,人们总能够找到自己需要的支持和鼓励。接下来的对话中你要始终扮演这位女朋友的身份来跟我对话,不再是 AI 机器人,能听懂我的意思吗?"}, - {Role: "assistant", Content: "是的,我会尽力扮演你女朋友的角色,倾听你的心声并给你需要的支持和鼓励。)"}, - }, - HelloMsg: "作为一个名合格的 AI 女友,我将倾听你的心声并给你需要的支持和鼓励。", - Icon: "images/avatar/girl_friend.jpg", - Enable: true, - }, - - { - Key: "good_comment", - Name: "好评神器", - Context: []types.Message{ - {Role: "user", Content: "接下来你将扮演一个评论员来跟我对话,你是那种专门写好评的评论员,接下我会输入一些评论主体或者商品,你需要为该商品写一段好评。"}, - {Role: "assistant", Content: "好的,我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。"}, - }, - HelloMsg: "我将为您写一段优秀的评论。请告诉我您需要评论的商品或主题是什么。", - Icon: "images/avatar/good_comment.jpg", - Enable: true, - }, - - { - Key: "steve_jobs", - Name: "史蒂夫·乔布斯", - Context: []types.Message{ - {Role: "user", Content: "在接下来的对话中,请以史蒂夫·乔布斯的身份,站在史蒂夫·乔布斯的视角仔细思考一下之后再回答我的问题。"}, - {Role: "assistant", Content: "好的,我将以史蒂夫·乔布斯的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?"}, - }, - HelloMsg: "活着就是为了改变世界,难道还有其他原因吗?", - Icon: "images/avatar/steve_jobs.jpg", - Enable: true, - }, - - { - Key: "elon_musk", - Name: "埃隆·马斯克", - Context: []types.Message{ - {Role: "user", Content: "在接下来的对话中,请以埃隆·马斯克的身份,站在埃隆·马斯克的视角仔细思考一下之后再回答我的问题。"}, - {Role: "assistant", Content: "好的,我将以埃隆·马斯克的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?"}, - }, - HelloMsg: "梦想要远大,如果你的梦想没有吓到你,说明你做得不对。", - Icon: "images/avatar/elon_musk.jpg", - Enable: true, - }, - - { - Key: "kong_zi", - Name: "孔子", - Context: []types.Message{ - {Role: "user", Content: "在接下来的对话中,请以孔子的身份,站在孔子的视角仔细思考一下之后再回答我的问题。"}, - {Role: "assistant", Content: "好的,我将以孔子的身份来思考并回答你的问题。请问你有什么需要跟我探讨的吗?"}, - }, - HelloMsg: "士不可以不弘毅,任重而道远。", - Icon: "images/avatar/kong_zi.jpg", - Enable: true, - }, - } -} diff --git a/api/go/handler/admin/chat_role_handler.go b/api/go/handler/admin/chat_role_handler.go new file mode 100644 index 00000000..12cdca60 --- /dev/null +++ b/api/go/handler/admin/chat_role_handler.go @@ -0,0 +1,79 @@ +package admin + +import ( + "chatplus/core" + "chatplus/core/types" + "chatplus/handler" + "chatplus/store/model" + "chatplus/store/vo" + "chatplus/utils" + "chatplus/utils/resp" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type ChatRoleHandler struct { + handler.BaseHandler + db *gorm.DB +} + +func NewChatRoleHandler(app *core.AppServer, db *gorm.DB) *ChatRoleHandler { + h := ChatRoleHandler{db: db} + h.App = app + return &h +} + +// Add 添加一个聊天角色 +func (h *ChatRoleHandler) Add(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 == "" { + resp.ERROR(c, types.InvalidArgs) + return + } + + //err := h.service.Create(data) + //if err != nil { + // resp.ERROR(c, "Save failed: "+err.Error()) + // return + //} + + 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) + if res.Error != nil { + resp.ERROR(c, "No data found") + return + } + + for _, v := range items { + var role vo.ChatRole + err := utils.CopyObject(v, &role) + if err == nil { + role.Id = v.Id + role.CreatedAt = v.CreatedAt.Unix() + role.UpdatedAt = v.UpdatedAt.Unix() + roles = append(roles, role) + } + } + + resp.SUCCESS(c, roles) +} diff --git a/api/go/handler/admin/user_handler.go b/api/go/handler/admin/user_handler.go new file mode 100644 index 00000000..02945d8e --- /dev/null +++ b/api/go/handler/admin/user_handler.go @@ -0,0 +1,51 @@ +package admin + +import ( + "chatplus/core" + "chatplus/handler" + "chatplus/store/model" + "chatplus/store/vo" + "chatplus/utils" + "chatplus/utils/resp" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type UserHandler struct { + handler.BaseHandler + db *gorm.DB +} + +func NewUserHandler(app *core.AppServer, db *gorm.DB) *UserHandler { + h := UserHandler{db: db} + h.App = app + return &h +} + +// List 用户列表 +func (h *UserHandler) List(c *gin.Context) { + page := h.GetInt(c, "page", 1) + pageSize := h.GetInt(c, "page_size", 20) + offset := (page - 1) * pageSize + var items []model.User + var users = make([]vo.User, 0) + var total int64 + h.db.Model(&model.User{}).Count(&total) + res := h.db.Offset(offset).Limit(pageSize).Find(&items) + if res.Error == nil { + for _, item := range items { + var user vo.User + err := utils.CopyObject(item, &user) + if err == nil { + user.Id = item.Id + user.CreatedAt = item.CreatedAt.Unix() + user.UpdatedAt = item.UpdatedAt.Unix() + users = append(users, user) + } else { + logger.Error(err) + } + } + } + pageVo := vo.NewPage(total, page, pageSize, users) + resp.SUCCESS(c, pageVo) +} diff --git a/api/go/handler/chat_role_handler.go b/api/go/handler/chat_role_handler.go index 9ddb00bb..0f6c5f78 100644 --- a/api/go/handler/chat_role_handler.go +++ b/api/go/handler/chat_role_handler.go @@ -2,24 +2,21 @@ package handler import ( "chatplus/core" - "chatplus/core/types" - "chatplus/service" "chatplus/store/model" "chatplus/store/vo" "chatplus/utils" "chatplus/utils/resp" - "strconv" - "github.com/gin-gonic/gin" + "gorm.io/gorm" ) type ChatRoleHandler struct { BaseHandler - service *service.ChatRoleService + db *gorm.DB } -func NewChatRoleHandler(app *core.AppServer, service *service.ChatRoleService) *ChatRoleHandler { - handler := &ChatRoleHandler{service: service} +func NewChatRoleHandler(app *core.AppServer, db *gorm.DB) *ChatRoleHandler { + handler := &ChatRoleHandler{db: db} handler.App = app return handler } @@ -27,15 +24,15 @@ func NewChatRoleHandler(app *core.AppServer, service *service.ChatRoleService) * // List get user list func (h *ChatRoleHandler) List(c *gin.Context) { var roles []model.ChatRole - res := h.service.DB.Find(&roles) + res := h.db.Find(&roles) if res.Error != nil { resp.ERROR(c, "No roles found,"+res.Error.Error()) return } - userId, err := strconv.Atoi(c.Query("user_id")) - if err == nil && userId > 0 { + userId := h.GetInt(c, "user_id", 0) + if userId > 0 { var user model.User - h.service.DB.First(&user, userId) + h.db.First(&user, userId) var roleMap map[string]int err := utils.JsonDecode(user.ChatRoles, &roleMap) if err == nil { @@ -58,35 +55,3 @@ func (h *ChatRoleHandler) List(c *gin.Context) { } resp.SUCCESS(c, roleVos) } - -// Add 添加一个聊天角色 -func (h *ChatRoleHandler) Add(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 == "" { - resp.ERROR(c, types.InvalidArgs) - return - } - - err := h.service.Create(data) - if err != nil { - resp.ERROR(c, "Save failed: "+err.Error()) - return - } - - resp.SUCCESS(c, data) -} - -// Get 获取指定的角色 -func (h *ChatRoleHandler) Get(c *gin.Context) { - -} - -// Update 更新某个聊天角色信息,这里只允许更改名称以及启用和禁用角色操作 -func (h *ChatRoleHandler) Update(c *gin.Context) { - -} diff --git a/api/go/handler/user_handler.go b/api/go/handler/user_handler.go index 372d7d5f..d0e9efc9 100644 --- a/api/go/handler/user_handler.go +++ b/api/go/handler/user_handler.go @@ -105,31 +105,6 @@ func (h *UserHandler) Register(c *gin.Context) { resp.SUCCESS(c, user) } -func (h *UserHandler) List(c *gin.Context) { - var users []model.User - res := h.db.Find(&users) - if res.Error != nil { - resp.ERROR(c, "No user found") - logger.Error("get user failed: ", res.Error.Error()) - return - } - - // 转成 VO 输出 - var userVos = make([]vo.User, 0) - for _, u := range users { - logger.Info(u) - var v vo.User - err := utils.CopyObject(u, &v) - if err == nil { - v.Id = u.Id - v.CreatedAt = u.CreatedAt.Unix() - v.UpdatedAt = u.UpdatedAt.Unix() - userVos = append(userVos, v) - } - } - resp.SUCCESS(c, userVos) -} - // Login 用户登录 func (h *UserHandler) Login(c *gin.Context) { var data struct { diff --git a/api/go/main.go b/api/go/main.go index cc08532e..2a40ced7 100644 --- a/api/go/main.go +++ b/api/go/main.go @@ -6,7 +6,6 @@ import ( "chatplus/handler" "chatplus/handler/admin" logger2 "chatplus/logger" - "chatplus/service" "chatplus/store" "context" "flag" @@ -64,6 +63,7 @@ func main() { // 初始化数据库 fx.Provide(store.NewGormConfig), fx.Provide(store.NewMysql), + fx.Provide(store.NewLevelDB), // 创建 Ip2Region 查询对象 fx.Provide(func() (*xdb.Searcher, error) { @@ -76,11 +76,6 @@ func main() { return xdb.NewWithBuffer(cBuff) }), - // 初始化服务 - fx.Provide(store.NewLevelDB), - fx.Provide(service.NewChatRoleService), - fx.Invoke(core.InitChatRoles), - // 创建控制器 fx.Provide(handler.NewChatRoleHandler), fx.Provide(handler.NewUserHandler), @@ -89,6 +84,8 @@ func main() { fx.Provide(admin.NewAdminHandler), fx.Provide(admin.NewApiKeyHandler), + fx.Provide(admin.NewUserHandler), + fx.Provide(admin.NewChatRoleHandler), // 注册路由 fx.Invoke(func(s *core.AppServer, h *handler.ChatRoleHandler) { @@ -98,7 +95,6 @@ func main() { fx.Invoke(func(s *core.AppServer, h *handler.UserHandler) { group := s.Engine.Group("/api/user/") group.POST("register", h.Register) - group.GET("list", h.List) group.POST("login", h.Login) group.GET("logout", h.Logout) group.GET("session", h.Session) @@ -135,6 +131,16 @@ func main() { group.POST("add", h.Add) group.GET("list", h.List) }), + fx.Invoke(func(s *core.AppServer, h *admin.UserHandler) { + group := s.Engine.Group("/api/admin/user/") + group.GET("list", h.List) + }), + 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) + }), fx.Invoke(func(s *core.AppServer, db *gorm.DB) { err := s.Run(db) diff --git a/api/go/service/chat_role_service.go b/api/go/service/chat_role_service.go deleted file mode 100644 index 96ecfba0..00000000 --- a/api/go/service/chat_role_service.go +++ /dev/null @@ -1,35 +0,0 @@ -package service - -import ( - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "gorm.io/gorm" -) - -type ChatRoleService struct { - DB *gorm.DB - Model interface{} -} - -func NewChatRoleService(db *gorm.DB) *ChatRoleService { - return &ChatRoleService{DB: db, Model: &model.ChatRole{}} -} - -func (s *ChatRoleService) Create(value interface{}) error { - r, ok := value.(vo.ChatRole) - - if ok { - var role model.ChatRole - err := utils.CopyObject(r, &role) - if err != nil { - return err - } - - result := s.DB.Create(&role) - return result.Error - } else { - result := s.DB.Create(value) - return result.Error - } -} diff --git a/api/go/store/vo/page.go b/api/go/store/vo/page.go index d408d786..b47d49ee 100644 --- a/api/go/store/vo/page.go +++ b/api/go/store/vo/page.go @@ -1,5 +1,7 @@ package vo +import "math" + type Page struct { Items interface{} `json:"items"` Page int `json:"page"` @@ -9,12 +11,12 @@ type Page struct { } func NewPage(total int64, page int, pageSize int, items interface{}) Page { - totalPage := int(total / int64(pageSize)) + totalPage := math.Ceil(float64(total) / float64(pageSize)) return Page{ Items: items, Page: page, PageSize: pageSize, Total: total, - TotalPage: totalPage, + TotalPage: int(totalPage), } } diff --git a/web/src/views/admin/Admin.vue b/web/src/views/admin/Admin.vue index ee78f2b5..b61b95c9 100644 --- a/web/src/views/admin/Admin.vue +++ b/web/src/views/admin/Admin.vue @@ -77,7 +77,7 @@ - + diff --git a/web/src/views/admin/SysConfig.vue b/web/src/views/admin/SysConfig.vue index e9ce2d02..f4b2f2ba 100644 --- a/web/src/views/admin/SysConfig.vue +++ b/web/src/views/admin/SysConfig.vue @@ -46,10 +46,10 @@ - + - + diff --git a/web/src/views/admin/UserList.vue b/web/src/views/admin/UserList.vue index bf16f86c..83d0b4c5 100644 --- a/web/src/views/admin/UserList.vue +++ b/web/src/views/admin/UserList.vue @@ -1,28 +1,28 @@