vue3+elementPlus之后台管理系统(从0到1)(day3-管理员管理)

devtools/2025/1/24 6:31:08/

管理员管理

搭建管理员页面

在views中创建一个manager文件夹,并创建ManagerIndexView.vue、MangagerListView.vue、UserList.vue

<!-- src/views/manager/ManagerIndexView.vue -->
<template><!--  作为一个占位符,用于渲染与当前 URL 匹配的组件 --><router-view></router-view>
</template><script>
</script>

1、获取到所有管理员数据

<!--src/api/user.js-->
//获取管理员列表
export function adminList(){return ajax({method:'GET',url:'admin/list'})
}

2、渲染管理员列表

<template><div><el-table :data="computedTableData" style="width: 100%"><!-- type="index" 标记为索引序号, label列标题,prop列的数据字段 --><el-table-column type="index" :index="(currentPage-1)*10+1" label="序号" width="80" /><el-table-column prop="adminname" label="管理员名称" width="180" /><el-table-column label="管理员权限"><template #default="scope"><!-- <div>{{ scope.row.role == 1?'管理员':'超级管理员' }}</div> --><el-tag :type="scope.row.role == 1?'':'success'">{{ scope.row.role == 1?'管理员':'超级管理员' }}</el-tag></template></el-table-column><el-table-column prop="adminname" label="操作" width="180" ><template #default><el-button size="small" type="primary">编辑</el-button><el-button size="small" type="success">删除</el-button></template></el-table-column></el-table><!-- 分页显示 --><el-pagination background v-model:current-page="currentPage" layout="prev, pager, next" :total="tableData.length" /></div></template><script>
import { adminList } from '@/api/user';export default{data(){return {tableData:[],//当前页码currentPage: 1,}},methods:{},mounted(){//获取管理员列表adminList().then(res=>{this.tableData=res.data;})},computed:{//计算当前页显示的数据computedTableData(){return this.tableData.slice((this.currentPage-1)*10,(this.currentPage-1)*10+10);}}
}
</script>

分页处理

<el-table :data="computedTableData" style="width: 100%"><el-table-column type="index" :index="(currentPage-1)*10+1" label="序号" width="80" />...
</el-table><!-- 分页显示 --><el-pagination background v-model:current-page="currentPage" layout="prev, pager, next" :total="tableData.length" />computed:{//计算当前页显示的数据computedTableData(){return this.tableData.slice((this.currentPage-1)*10,(this.currentPage-1)*10+10);}}

3、添加管理员的功能

页面布局,添加一个抽屉效果

<div class="header"><el-button type="success" @click="drawer=true">添加管理员</el-button>
</div><!--抽屉效果-->
<el-drawer v-model="drawer" title="添加管理员"><el-form label-with="120px"><el-form-item label="管理员账号"><el-input placeholder="请输入管理员账号" v-model="formData.adminname"/></el-form-item><el-form-item label="管理员密码"><el-input placeholder="请输入管理员密码" v-model="formData.password"/></el-form-item><el-form-item label="管理员角色"><el-select placeholder="请选择管理员角色" v-model="formData.role"><el-option label="管理员" value="管理员"></el-option><el-option label="超级管理员" value="超级管理员"></el-option></el-select></el-form-item><el-form-item><el-tree ref="treeRef":data="menus"show-checkbox></el-tree></el-form-item></el-form><el-button @click="add" type="primary">添加</el-button>
</el-drawer>

在添加按钮回调函数中获取我们用户输入的内容

将用户输入的内容发送给后端服务器

<!--src/api/user.js-->
//添加管理员
export function addAdmin(params){return ajax({method:'POST',url:'admin/add',data:params})
}

添加成功后关闭抽屉然后重新获取数据

 data(){return {//是否打开抽屉效果drawer: false,//路由信息menus: routes[0].children,//管理员数据formData:{adminname:'',password:'',role:'',checkedKeys:''}}},methods:{//获取树型结构中选中的值formatCheckedKeys(){//根据选中的值得到父级路由const list = this.$refs.treeRef.getCheckedNodes(true);//用来存放父级路由的labelconst tempList = [];//最终结果数组const result = [];//list是选中的子路由list.forEach(item=>{//parent:选中子路由的父级路由const parent = this.menus.find(mitem=>{return mitem.children.some(child=>child.label==item.label)})//判断当前父级路由是否已存在if(tempList.includes(parent.label)){result.find(item=>item.label==parent.label).children.push(item)}else{//将对应的内容放到tempList中tempList.push(parent.label)result.push({label:parent.label,path: parent.path,children:[item]})}})//将路由的权限添加到formData中this.formData.checkedKeys = result},add(){//将管理员数据发送给服务器//1、收集数据this.formatCheckedKeys()this.formData.role = this.formData.role =='管理员' ? '1':'2'//2、将数据添加到服务器中addAdmin(this.formData).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//关闭抽屉效果this.drawer=false//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})}},

4、修改管理员信息

添加一个drawerTitle属性判断是添加还是编辑管理员

<el-drawer @close="close" v-model="drawer" ><template #header><h4>{{ drawerTitle=='add'?'添加管理员':'编辑管理员' }}</h4></template>...<el-table-column prop="adminname" label="操作" width="180" ><template #default="scope"><el-button @click="edit(scope.row)" size="small" type="primary">编辑</el-button><el-button @click="deleteClick(scope.row)" size="small" type="success">删除</el-button></template></el-table-column>
</el-drawer>drawerTitle:'add'   //抽屉标题

打开抽屉,将当前数据渲染在抽屉中

请求前获取用户数据

将用户数据发送给后端

<!--src/api/user.js-->
//修改管理员
export function updateAdmin(params){return ajax({method:'POST',url:'admin/update',data:params})
}

重新加载最新数据

edit(row){//打开抽屉this.drawer=true;this.drawerTitle='edit'//获取当前一行数据this.formData.adminname = row.adminname;this.formData.password = row.password;this.formData.role = row.role=='1'?"管理员":'超级管理员';const checkedKeys = [];row.checkedKeys.forEach(parent=>{parent.children.forEach(item=>{checkedKeys.push(item.path)})})this.defaultCheckedKeys=checkedKeys;},close(){this.formData={};this.defaultCheckedKeys=[];if(this.$refs.treeRef){this.$refs.treeRef.setCheckedKeys([]);}},update(){if(this.formData.adminname==''||this.formData.password==''){ElMessage.error("管理员或密码不能为空!")return}this.formData.role = this.formData.role=='管理员'?'1':'2';//获取当前用户的权限this.formatCheckedKeys()//提交修改信息updateAdmin(this.formData).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//关闭抽屉效果this.drawer=false//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})},

5、删除管理员

添加点击时间,传递当前行数据

<el-button @click="deleteClick(scope.row)" size="small" type="success">删除</el-button>

发送删除请求进行删除,然后重新加载最新数据

<!--src/api/user.js-->
//删除管理员
export function deleteAdmin(params){return ajax({method:'POST',url:'admin/delete',data:params})
}

deleteClick(row){ElMessageBox.confirm('确定删除?','Warning',{confirmButtonText: 'OK',cancelButtonText: 'Cancel',type: 'warning',}).then(() => {deleteAdmin({adminid:row.adminid}).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})}).catch(() => {ElMessage({type: 'info',message: '删除取消',})})}

ManagerListView完整代码

<template><div><div class="header"><el-button type="success" @click="addClick">添加管理员</el-button></div><el-table :data="computedTableData" style="width: 100%"><!-- type="index" 标记为索引序号, label列标题,prop列的数据字段 --><el-table-column type="index" :index="(currentPage-1)*10+1" label="序号" width="80" /><el-table-column prop="adminname" label="管理员名称" width="180" /><el-table-column label="管理员权限"><template #default="scope"><!-- <div>{{ scope.row.role == 1?'管理员':'超级管理员' }}</div> --><el-tag :type="scope.row.role == 1?'':'success'">{{ scope.row.role == 1?'管理员':'超级管理员' }}</el-tag></template></el-table-column><el-table-column prop="adminname" label="操作" width="180" ><template #default="scope"><el-button @click="edit(scope.row)" size="small" type="primary">编辑</el-button><el-button @click="deleteClick(scope.row)" size="small" type="success">删除</el-button></template></el-table-column></el-table><!-- 分页显示 --><el-pagination background v-model:current-page="currentPage" layout="prev, pager, next" :total="tableData.length" /><el-drawer @close="close" v-model="drawer" ><template #header><h4>{{ drawerTitle=='add'?'添加管理员':'编辑管理员' }}</h4></template><el-form label-with="120px"><el-form-item label="管理员账号"><el-input placeholder="请输入管理员账号" v-model="formData.adminname"/></el-form-item><el-form-item label="管理员密码"><el-input placeholder="请输入管理员密码" v-model="formData.password"/></el-form-item><el-form-item label="管理员角色"><el-select placeholder="请选择管理员角色" v-model="formData.role"><el-option label="管理员" value="管理员"></el-option><el-option label="超级管理员" value="超级管理员"></el-option></el-select></el-form-item><el-form-item><el-tree ref="treeRef":data="menus"show-checkboxnode-key="path":default-checked-keys="defaultCheckedKeys":default-expand-all="true"></el-tree></el-form-item></el-form><el-button v-if="drawerTitle=='add'" @click="add" type="primary">添加</el-button><el-button v-else @click="update" type="primary">修改</el-button></el-drawer></div></template><script>
import { adminList, addAdmin, updateAdmin, deleteAdmin } from '@/api/user';
import { routes } from '@/router';
import { ElMessage } from 'element-plus';export default{data(){return {tableData:[],//当前页码currentPage: 1,//是否打开抽屉效果drawer: false,//路由信息menus: routes[0].children,//管理员数据formData:{adminname:'',password:'',role:'',checkedKeys:''},defaultCheckedKeys:[],drawerTitle:'add'   //抽屉标题}},methods:{addClick(){//打开抽屉this.drawer=true;this.drawerTitle='add'},//获取树型结构中选中的值formatCheckedKeys(){//根据选中的值得到父级路由const list = this.$refs.treeRef.getCheckedNodes(true);//用来存放父级路由的labelconst tempList = [];//最终结果数组const result = [];//list是选中的子路由list.forEach(item=>{//parent:选中子路由的父级路由const parent = this.menus.find(mitem=>{return mitem.children.some(child=>child.label==item.label)})//判断当前父级路由是否已存在if(tempList.includes(parent.label)){result.find(item=>item.label==parent.label).children.push(item)}else{//将对应的内容放到tempList中tempList.push(parent.label)result.push({label:parent.label,path: parent.path,children:[item]})}})//将路由的权限添加到formData中this.formData.checkedKeys = result},add(){//将管理员数据发送给服务器//1、收集数据this.formatCheckedKeys()this.formData.role = this.formData.role =='管理员' ? '1':'2'//2、将数据添加到服务器中addAdmin(this.formData).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//关闭抽屉效果this.drawer=false//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})},edit(row){//打开抽屉this.drawer=true;this.drawerTitle='edit'//获取当前一行数据this.formData.adminname = row.adminname;this.formData.password = row.password;this.formData.role = row.role=='1'?"管理员":'超级管理员';const checkedKeys = [];row.checkedKeys.forEach(parent=>{parent.children.forEach(item=>{checkedKeys.push(item.path)})})this.defaultCheckedKeys=checkedKeys;},close(){this.formData={};this.defaultCheckedKeys=[];if(this.$refs.treeRef){this.$refs.treeRef.setCheckedKeys([]);}},update(){if(this.formData.adminname==''||this.formData.password==''){ElMessage.error("管理员或密码不能为空!")return}this.formData.role = this.formData.role=='管理员'?'1':'2';//获取当前用户的权限this.formatCheckedKeys()//提交修改信息updateAdmin(this.formData).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//关闭抽屉效果this.drawer=false//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})},deleteClick(row){deleteAdmin({adminid:row.adminid}).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//重新获取数据adminList().then(res=>{this.tableData=res.data;})}else{ElMessage.error(res.message)}})}},mounted(){//获取管理员列表adminList().then(res=>{this.tableData=res.data;})},computed:{//计算当前页显示的数据computedTableData(){return this.tableData.slice((this.currentPage-1)*10,(this.currentPage-1)*10+10);}}
}
</script><style lang="scss" scoped>
.header{margin-bottom: 16px;
}
</style>


http://www.ppmy.cn/devtools/153066.html

相关文章

Scrapy中间件的使用

使用 Scrapy 中间件爬取网易新闻四大板块数据 在爬取动态加载网页数据时&#xff0c;我们经常需要结合 Scrapy 的强大爬虫框架和自动化工具的功能&#xff0c;来获取完整的页面数据。本文将以 网易新闻四大板块&#xff08;国内、国际、军事、航空&#xff09;数据爬取 为例&a…

Web安全:缓存欺骗攻击;基于缓存、CDN的新型Web漏洞

基于缓存、CDN的新型Web漏洞 漏洞原理利用方式解决方法 Web缓存欺骗漏洞&#xff08;Web Cache Deception&#xff09;是一种利用不安全的缓存机制来泄露用户敏感信息的攻击方式。攻击者通过操控请求URL诱导缓存系统将敏感信息缓存并对其他用户公开&#xff0c;可能导致用户数据…

Spring Boot整合WebSocket

目录 ?引言 1.WebSocket 基础知识 ?1.1 什么是 WebSocket&#xff1f; ?1.2 WebSocket 的应用场景 ?2.Spring Boot WebSocket 整合步骤 2.1 创建 Spring Boot 项目 2.2 添加 Maven 依赖 2.3 配置 WebSocket 2.4 创建 WebSocket 控制器 2.5 创建前端页面 引言 在…

《RWA全球产业白皮书》发布:向凌云教授解析全球经济转型与RWA的未来

2025年1月16日&#xff0c;旅美经济学家、全球新兴产业金融专家向凌云教授在美国发布了引人注目的《RWA全球产业白皮书》。该白皮书通过深入分析全球产业结构变化&#xff0c;尤其强调了“真实世界资产”&#xff08;Real-World Assets&#xff0c;简称RWA&#xff09;在当前及…

Flutter_学习记录_基本组件的使用记录

1.TextWidge的常用属性 1.1TextAlign: 文本对齐属性 常用的样式有&#xff1a; TextAlign.center 居中TextAlign.left 左对齐TextAlign.right 有对齐 使用案例&#xff1a; body: Center(child: Text(开启 TextWidget 的旅程吧&#xff0c;珠珠, 开启 TextWidget 的旅程吧&a…

基于 STM32 的智能农业温室控制系统设计

1. 引言 随着农业现代化的发展&#xff0c;智能农业温室控制系统对于提高农作物产量和质量具有重要意义。该系统能够实时监测温室内的环境参数&#xff0c;如温度、湿度、光照强度和土壤湿度等&#xff0c;并根据这些参数自动调节温室设备&#xff0c;如通风扇、加热器、加湿器…

docker-registry

安装依赖 apt install apache2-utils设置密码 htpasswd -Bbn 用户名 密码 >/data/registry_hub/passwd#docker私服部署 docker run -d -p 5000:5000 --name docker-registry -v /data/registry_hub/:/var/lib/registry -v /data/registry_hub/passwd:/auth/htpasswd \ -e …

【前端】CSS实战之音乐播放器

目录 播放器背景旋转音乐封面按钮进度条音量调节音乐信息按钮的效果JavaScript部分播放和暂停音乐切换音乐信息进度条 音量调节避免拖拽时的杂音音量调节条静音和解除静音 自动下一首实现一个小效果最终效果 播放器背景 <div class"play_box"></div>设置…