refactor: user remove is ready for console

This commit is contained in:
RockYang 2023-06-20 07:08:37 +08:00
parent 07da11d852
commit acde1c6742
5 changed files with 79 additions and 34 deletions

View File

@ -6,7 +6,6 @@ import (
"chatplus/utils" "chatplus/utils"
"chatplus/utils/resp" "chatplus/utils/resp"
"context" "context"
"encoding/gob"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie" "github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -51,7 +50,7 @@ func (s *AppServer) Init(debug bool) {
s.Engine.Use(sessionMiddleware(s.AppConfig)) s.Engine.Use(sessionMiddleware(s.AppConfig))
s.Engine.Use(authorizeMiddleware(s)) s.Engine.Use(authorizeMiddleware(s))
s.Engine.Use(errorHandler) s.Engine.Use(errorHandler)
gob.Register(model.User{}) //gob.Register(model.User{})
} }
func (s *AppServer) Run(db *gorm.DB) error { func (s *AppServer) Run(db *gorm.DB) error {

View File

@ -65,15 +65,16 @@ func (h *UserHandler) Update(c *gin.Context) {
resp.ERROR(c, types.InvalidArgs) resp.ERROR(c, types.InvalidArgs)
return return
} }
var user = model.User{ 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 user.Id = data.Id
res := h.db.Updates(&user) // 此处需要用 map 更新,用结构体无法更新 0 值
res := h.db.Model(&user).Updates(map[string]interface{}{
"nickname": data.Nickname,
"calls": data.Calls,
"status": data.Status,
"chat_roles_json": utils.JsonEncode(data.ChatRoles),
"expired_time": utils.Str2stamp(data.ExpiredTime),
})
if res.Error != nil { if res.Error != nil {
resp.ERROR(c, "更新数据库失败") resp.ERROR(c, "更新数据库失败")
return return
@ -82,6 +83,41 @@ func (h *UserHandler) Update(c *gin.Context) {
resp.SUCCESS(c) resp.SUCCESS(c)
} }
func (h *UserHandler) Remove(c *gin.Context) {
id := h.GetInt(c, "id", 0)
if id > 0 {
tx := h.db.Begin()
res := h.db.Where("id = ?", id).Delete(&model.User{})
if res.Error != nil {
resp.ERROR(c, "删除失败")
return
}
// 删除聊天记录
res = h.db.Where("user_id = ?", id).Delete(&model.ChatItem{})
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
// 删除聊天历史记录
res = h.db.Where("user_id = ?", id).Delete(&model.HistoryMessage{})
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
// 删除登录日志
res = h.db.Where("user_id = ?", id).Delete(&model.UserLoginLog{})
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
tx.Commit()
}
resp.SUCCESS(c)
}
func (h *UserHandler) InitUser(c *gin.Context) { func (h *UserHandler) InitUser(c *gin.Context) {
var users []model.User var users []model.User
h.db.Find(&users) h.db.Find(&users)

View File

@ -135,6 +135,7 @@ func main() {
group := s.Engine.Group("/api/admin/user/") group := s.Engine.Group("/api/admin/user/")
group.GET("list", h.List) group.GET("list", h.List)
group.POST("update", h.Update) group.POST("update", h.Update)
group.GET("remove", h.Remove)
group.GET("test", h.InitUser) group.GET("test", h.InitUser)
}), }),
fx.Invoke(func(s *core.AppServer, h *admin.ChatRoleHandler) { fx.Invoke(func(s *core.AppServer, h *admin.ChatRoleHandler) {

View File

@ -12,7 +12,7 @@ type User struct {
ChatConfig string `gorm:"column:chat_config_json"` // 聊天配置 json ChatConfig string `gorm:"column:chat_config_json"` // 聊天配置 json
ChatRoles string `gorm:"column:chat_roles_json"` // 聊天角色 ChatRoles string `gorm:"column:chat_roles_json"` // 聊天角色
ExpiredTime int64 // 账户到期时间 ExpiredTime int64 // 账户到期时间
Status bool // 当前状态 Status bool `gorm:"default:true"` // 当前状态
LastLoginAt int64 // 最后登录时间 LastLoginAt int64 // 最后登录时间
LastLoginIp string // 最后登录 IP LastLoginIp string // 最后登录 IP
} }

View File

@ -1,7 +1,8 @@
<template> <template>
<div class="user-list" v-loading="loading"> <div class="user-list" v-loading="loading">
<el-row> <el-row>
<el-table :data="users.items"> <el-table :data="users.items" :row-key="row => row.id" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55"/>
<el-table-column prop="username" label="用户名"/> <el-table-column prop="username" label="用户名"/>
<el-table-column prop="nickname" label="昵称"/> <el-table-column prop="nickname" label="昵称"/>
<el-table-column prop="calls" label="提问次数" width="100"/> <el-table-column prop="calls" label="提问次数" width="100"/>
@ -27,19 +28,7 @@
<el-table-column label="操作" width="180"> <el-table-column label="操作" width="180">
<template #default="scope"> <template #default="scope">
<el-button size="small" type="primary" @click="userEdit(scope.row)">编辑</el-button> <el-button size="small" type="primary" @click="userEdit(scope.row)">编辑</el-button>
<el-popconfirm <el-button size="small" type="danger" @click="removeUser(scope.row)">删除</el-button>
width="220"
confirm-button-text="确定"
cancel-button-text="取消"
title="确定删除该记录吗?"
:hide-after="0"
@confirm="removeUser(scope.row)"
>
<template #reference>
<el-button size="small" type="danger">删除</el-button>
</template>
</el-popconfirm>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -115,7 +104,7 @@
<script setup> <script setup>
import {nextTick, onMounted, reactive, ref} from "vue"; import {nextTick, onMounted, reactive, ref} from "vue";
import {httpGet, httpPost} from "@/utils/http"; import {httpGet, httpPost} from "@/utils/http";
import {ElMessage} from "element-plus"; import {ElMessage, ElMessageBox} from "element-plus";
import {dateFormat, removeArrayItem} from "@/utils/libs"; import {dateFormat, removeArrayItem} from "@/utils/libs";
// //
@ -164,14 +153,29 @@ const disabledDate = (time) => {
// //
const removeUser = function (user) { const removeUser = function (user) {
httpPost('/api/admin/user/remove', {name: user.name}).then(() => { ElMessageBox.confirm(
ElMessage.success('操作成功!') '此操作将会永久删除用户信息和聊天记录,确认操作吗?',
users.value = removeArrayItem(users.value, user, function (v1, v2) { '警告',
return v1.name === v2.name {
}) confirmButtonText: '确定',
}).catch((e) => { cancelButtonText: '取消',
ElMessage.error('操作失败,' + e.message) type: 'warning',
}) }
)
.then(() => {
httpGet('/api/admin/user/remove', {id: user.id}).then(() => {
ElMessage.success('操作成功!')
users.value.items = removeArrayItem(users.value.items, user, function (v1, v2) {
return v1.id === v2.id
})
}).catch((e) => {
ElMessage.error('操作失败,' + e.message)
})
})
.catch(() => {
ElMessage.info('操作被取消')
})
} }
const userEdit = function (_user) { const userEdit = function (_user) {
@ -195,6 +199,11 @@ const updateUser = function () {
} }
}) })
} }
const handleSelectionChange = function (rows) {
// TODO:
console.log(rows)
}
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>