user表role改为role_id;后台管理用户增删改查封装成component
This commit is contained in:
305
frontend/src/components/manage-list.vue
Normal file
305
frontend/src/components/manage-list.vue
Normal file
@@ -0,0 +1,305 @@
|
||||
<template>
|
||||
<div class="manage-list-container">
|
||||
<div v-if="tableData">
|
||||
<!-- 筛选 -->
|
||||
<div class="handle-box">
|
||||
<template v-for="field in searchFields">
|
||||
<el-input v-if="field.searchType == 'input'" v-model="query[field.field]"
|
||||
@keyup.enter.native="handleSearch" :placeholder="field.placeholder"
|
||||
class="handle-input mr10"></el-input>
|
||||
<el-select v-else-if="field.searchType == 'select'" v-model="query[field.field]" @change="handleSearch"
|
||||
:placeholder="field.placeholder" class="handle-select mr10">
|
||||
<el-option key="" :label="'全部' + field.placeholder" value=""></el-option>
|
||||
<el-option v-for="optKey in Object.keys(field.options)" :key="optKey" :label="field.options[optKey]" :value="optKey"></el-option>
|
||||
</el-select>
|
||||
<template v-else>{{ field }}</template>
|
||||
</template>
|
||||
<el-button type="primary" :icon="Search" @click="handleSearch">搜索</el-button>
|
||||
<el-button type="primary" :icon="Plus" @click="handleNew" v-permiss="props.editPermiss">新增</el-button>
|
||||
</div>
|
||||
<div>
|
||||
{{ query }}
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<el-table :data="tableData" border class="table" ref="multipleTable" header-cell-class-name="table-header">
|
||||
<el-table-column prop="id" label="ID" width="55" align="center"></el-table-column>
|
||||
<el-table-column v-for="field in tableFields" :prop="field.prop" :label="field.label"
|
||||
align="center"></el-table-column>
|
||||
<el-table-column label="操作" width="220" align="center">
|
||||
<template #default="scope">
|
||||
<el-button text :icon="Edit" @click="handleEdit(scope.$index, scope.row)"
|
||||
v-permiss="props.editPermiss">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button text :icon="Delete" class="red" @click="handleDelete(scope.$index, scope.row)"
|
||||
v-permiss="props.editPermiss">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页 -->
|
||||
<div class="pagination">
|
||||
<el-pagination background layout="total, prev, pager, next" :current-page="query.pageIndex"
|
||||
:page-size="query.pageSize" :total="pageTotal" @current-change="handlePageChange"></el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else style="padding-top: 11vh;">
|
||||
<el-empty description="暂无数据" />
|
||||
</div>
|
||||
|
||||
<!-- 新增 / 编辑弹出框 -->
|
||||
<el-dialog title="编辑" v-model="editVisible" width="30%">
|
||||
<el-form label-width="70px">
|
||||
<el-form-item label="用户名">
|
||||
<el-input v-model="form.username"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="角色">
|
||||
<el-select v-model="form.roleName" placeholder="角色类型" class="handle-select mr10">
|
||||
<el-option key="1" label="管理员" value="管理员"></el-option>
|
||||
<el-option key="2" label="普通用户" value="普通用户"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话">
|
||||
<el-input v-model="form.telephone"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="editVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="saveEdit">确 定</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { Delete, Edit, Search, Plus } from '@element-plus/icons-vue';
|
||||
import send_request from '../utils/send_request';
|
||||
|
||||
const props = defineProps({
|
||||
// 获取列表 接口函数
|
||||
'getListFunc': {
|
||||
type: Function,
|
||||
required: true,
|
||||
},
|
||||
// 修改、删除权限
|
||||
'editPermiss': {
|
||||
type: String,
|
||||
required: true,
|
||||
}
|
||||
})
|
||||
|
||||
// 筛选列
|
||||
const searchFields: any = ref([]);
|
||||
|
||||
const query = reactive({
|
||||
pageIndex: 1,
|
||||
pageSize: 10
|
||||
// 其他筛选条件
|
||||
});
|
||||
|
||||
// 表格数据
|
||||
const tableData: any = ref(null);
|
||||
|
||||
// 表格列
|
||||
const tableFields: any = ref([]);
|
||||
|
||||
// 总页数
|
||||
const pageTotal = ref(0);
|
||||
|
||||
// 新增/编辑 弹窗列
|
||||
const dialogFields: any = ref([]);
|
||||
|
||||
// 新增/编辑 弹窗
|
||||
const editVisible = ref(false);
|
||||
let form = reactive({} as any);
|
||||
let idx: number = -1;
|
||||
|
||||
// 获取表格数据
|
||||
const getData = async () => {
|
||||
props.getListFunc(query).then((data: any) => {
|
||||
console.log(data)
|
||||
|
||||
// 深拷贝一份
|
||||
let _tableData = JSON.parse(JSON.stringify(data.list));
|
||||
// 字段映射
|
||||
let fieldsMapper = data.fieldMapper;
|
||||
if (fieldsMapper) {
|
||||
// 对于每一个需要映射的字段
|
||||
for (let m of fieldsMapper) {
|
||||
// console.log("mapper", m)
|
||||
_tableData = _tableData.map((row: any) => {
|
||||
let oldValue = row[m.key]
|
||||
let newValue = m.mapper[oldValue]
|
||||
row[m.value] = newValue
|
||||
return row
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 表格列
|
||||
tableFields.value = data.columns
|
||||
.map((field: any) => {
|
||||
return { prop: field.prop, label: field.label }
|
||||
});
|
||||
// 表格数据
|
||||
tableData.value = _tableData;
|
||||
// 总页数
|
||||
pageTotal.value = data.total;
|
||||
|
||||
// 筛选字段
|
||||
searchFields.value = data.columns
|
||||
.filter((field: any) => field.canSearch)
|
||||
.map((field: any) => {
|
||||
let f: any = {
|
||||
placeholder: field.label,
|
||||
field: field.field,
|
||||
searchType: field.searchType,
|
||||
}
|
||||
switch (field.searchType) {
|
||||
case 'select':
|
||||
f.options = fieldsMapper.find((field: any) => field.key == f.field).mapper
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return f
|
||||
});
|
||||
console.log("searchFields", searchFields.value);
|
||||
|
||||
// 新增/修改弹窗列
|
||||
dialogFields.value = data.columns
|
||||
.map((field: any) => {
|
||||
if (typeof (query[field.field]) === "undefined") {
|
||||
query[field.field] = ''
|
||||
}
|
||||
let f: any = {
|
||||
label: field.label,
|
||||
field: field.field,
|
||||
editType: field.editType,
|
||||
}
|
||||
return f
|
||||
});
|
||||
console.log("dialogFields", dialogFields.value);
|
||||
|
||||
// 拼装 新增/修改弹窗 字段
|
||||
// form =
|
||||
})
|
||||
};
|
||||
|
||||
// 查询按钮
|
||||
const handleSearch = () => {
|
||||
query.pageIndex = 1;
|
||||
getData();
|
||||
};
|
||||
|
||||
// 分页导航
|
||||
const handlePageChange = (val: number) => {
|
||||
query.pageIndex = val;
|
||||
getData();
|
||||
};
|
||||
|
||||
// 删除操作
|
||||
const handleDelete = (index: number, row: any) => {
|
||||
idx = index;
|
||||
// 二次确认删除
|
||||
ElMessageBox.confirm('确定要删除吗?', '提示', { type: 'warning' })
|
||||
.then(async () => {
|
||||
await send_request('v1/user/delete', "POST", {
|
||||
userId: row.id
|
||||
}, (data: any) => {
|
||||
// console.log("delete index", index);
|
||||
// console.log(data);
|
||||
if (data) {
|
||||
ElMessage.success('删除成功');
|
||||
tableData.value.splice(idx, 1);
|
||||
}
|
||||
});
|
||||
|
||||
})
|
||||
.catch(() => { });
|
||||
};
|
||||
|
||||
// 点击进入编辑框
|
||||
const handleEdit = (index: number, row: any) => {
|
||||
idx = index;
|
||||
form.id = row.id;
|
||||
form.username = row.username;
|
||||
form.roleName = row.roleName;
|
||||
form.roleId = row.roleId;
|
||||
form.telephone = row.telephone;
|
||||
editVisible.value = true;
|
||||
};
|
||||
|
||||
// 编辑保存到数据库
|
||||
const saveEdit = async () => {
|
||||
editVisible.value = false;
|
||||
await send_request('v1/user/edit', "POST", {
|
||||
id: form.id,
|
||||
username: form.username,
|
||||
roleId: form.roleId,
|
||||
roleName: form.roleName,
|
||||
telephone: form.telephone
|
||||
}, (data: any) => {
|
||||
if (data) {
|
||||
ElMessage.success('修改成功');
|
||||
tableData.value[idx].username = form.username;
|
||||
tableData.value[idx].roleName = form.roleName;
|
||||
tableData.value[idx].telephone = form.telephone;
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
const handleNew = () => {
|
||||
editVisible.value = true;
|
||||
ElMessage.success(`修改第 ${idx + 1} 行成功`);
|
||||
tableData.value[idx].username = form.username;
|
||||
tableData.value[idx].roleName = form.roleName;
|
||||
tableData.value[idx].telephone = form.telephone;
|
||||
};
|
||||
|
||||
// 网页加载完成后加载数据
|
||||
onMounted(() => {
|
||||
getData();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.handle-box {
|
||||
margin-bottom: 20px;
|
||||
line-height: 2.5em;
|
||||
}
|
||||
|
||||
.handle-select {
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
.handle-input {
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
.table {
|
||||
width: 100%;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.red {
|
||||
color: #F56C6C;
|
||||
}
|
||||
|
||||
.mr10 {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.table-td-thumb {
|
||||
display: block;
|
||||
margin: auto;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
</style>
|
Reference in New Issue
Block a user