You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
4.9 KiB
193 lines
4.9 KiB
<template>
|
|
<div class="user-container">
|
|
<el-card shadow="hover">
|
|
<template #header>
|
|
<div class="card-header">
|
|
<el-form :inline="true" :model="searchForm" class="search-form">
|
|
<el-form-item label="用户名">
|
|
<el-input v-model="searchForm.name" placeholder="输入姓名搜索" clearable @clear="fetchUserList" />
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-button type="primary" icon="Search" @click="searchUsers">搜索</el-button>
|
|
<el-button type="success" icon="Plus" @click="handleAdd">新增用户</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
<el-button @click="fetchUserList" icon="Refresh">刷新</el-button>
|
|
</div>
|
|
</template>
|
|
|
|
<el-table :data="userList" stripe style="width: 100%" v-loading="loading">
|
|
<el-table-column prop="id" label="ID" width="80" />
|
|
<el-table-column prop="name" label="用户名" />
|
|
<el-table-column prop="property" label="权限等级" width="100" />
|
|
<el-table-column prop="createAt" label="创建时间" />
|
|
|
|
<el-table-column label="操作" width="180" fixed="right">
|
|
<template #default="scope">
|
|
<el-button size="small" @click="handleEdit(scope.row)">编辑</el-button>
|
|
<el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-card>
|
|
|
|
<el-dialog v-model="dialogVisible" :title="form.id ? '编辑用户' : '新增用户'" width="30%">
|
|
<el-form :model="form" label-width="80px">
|
|
<el-form-item label="用户名">
|
|
<el-input v-model="form.name" />
|
|
</el-form-item>
|
|
<el-form-item label="密码">
|
|
<el-input v-model="form.pass" />
|
|
</el-form-item>
|
|
<el-form-item label="权限等级">
|
|
<el-input-number v-model="form.property" :min="1" :max="5" />
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button @click="closeDialog">取消</el-button>
|
|
<el-button type="primary" @click="submitForm">确定</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
<script setup lang="ts">
|
|
import {ref, onMounted, reactive} from 'vue'
|
|
import service from '../api/service.js' // 确保这是你封装好的 axios 实例
|
|
import { ElMessage } from 'element-plus'
|
|
|
|
const userList = ref([])
|
|
const loading = ref(false)
|
|
|
|
// 获取用户列表
|
|
const fetchUserList = async () => {
|
|
loading.value = true
|
|
try {
|
|
// 注意:这里的路径要对应你后端绑定的路由
|
|
const res = await service.get('/getUsers')
|
|
|
|
// GoFrame 规范路由通常返回 {code:0, data: { list: [], total: 0 }}
|
|
// 根据你后端的具体返回结构“剥壳”
|
|
if (res.code === 0 || res.code === 200) {
|
|
console.log(res.data)
|
|
userList.value = res.data.users
|
|
} else {
|
|
ElMessage.error(res.message || '获取数据失败')
|
|
}
|
|
} catch (error) {
|
|
console.error('Fetch Error:', error)
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
//面板可见度
|
|
const dialogVisible =ref(false)
|
|
|
|
//搜索
|
|
const searchForm = reactive({
|
|
name:""
|
|
})
|
|
|
|
//区分添加还是编辑
|
|
const addOrUpdate =ref(false)
|
|
|
|
//添加
|
|
const handleAdd=()=>{
|
|
dialogVisible.value=true
|
|
addOrUpdate.value=false
|
|
}
|
|
|
|
const form =reactive({
|
|
id:0,
|
|
name:"",
|
|
property:0,
|
|
pass:"",
|
|
})
|
|
|
|
|
|
|
|
//编辑
|
|
const handleEdit = (row: any) => {
|
|
addOrUpdate.value=true
|
|
dialogVisible.value = true
|
|
form.id = row.id
|
|
form.name = row.name
|
|
form.property = row.property
|
|
}
|
|
|
|
//删除
|
|
const handleDelete=(row: any)=>{
|
|
service.delete("/admin/user/delete",{params:{id:row.id}}).then(res=>{
|
|
if (res.code==200||res.code==0){
|
|
ElMessage.success("删除用户成功")
|
|
fetchUserList()
|
|
}
|
|
else {
|
|
ElMessage.error(res.message)
|
|
}
|
|
})
|
|
}
|
|
|
|
//保存编辑
|
|
const submitForm=()=>{
|
|
service.post("/admin/user/editUser",form).then(
|
|
res=>{
|
|
console.log(res)
|
|
if (res.code===0||res.code===200){
|
|
if (addOrUpdate.value){
|
|
ElMessage.success("更新成功")
|
|
}
|
|
else {
|
|
ElMessage.success("添加成功")
|
|
}
|
|
form.id = 0
|
|
form.name = ""
|
|
form.property = 0
|
|
form.pass=""
|
|
fetchUserList()
|
|
dialogVisible.value=false
|
|
}
|
|
else {
|
|
ElMessage.error(res.message)
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
const searchUsers=()=>{
|
|
service.get("/admin/user/search",{params:{keyword:searchForm.name}}).then(
|
|
res=>{
|
|
if (res.code==0||res.code==200){
|
|
userList.value=res.data.users
|
|
}
|
|
else {
|
|
ElMessage.error(res.message)
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
|
|
onMounted(() => {
|
|
fetchUserList()
|
|
})
|
|
|
|
//关闭窗口
|
|
const closeDialog=()=>{
|
|
dialogVisible.value=false
|
|
form.id=0
|
|
form.name=""
|
|
form.property=0
|
|
form.pass=""
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.user-container {
|
|
padding: 20px;
|
|
}
|
|
.card-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
}
|
|
</style>
|