mirror of
				https://github.com/yangjian102621/geekai.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	refactor: user remove is ready for console
This commit is contained in:
		@@ -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 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user