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

管理员管理

搭建管理员页面

在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.rhkb.cn/news/5814.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSRF漏洞学习总结

一、什么是CSRF漏洞&#xff1f; CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09;是一种网络攻击&#xff0c;它利用受害者在受信任网站上的已认证会话&#xff0c;来执行非预期的行动。这种攻击的核心在于&#xff0c;攻击者能够诱使受害者…

前端Vue2项目使用md编辑器

项目中有一个需求&#xff0c;要在前端给用户展示内容&#xff0c;内容有 AI 生成的&#xff0c;返回来的是 md 格式&#xff0c;所以需要给用户展示 md 格式&#xff0c;并且管理端也可以编辑这个 md 格式的文档。 使用组件库 v-md-editor。 https://code-farmer-i.github.i…

【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

文章目录 前言&#x1f30d; 一.连接池❄️1. 传统获取Conntion问题分析❄️2. 数据库连接池❄️3.连接池之C3P0技术&#x1f341;3.1关键特性&#x1f341;3.2配置选项&#x1f341;3.3使用示例 ❄️4. 连接池之Druid技术&#x1f341; 4.1主要特性&#x1f341; 4.2 配置选项…

Codeforces Round 1000 (Div. 2)(前三题)

A. Minimal Coprime 翻译&#xff1a; 如果 l 和 r 互为同素数&#xff0c;则正整数 [l,r] 的一段称为同素段。 如果一个共素数段 [l,r] 不包含任何不等于它本身的共素数段&#xff0c;那么这个共素数段 [l,r] 就叫做最小共素数段。为了更好地理解这句话&#xff0c;可以参考注…

数据库事务详解

事务-1-数据库事务 今天聊一聊数据库的事务&#xff0c;这里以MySQL为例子。 在MySQL中&#xff0c;事务&#xff08;Transaction&#xff09;是一组SQL操作的集合&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;确保数据的一致性和完整性。事…

攻防世界GFSJ1012 pwnstack

题目编号&#xff1a;GFSJ1012 附件下载后是一个c和库文件&#xff1a; 获取在线场景是 1. 获取伪代码 Exeinfo打开pwn2&#xff0c;分析如图&#xff0c;64位。 IDA Pro(64-bit)打开pwn2&#xff0c;生成伪代码 2. 分析代码漏洞 /* This file was generated by the Hex-Rays …

最小距离和与带权最小距离和

1. 等权中位数 背景&#xff1a; 给定一系列整数&#xff0c;求一个整数x使得x在数轴上与所有整数在数轴上的距离和最小。 结论&#xff1a; 这一系列的整数按顺序排好后的中位数(偶数个整数的中位数取 n 2 或 n 2 1 \frac{n}{2}或\frac{n}{2}1 2n​或2n​1都可)一定是所求点…

【LeetCode 刷题】栈与队列-队列的应用

此博客为《代码随想录》栈与队列章节的学习笔记&#xff0c;主要内容为队列的应用相关的题目解析。 文章目录 239. 滑动窗口最大值347. 前 K 个高频元素 239. 滑动窗口最大值 题目链接 class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]…

【优选算法】5----有效三角形个数

又是一篇算法题&#xff0c;今天早上刚做的热乎的~ 其实我是想写博客但不知道写些什么&#xff08;就水一下啦&#xff09; -------------------------------------begin----------------------------------------- 题目解析: 这道题的题目算是最近几道算法题里面题目最短的&a…

Golang:使用DuckDB查询Parquet文件数据

本文介绍DuckDB查询Parquet文件的典型应用场景&#xff0c;掌握DuckDB会让你的产品分析能力更强&#xff0c;相反系统运营成本相对较低。为了示例完整&#xff0c;我也提供了如何使用Python导出MongoDB数据。 Apache Parquet文件格式在存储和传输大型数据集方面变得非常流行。最…

HTTP 配置与应用(局域网)

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识&#xff0c;下次更新HTTP 配置与应用&#xff08;不同网段&#xff09;。 我是一个萌新小白&#xf…

免费!无水印下载!

软件介绍 这个工具可方便啦&#xff0c;不管是小红书上那些时尚的美照&#xff0c;还是特别搞笑的视频&#xff0c;只要你想下载&#xff0c;轻轻一点就能保存。真的是实现了一键下载&#xff0c;完全没有复杂的操作。下载下来的内容会智能分类呢。这样的话&#xff0c;你的资源…

第二届国赛铁三wp

第二届国赛 缺东西去我blog找&#x1f447; 第二届长城杯/铁三 | DDLS BLOG web Safe_Proxy 源码题目 from flask import Flask, request, render_template_stringimport socketimport threadingimport htmlapp Flask(__name__)app.route(/, methods"GET"])de…

【深度学习】嘿马深度学习笔记第11篇:卷积神经网络,学习目标【附代码文档】

本教程的知识点为&#xff1a;深度学习介绍 1.1 深度学习与机器学习的区别 TensorFlow介绍 2.4 张量 2.4.1 张量(Tensor) 2.4.1.1 张量的类型 TensorFlow介绍 1.2 神经网络基础 1.2.1 Logistic回归 1.2.1.1 Logistic回归 TensorFlow介绍 总结 每日作业 神经网络与tf.keras 1.3 …

STranslate 中文绿色版即时翻译/ OCR 工具 v1.3.1.120

STranslate 是一款功能强大且用户友好的翻译工具&#xff0c;它支持多种语言的即时翻译&#xff0c;提供丰富的翻译功能和便捷的使用体验。STranslate 特别适合需要频繁进行多语言交流的个人用户、商务人士和翻译工作者。 软件功能 1. 即时翻译&#xff1a; 文本翻译&#xff…

缓存之美:万文详解 Caffeine 实现原理(下)

上篇文章&#xff1a;缓存之美&#xff1a;万文详解 Caffeine 实现原理&#xff08;上&#xff09; getIfPresent 现在我们对 put 方法有了基本了解&#xff0c;现在我们继续深入 getIfPresent 方法&#xff1a; public class TestReadSourceCode {Testpublic void doRead() …

GPT 结束语设计 以nanogpt为例

GPT 结束语设计 以nanogpt为例 目录 GPT 结束语设计 以nanogpt为例 1、简述 2、分词设计 3、结束语断点 1、简述 在手搓gpt的时候&#xff0c;可能会遇到一些性能问题&#xff0c;即关于是否需要全部输出或者怎么节约资源。 在输出语句被max_new_tokens 限制&#xff0c…

HackTheBox靶机:Sightless;NodeJS模板注入漏洞,盲XSS跨站脚本攻击漏洞实战

HackTheBox靶机&#xff1a;Sightless 渗透过程1. 信息收集常规探测深入分析 2. 漏洞利用&#xff08;CVE-2022-0944&#xff09;3. 从Docker中提权4. 信息收集&#xff08;michael用户&#xff09;5. 漏洞利用 Froxlor6. 解密Keepass文件 漏洞分析SQLPad CVE-2022-0944 靶机介…

XML外部实体注入--XML基础

一.XML基础 1.XML 基础概念 定义&#xff1a;XML 即可扩展标记语言&#xff08;Extensible Markup Language&#xff09;&#xff0c;用于标记电子文件&#xff0c;使其具有结构性。它是一种允许用户对自己的标记语言进行定义的源语言&#xff0c;可用来标记数据、定义数据类型…

YOLOv8改进,YOLOv8检测头融合DSConv(动态蛇形卷积),并添加小目标检测层(四头检测),适合目标检测、分割等

精确分割拓扑管状结构例如血管和道路,对各个领域至关重要,可确保下游任务的准确性和效率。然而,许多因素使任务变得复杂,包括细小脆弱的局部结构和复杂多变的全局形态。在这项工作中,注意到管状结构的特殊特征,并利用这一知识来引导 DSCNet 在三个阶段同时增强感知:特征…