refactor: user remove is ready for console

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

View File

@ -6,7 +6,6 @@ import (
"chatplus/utils"
"chatplus/utils/resp"
"context"
"encoding/gob"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
@ -51,7 +50,7 @@ func (s *AppServer) Init(debug bool) {
s.Engine.Use(sessionMiddleware(s.AppConfig))
s.Engine.Use(authorizeMiddleware(s))
s.Engine.Use(errorHandler)
gob.Register(model.User{})
//gob.Register(model.User{})
}
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)
return
}
var user = model.User{
Nickname: data.Nickname,
Calls: data.Calls,
Status: data.Status,
ChatRoles: utils.JsonEncode(data.ChatRoles),
ExpiredTime: utils.Str2stamp(data.ExpiredTime),
}
var user = model.User{}
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 {
resp.ERROR(c, "更新数据库失败")
return
@ -82,6 +83,41 @@ func (h *UserHandler) Update(c *gin.Context) {
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) {
var users []model.User
h.db.Find(&users)

View File

@ -135,6 +135,7 @@ func main() {
group := s.Engine.Group("/api/admin/user/")
group.GET("list", h.List)
group.POST("update", h.Update)
group.GET("remove", h.Remove)
group.GET("test", h.InitUser)
}),
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
ChatRoles string `gorm:"column:chat_roles_json"` // 聊天角色
ExpiredTime int64 // 账户到期时间
Status bool // 当前状态
Status bool `gorm:"default:true"` // 当前状态
LastLoginAt int64 // 最后登录时间
LastLoginIp string // 最后登录 IP
}

View File

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