diff --git a/api/go/handler/admin/user_handler.go b/api/go/handler/admin/user_handler.go index 02945d8e..4b53987d 100644 --- a/api/go/handler/admin/user_handler.go +++ b/api/go/handler/admin/user_handler.go @@ -2,11 +2,13 @@ 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" ) @@ -49,3 +51,50 @@ func (h *UserHandler) List(c *gin.Context) { pageVo := vo.NewPage(total, page, pageSize, users) resp.SUCCESS(c, pageVo) } + +func (h *UserHandler) Update(c *gin.Context) { + var data struct { + Id uint `json:"id"` + Nickname string `json:"nickname"` + Calls int `json:"calls"` + ChatRoles []string `json:"chat_roles"` + ExpiredTime string `json:"expired_time"` + Status bool `json:"status"` + } + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + var user = model.User{ + Nickname: data.Nickname, + Calls: data.Calls, + Status: data.Status, + ChatRoles: utils.JsonEncode(data.ChatRoles), + ExpiredTime: utils.Str2stamp(data.ExpiredTime), + } + user.Id = data.Id + res := h.db.Updates(&user) + if res.Error != nil { + resp.ERROR(c, "更新数据库失败") + return + } + + resp.SUCCESS(c) +} + +func (h *UserHandler) InitUser(c *gin.Context) { + var users []model.User + h.db.Find(&users) + for _, u := range users { + var m map[string]int + var roleKeys = make([]string, 0) + utils.JsonDecode(u.ChatRoles, &m) + for k, _ := range m { + roleKeys = append(roleKeys, k) + } + u.ChatRoles = utils.JsonEncode(roleKeys) + h.db.Updates(&u) + + } + resp.SUCCESS(c, "SUCCESS") +} diff --git a/api/go/handler/chat_role_handler.go b/api/go/handler/chat_role_handler.go index 0f6c5f78..2a0f9f08 100644 --- a/api/go/handler/chat_role_handler.go +++ b/api/go/handler/chat_role_handler.go @@ -6,6 +6,7 @@ import ( "chatplus/store/vo" "chatplus/utils" "chatplus/utils/resp" + "github.com/gin-gonic/gin" "gorm.io/gorm" ) @@ -33,11 +34,11 @@ func (h *ChatRoleHandler) List(c *gin.Context) { if userId > 0 { var user model.User h.db.First(&user, userId) - var roleMap map[string]int - err := utils.JsonDecode(user.ChatRoles, &roleMap) + var roleKeys []string + err := utils.JsonDecode(user.ChatRoles, &roleKeys) if err == nil { for index, r := range roles { - if _, ok := roleMap[r.Key]; !ok { + if utils.ContainsStr(roleKeys, r.Key) { roles = append(roles[:index], roles[index+1:]...) } } diff --git a/api/go/handler/user_handler.go b/api/go/handler/user_handler.go index d0e9efc9..617e680a 100644 --- a/api/go/handler/user_handler.go +++ b/api/go/handler/user_handler.go @@ -62,9 +62,9 @@ func (h *UserHandler) Register(c *gin.Context) { // 默认订阅所有角色 var chatRoles []model.ChatRole h.db.Find(&chatRoles) - var roleMap = make(map[string]int) + var roleKeys = make([]string, 0) for _, r := range chatRoles { - roleMap[r.Key] = 1 + roleKeys = append(roleKeys, r.Key) } salt := utils.RandString(8) @@ -75,7 +75,7 @@ func (h *UserHandler) Register(c *gin.Context) { Avatar: "images/avatar/user.png", Salt: salt, Status: true, - ChatRoles: utils.JsonEncode(roleMap), + ChatRoles: utils.JsonEncode(roleKeys), ChatConfig: utils.JsonEncode(types.ChatConfig{ Temperature: h.App.ChatConfig.Temperature, MaxTokens: h.App.ChatConfig.MaxTokens, @@ -145,14 +145,10 @@ func (h *UserHandler) Login(c *gin.Context) { h.App.ChatSession.Put(sessionId, types.ChatSession{ClientIP: c.ClientIP(), UserId: user.Id, Username: data.Username, SessionId: sessionId}) // 加载用户订阅的聊天角色 - var roleMap map[string]int - err = utils.JsonDecode(user.ChatRoles, &roleMap) + var roleKeys []string + err = utils.JsonDecode(user.ChatRoles, &roleKeys) var chatRoles interface{} if err == nil { - roleKeys := make([]string, 0) - for key := range roleMap { - roleKeys = append(roleKeys, key) - } var roles []model.ChatRole res = h.db.Where("marker IN ?", roleKeys).Find(&roles) if res.Error == err { diff --git a/api/go/main.go b/api/go/main.go index 2a40ced7..b0b17f37 100644 --- a/api/go/main.go +++ b/api/go/main.go @@ -134,6 +134,8 @@ func main() { fx.Invoke(func(s *core.AppServer, h *admin.UserHandler) { group := s.Engine.Group("/api/admin/user/") group.GET("list", h.List) + group.POST("update", h.Update) + group.GET("test", h.InitUser) }), fx.Invoke(func(s *core.AppServer, h *admin.ChatRoleHandler) { group := s.Engine.Group("/api/admin/role/") diff --git a/api/go/store/vo/user.go b/api/go/store/vo/user.go index 120cb840..95b6a5ba 100644 --- a/api/go/store/vo/user.go +++ b/api/go/store/vo/user.go @@ -11,7 +11,7 @@ type User struct { Tokens int64 `json:"tokens"` // 剩余tokens Calls int `json:"calls"` // 剩余对话次数 ChatConfig types.ChatConfig `json:"chat_config"` // 聊天配置 - ChatRoles map[string]int `json:"chat_roles"` // 聊天角色集合 + ChatRoles []string `json:"chat_roles"` // 聊天角色集合 ExpiredTime int64 `json:"expired_time"` // 账户到期时间 Status bool `json:"status"` // 当前状态 LastLoginAt int64 `json:"last_login_at"` // 最后登录时间 diff --git a/web/src/views/admin/SysConfig.vue b/web/src/views/admin/SysConfig.vue index f4b2f2ba..9c3b3016 100644 --- a/web/src/views/admin/SysConfig.vue +++ b/web/src/views/admin/SysConfig.vue @@ -43,7 +43,14 @@ - + + + diff --git a/web/src/views/admin/UserList.vue b/web/src/views/admin/UserList.vue index 83d0b4c5..0378895d 100644 --- a/web/src/views/admin/UserList.vue +++ b/web/src/views/admin/UserList.vue @@ -45,12 +45,14 @@ @@ -68,40 +70,35 @@ - + - - - - - + @@ -119,48 +116,28 @@ import {nextTick, onMounted, reactive, ref} from "vue"; import {httpGet, httpPost} from "@/utils/http"; import {ElMessage} from "element-plus"; -import {arrayContains, dateFormat, removeArrayItem} from "@/utils/libs"; +import {dateFormat, removeArrayItem} from "@/utils/libs"; // 变量定义 const users = ref({}) const user = ref({chat_roles: []}) const roles = ref([]) -const showUserDialog = ref(false) const showUserEditDialog = ref(false) const rules = reactive({ - name: [{required: true, message: '请输入口令名称', trigger: 'change',}], - max_calls: [ + nickname: [{required: true, message: '请输入昵称', trigger: 'change',}], + calls: [ {required: true, message: '请输入提问次数'}, {type: 'number', message: '请输入有效数字'}, ], - remaining_calls: [ - {required: true, message: '请输入提问次数'}, - {type: 'number', message: '请输入有效数字'}, - ], - term: [ - {required: true, message: '请输入有效期', trigger: 'change'}, - {type: 'number', message: '请输入有效数字'}, - ], - number: [ - {required: true, message: '请输入口令数量', trigger: 'change'}, - {type: 'number', message: '请输入有效数字'}, - ], chat_roles: [{required: true, message: '请选择聊天角色', trigger: 'change'}], }) const loading = ref(true) -const userAddFormRef = ref(null) const userEditFormRef = ref(null) onMounted(() => { -// 获取口令列表 - httpGet('/api/admin/user/list', {page: 1, page_size: 20}).then((res) => { - users.value = res.data; - }).catch(() => { - ElMessage.error('加载用户列表失败') - }) - + fetchUserList(1, 20) // 获取角色列表 httpGet('/api/admin/role/list').then((res) => { roles.value = res.data; @@ -173,27 +150,16 @@ onMounted(() => { }) }) -// 选择角色事件 -const selectRole = function (items) { - if (arrayContains(items, 'all')) { - for (let i = 0; i < roles.value.length; i++) { - if (roles.value[i].key === 'all') { - continue - } - roles.value[i].disabled = true - form1.value.chat_roles = ['all'] - form2.value.chat_roles = ['all'] - form3.value.chat_roles = ['all'] - } - } else { - for (let i = 0; i < roles.value.length; i++) { - if (roles.value[i].key === 'all') { - continue - } - roles.value[i].disabled = false - } - } +const fetchUserList = function (page, pageSize) { + httpGet('/api/admin/user/list', {page: page, page_size: pageSize}).then((res) => { + users.value = res.data; + }).catch(() => { + ElMessage.error('加载用户列表失败') + }) +} +const disabledDate = (time) => { + return time.getTime() < Date.now() } // 删除用户 @@ -209,6 +175,7 @@ const removeUser = function (user) { } const userEdit = function (_user) { + _user.expired_time = dateFormat(_user.expired_time) user.value = _user showUserEditDialog.value = true } @@ -218,9 +185,7 @@ const updateUser = function () { userEditFormRef.value.validate((valid) => { if (valid) { showUserEditDialog.value = false - form2.value.term = parseInt(form2.value.term) - form2.value.remaining_calls = parseInt(form2.value.remaining_calls) - httpPost('/api/admin/user/update', form2.value).then(() => { + httpPost('/api/admin/user/update', user.value).then(() => { ElMessage.success('操作成功!') }).catch((e) => { ElMessage.error('操作失败,' + e.message)