当前位置: 首页 > article >正文

vue3+elementPlus之后台管理系统(从0到1)(day4-完结)

面包屑

创建一个面包屑组件

将路由导入然后格式化map对象 key-value

将当前路由的key和value获取然后存入list数组中

遍历list数据,渲染内容

<!--BreadcrumbCom.vue-->
<template><el-breadcrumb separator=">"><el-breadcrumb-item v-for="item in list" :key="item.name" :to="{ name: item.name }">{{ item.label }}</el-breadcrumb-item></el-breadcrumb></template><script>
import { routes } from '@/router';
export default{data(){//用来记录所有路由对应的labelthis.routesMap = new Map()//用来将路由处理成mapthis.initRoutesMap(routes)return{list:[],}},mounted(){},methods:{initRoutesMap(routes){routes.forEach(route => {this.routesMap.set(route.name, route.label)//如果有子路由if(route.children){this.initRoutesMap(route.children)}});}},watch:{$route:{immediate:true,handler(route){//处理路径this.list = route.matched.map(item=>{return {name:item.name,label:this.routesMap.get(item.name)}})}}}
}
</script><style lang="scss" scoped>
.el-breadcrumb {margin-bottom: 20px;
}
</style>

动态菜单

在store/index.js中创建全局变量记录当前路由路径,并创建修改方法

//记录当前路由路径
currentPath:'/'//修改路由路径的方法
updateCurrentPath(state, value){state.currentPath = value
} 

在AsideCom.vue中加载菜单

<template><el-menu default-active="currentPath" :collapse="collapse" router class="el-menu-vertical-demo"><el-menu-item index="/">首页</el-menu-item><el-sub-menu v-for="item in userInfo.checkedkeys" :key="item.path" :index="item.path"><template #title><el-icon><Avatar /></el-icon><span>{{ item.label }}</span></template><el-menu-item v-for="child in item.children" :key="child.path" :index="`/${item.path}/${child.path}`">{{ child.label }}</el-menu-item></el-sub-menu><!-- <el-sub-menu index="/manager"><template #title><el-icon><Avatar /></el-icon><span>账号管理</span></template><el-menu-item index="/manager/managerlist">管理员列表</el-menu-item><el-menu-item index="/manager/userlist">用户列表</el-menu-item></el-sub-menu>  <el-sub-menu index="/banner"><template #title><el-icon><Avatar /></el-icon><span>轮播图管理</span></template><el-menu-item index="/banner/bannerlist">轮播图列表</el-menu-item><el-menu-item index="/banner/addbanner">添加轮播图</el-menu-item></el-sub-menu>   --></el-menu>
</template><script>
import { Avatar } from '@element-plus/icons-vue';
import { mapState } from 'vuex'; export default{data(){return{}},computed:{...mapState(['currentPath','userInfo'])},components:{Avatar,},props:['collapse']}
</script>

轮播图管理

获取轮播图数据

//导入封装的axios
import ajax from "@/utils/axios";//获取轮播图列表
export function bannerList(){return ajax({method:'GET',url:'banner/list'})
}//添加轮播图
export function addBanner(params){return ajax({method:'POST',url:'banner/add',data:params})
}

创建轮播图页面

<!--BannerListView.vue-->
<template><div><el-table :data="bannerList" ><el-table-column type="index"></el-table-column><el-table-column prop="img" label="图片"><template #default="scope"><div style="display: flex;align-items: center;"><el-image :src="scope.row.img"></el-image></div></template></el-table-column><el-table-column prop="alt" label="提示信息"></el-table-column><el-table-column prop="link" label="链接"></el-table-column></el-table></div></template><script>
import { bannerList } from '@/api/banner';export default{data(){return {bannerList:[]}},mounted(){bannerList().then(res=>{this.bannerList=res.data})}
}
</script><style lang="scss" scoped>
.el-image{width: 80px;
}
</style>

添加轮播图

<!--AddBannerView.vue-->
<template><div><el-form><el-form-item label="请输入alt"><el-input v-model="formData.alt" placeholder="请输入alt"/></el-form-item><el-form-item label="请输入link"><el-input v-model="formData.link" placeholder="请输入link"/></el-form-item><el-form-item><el-uploadclass="avatar-uploader":http-request="httpRequest":show-file-list="false"><img v-if="imageUrl" :src="imageUrl" class="avatar" /><el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon></el-upload></el-form-item><el-button @click="addBanner" type="primary">添加</el-button></el-form></div>
</template><script>
import { addBanner } from '@/api/banner';
import { Plus } from '@element-plus/icons-vue';
import { ElMessage } from 'element-plus';export default{data(){return {imageUrl:'',formData:{alt:'',link:'',img:''}}},components:{Plus},methods:{httpRequest(data){//根据文件生成一个url地址,该地址用于临时展示的//this.imageUrl = URL.createObjectURL(data.file)//1、获取用户选择的图片//2、将图片上传到存放图片的服务器,该服务器会返给图片地址//3、将图片地址发送给后端存储//创建一个文件加载器let reader = new FileReader()//指定其加载开始加载文件reader.readAsDataURL(data.file)//加载完成后的回调函数reader.onload=()=>{this.imageUrl = reader.result;   //图片的base64this.formData.img = reader.result;}},addBanner(){addBanner(this.formData).then(res=>{if(res.code=='200'){ElMessage.success(res.message)//提交成功后进入轮播图列表查看this.$router.push('/banner/bannerlist')}else{ElMessage.error(res.message)}})}}
}</script>
<style>
.avatar-uploader .el-upload {border: 1px dashed var(--el-border-color);border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;transition: var(--el-transition-duration-fast);
}.avatar-uploader .el-upload:hover {border-color: var(--el-color-primary);
}.el-icon.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;text-align: center;
}
</style><style lang="scss" scoped>
.avatar-uploader .avatar {width: 178px;height: 178px;display: block;
}
</style>

图表管理echarts

官网:Apache ECharts

安装echarts

npm install echarts

导入图表

将图表绑定在指定元素上

设置一个option

<template><div><el-button @click="changeType('line')">折线图</el-button><el-button @click="changeType('bar')" type="primary">柱状图</el-button><el-button @click="changeType('pie')" type="success">饼图</el-button><el-button @click="changeType('scatter')" type="info">散点图</el-button><el-button @click="changeType('line',['冰箱','空调','电视机','电磁炉'],['100','180','200','160'])" type="warning">电器销量</el-button><el-button @click="changeType('bar',['草莓','香蕉','西瓜','樱桃','甘蔗','橘子','橙子'],['200','111','222','333','210','123','20'])" type="danger">水果销量</el-button></div><div id="main"></div>
</template><script>
import * as echarts from 'echarts';export default{data(){return {mychart: null}},methods:{changeType(type,x,y){// 绘制图表this.myChart.setOption({title: {text: 'ECharts 入门示例'},tooltip: {},toolbox: {feature: {saveAsImage: {}}},xAxis: {data: x || ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']},yAxis: {},series: [{name: '销量',type: type||'bar',data: y || [5, 20, 36, 10, 10, 20]}]});}},mounted(){// 基于准备好的dom,初始化echarts实例this.myChart = echarts.init(document.getElementById('main'));this.changeType('bar')}
}</script><style lang="scss" scoped>
#main{height: 600px;background-color: white;
}
</style>

文件导入 excel

安装

npm install xlsx

选择文件

将文件读成数据流

将数据流读为对象

将对象中的工作表内容读取出来

将读取的内容转为json

数据渲染

<template><div><el-button type="success" @click="importClick">选择文件</el-button><input ref="inp" hidden type="file" @change="importChange"/><el-table :data="computedTableData" ><el-table-column type="index" :index="(currentPage-1)*10+1" label="序号" width="80" /><el-table-column prop="nickname" label="昵称"></el-table-column><el-table-column label="性别"><template #default="scope"><span>{{ scope.row.sex == -1?'女':'男' }}</span></template></el-table-column><el-table-column prop="tel" label="联系电话"></el-table-column></el-table><!-- 分页显示 --><el-pagination background v-model:current-page="currentPage" layout="prev, pager, next" :total="userList.length" /></div>
</template><script>
import * as XLSX from 'xlsx'export default{data(){return {userList:[],currentPage: 1}},methods:{importClick(){//选择文件按钮的点击事件this.$refs.inp.click()},importChange(event){//选中文件后的回调函数//console.log(event.target.files[0])//获取选中的文件const file = event.target.files[0];//创建文件的加载器const reader = new FileReader();//将文件读取成数据流reader.readAsBinaryString(file);reader.onload = () => {//将文件转换成js对象const boxx = XLSX.read(reader.result,{type:'binary'})//将工作表1中的数据提取出来let res = boxx.Sheets['工作表1'];//将工作表1中的数据转换成jsonres = XLSX.utils.sheet_to_json(res);this.userList = res;}}},mounted(){},computed:{//计算当前页显示的数据computedTableData(){return this.userList.slice((this.currentPage-1)*10,(this.currentPage-1)*10+10);}}
}
</script>

文件导出 excel

使用文档:js-export-excel - npm

安装

npm install js-export-excel

1、导入使用函数

2、创建导出对象

3、定义导出内容

4、实现具体导出

<template><div><!-- 文件导出有两种方式:1)直接使用a标签 --><!-- <a href="https://code.jquery.com/jquery-3.6.2.min.js" download=""></a> --><!-- 2)自己将数据处理后本地保存 --><el-button @click="exportClick">文件导出</el-button><el-table :data="computedTableData" ><el-table-column type="index" :index="(currentPage-1)*10+1" label="序号" width="80" /><el-table-column prop="nickname" label="昵称"></el-table-column><el-table-column label="性别"><template #default="scope"><span>{{ scope.row.sex == -1?'女':'男' }}</span></template></el-table-column><el-table-column prop="tel" label="联系电话"></el-table-column></el-table><!-- 分页显示 --><el-pagination background v-model:current-page="currentPage" layout="prev, pager, next" :total="userList.length" /></div>
</template><script>
import { userList } from '@/api/user';
//1、导入使用函数
import ExportJsonExcel from 'js-export-excel';
export default{data(){return {userList:[],currentPage: 1}},mounted(){userList().then(res=>{this.userList = res.data;})},methods:{exportClick(){//2、创建导出对象let option= {}//导出文件名字option.fileName = 'userList'//导出内容option.datas = [{//需要导出的数据sheetData:this.userList,//工作表名称sheetName: "工作表1",sheetFilter: ["nickname", "sex", "tel"],sheetHeader: ["昵称", "性别", "联系电话"],columnWidths: [20, 20],}];//实现具体导出var toExcel = new ExportJsonExcel(option); //newtoExcel.saveExcel(); //保存}},computed:{//计算当前页显示的数据computedTableData(){return this.userList.slice((this.currentPage-1)*10,(this.currentPage-1)*10+10);}}
}
</script>

富文本编辑器

官方文档:TinyMCE 7 Documentation | TinyMCE Documentation

安装:

npm install @tinymce/tinymce-vue tinymce 
或npm install --save tinymce "@tinymce/tinymce-vue@^5"

使用,需要申请api-key

<template><div><Editor></Editor></div>
</template><script>
import Editor from '@tinymce/tinymce-vue'
export default{data(){return {}},mounted(){},components:{Editor,}
}</script><style lang="scss" scoped></style>

相关文章:

vue3+elementPlus之后台管理系统(从0到1)(day4-完结)

面包屑 创建一个面包屑组件 将路由导入然后格式化map对象 key-value 将当前路由的key和value获取然后存入list数组中 遍历list数据&#xff0c;渲染内容 <!--BreadcrumbCom.vue--> <template><el-breadcrumb separator">"><el-breadcrum…...

基于Flask的旅游系统的设计与实现

【Flask】基于Flask的旅游系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为后端开发语言&#xff0c;结合前端Bootstrap框架&#xff0c;为用户提供了丰富…...

代码随想录31

目录 leetcode135.分发糖果 思路&#xff1a; leetcode860.柠檬水找零 思路&#xff1a;就是一个个遍历然后判断&#xff0c;用哈希表存储数。 leetcode406.根据身高重建队列 leetcode135.分发糖果 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需…...

【公因数匹配——暴力、(质)因数分解、哈希】

题目 暴力代码&#xff0c;Acwing 8/10&#xff0c;官网AC #include <bits/stdc.h> using namespace std; const int N 1e610; vector<int> nums[N]; int main() {ios::sync_with_stdio(0);cin.tie(0);int n;cin >> n;for(int i 1; i < n; i){int x;ci…...

WPS数据分析000010

基于数据透视表的内容 一、排序 手动调动 二、筛选 三、值显示方式 四、值汇总依据 五、布局和选项 不显示分类汇总 合并居中带标签的单元格 空单元格显示 六、显示报表筛选页...

RabbitMQ 架构分析

文章目录 前言一、RabbitMQ架构分析1、Broker2、Vhost3、Producer4、Messages5、Connections6、Channel7、Exchange7、Queue8、Consumer 二、消息路由机制1、Direct Exchange2、Topic Exchange3、Fanout Exchange4、Headers Exchange5、notice5.1、备用交换机&#xff08;Alter…...

127周一复盘 (165)玩法与难度思考

1.上午测试&#xff0c;小改了点东西&#xff0c; 基本等于啥也没干。 匆忙赶往车站。 从此进入春节期间&#xff0c;没有开发&#xff0c;而思考与设计。 2.火车上思考玩法与难度的问题。 目前的主流作法实际上并不完全符合不同玩家的需求&#xff0c; 对这方面还是要有自…...

Spring--SpringMVC使用(接收和响应数据、RESTFul风格设计、其他扩展)

SpringMVC使用 二.SpringMVC接收数据2.1访问路径设置2.2接收参数1.param和json2.param接收数据3 路径 参数接收4.json参数接收 2.3接收cookie数据2.4接收请求头数据2.5原生api获取2.6共享域对象 三.SringMVC响应数据3.1返回json数据ResponseBodyRestController 3.2返回静态资源…...

git Bash通过SSH key 登录github的详细步骤

1 问题 通过在windows 终端中的通过git登录github 不再是通过密码登录了&#xff0c;需要本地生成一个密钥&#xff0c;配置到gihub中才能使用 2 步骤 &#xff08;1&#xff09;首先配置用户名和邮箱 git config --global user.name "用户名"git config --global…...

在计算机上本地运行 Deepseek R1

Download Ollama on Linux Download Ollama on Windows Download Ollama on macOS Deepseek R1 是一个强大的人工智能模型&#xff0c;在科技界掀起了波澜。它是一个开源语言模型&#xff0c;可以与 GPT-4 等大玩家展开竞争。但更重要的是&#xff0c;与其他一些模型不同&…...

基于51单片机和ESP8266(01S)、LCD1602、DS1302、独立按键的WiFi时钟

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、延时2、定时器03、串口通信4、DS13025、LCD16026、独立按键 四、主函数总结 系列文章目录 前言 之前做了一个WiFi定时器时钟&#xff0c;用八位数码管进行显示&#xff0c;但是定时器时钟的精度较低&#xff0…...

机器学习 ---逻辑回归

逻辑回归是属于机器学习里面的监督学习&#xff0c;它是以回归的思想来解决分类问题的一种非常经典的二分类分类器。由于其训练后的参数有较强的可解释性&#xff0c;在诸多领域中&#xff0c;逻辑回归通常用作 baseline 模型&#xff0c;以方便后期更好的挖掘业务相关信息或提…...

拟合损失函数

文章目录 拟合损失函数一、线性拟合1.1 介绍1.2 代码可视化1.2.1 生成示例数据1.2.2 损失函数1.2.3 绘制三维图像1.2.4 绘制等高线1.2.5 损失函数关于斜率的函数 二、 多变量拟合2.1 介绍2.2 代码可视化2.2.1 生成示例数据2.2.2 损失函数2.2.3 绘制等高线 三、 多项式拟合3.1 介…...

【C++基础】多线程并发场景下的同步方法

如果在多线程程序中对全局变量的访问没有进行适当的同步控制&#xff08;例如使用互斥锁、原子变量等&#xff09;&#xff0c;会导致多个线程同时访问和修改全局变量时发生竞态条件&#xff08;race condition&#xff09;。这种竞态条件可能会导致一系列不确定和严重的后果。…...

Linux常见问题解决方法--1

常见安全工具、设备 工具 端口及漏洞扫描&#xff1a;Namp、Masscan 抓包&#xff1a;Wireshark&#xff0c;Burpsuite、Fiddler、HttpCanary Web自动化安全扫描&#xff1a;Nessus、Awvs、Appscan、Xray 信息收集&#xff1a;Oneforall、hole 漏洞利用&#xff1a;MSF、…...

银行卡三要素验证接口:方便快捷地实现银行卡核验功能

银行卡三要素验证API&#xff1a;防止欺诈交易的有力武器 随着互联网的发展&#xff0c;电子支付方式也越来越普及。在支付过程中&#xff0c;银行卡是最常用的支付工具之一。然而&#xff0c;在一些支付场景中&#xff0c;需要对用户的银行卡信息进行验证&#xff0c;以确保支…...

利用JSON数据类型优化关系型数据库设计

利用JSON数据类型优化关系型数据库设计 前言 在关系型数据库中&#xff0c;传统的结构化存储方式要求预先定义好所有的列及其数据类型。 然而&#xff0c;随着业务的发展&#xff0c;这种设计可能会显得不够灵活&#xff0c;尤其是在需要扩展单个列的描述功能时。 JSON数据…...

极简壁纸js逆向

首先抓包&#xff0c;翻页可以看到数据储存在该包 可以看到随着页面变化&#xff0c;只有current在变化 而且载荷都没有加密&#xff0c;看来不用js逆向了 爬取代码 import os import asyncio import aiohttp import jsonheaders {"accept": "application/j…...

Kafka 入门与应用实战:吞吐量优化与与 RabbitMQ、RocketMQ 的对比

前言 在现代微服务架构和分布式系统中&#xff0c;消息队列作为解耦组件&#xff0c;承担着重要的职责。它不仅提供了异步处理的能力&#xff0c;还能确保系统的高可用性、容错性和扩展性。常见的消息队列包括 Kafka、RabbitMQ 和 RocketMQ&#xff0c;其中 Kafka 因其高吞吐量…...

JAVA 接口、抽象类的关系和用处 详细解析

接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口&#xff0c;可以只选择实现接口中的 部分方法&#xff08;所有的方法都要有&#xff0c;可以一部分已经写具体&#xff0c;另一部分继续保留抽象&#xff09;&#xff0c;原因在于&#xff1a; 抽象类本身…...

数据结构与算法再探(六)动态规划

目录 动态规划 (Dynamic Programming, DP) 动态规划的基本思想 动态规划的核心概念 动态规划的实现步骤 动态规划实例 1、爬楼梯 c 递归&#xff08;超时&#xff09;需要使用记忆化递归 循环 2、打家劫舍 3、最小路径和 4、完全平方数 5、最长公共子序列 6、0-1背…...

使用PC版本剪映制作照片MV

目录 制作MV模板时长调整拖动边缘缩短法分割删除法变速法整体调整法 制作MV 导入音乐 导入歌词 点击歌词 和片头可以修改字体&#xff1a; 还可以给字幕添加动画效果&#xff1a; 导入照片&#xff0c;自动创建照片轨&#xff1a; 修改片头字幕&#xff1a;增加两条字幕轨&…...

Python爬虫获取custom-1688自定义API操作接口

一、引言 在电子商务领域&#xff0c;1688作为国内领先的B2B平台&#xff0c;提供了丰富的API接口&#xff0c;允许开发者获取商品信息、店铺信息等。其中&#xff0c;custom接口允许开发者进行自定义操作&#xff0c;获取特定的数据。本文将详细介绍如何使用Python调用1688的…...

Autogen_core: Reflection

目录 代码代码逻辑解释&#xff1a;数据类定义&#xff1a;CoderAgent 类&#xff1a;ReviewerAgent 类&#xff1a;主程序&#xff1a; 完成的功能&#xff1a; 代码 from dataclasses import dataclassdataclass class CodeWritingTask:task: strdataclass class CodeWritin…...

GitHub 仓库的 Archived 功能详解:中英双语

GitHub 仓库的 Archived 功能详解 一、什么是 GitHub 仓库的 “Archived” 功能&#xff1f; 在 GitHub 上&#xff0c;“Archived” 是一个专门用于标记仓库状态的功能。当仓库被归档后&#xff0c;它变为只读模式&#xff0c;所有的功能如提交代码、创建 issue 和 pull req…...

.NET Core缓存

目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存&#xff08;In-memory cache&#xff09; 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法&#xff1a; 两种过期时间策略&#xff1a; 绝对过期时间 滑动过期时间 两…...

Ubuntu 20.04安装Protocol Buffers 2.5.0

个人博客地址&#xff1a;Ubuntu 20.04安装Protocol Buffers 2.5.0 | 一张假钞的真实世界 安装过程 Protocol Buffers 2.5.0源码下载&#xff1a;https://github.com/protocolbuffers/protobuf/tree/v2.5.0。下载并解压。 将autogen.sh文件中以下内容&#xff1a; curl htt…...

【贪心算法】洛谷P1090 合并果子 / [USACO06NOV] Fence Repair G

2025 - 01 - 21 - 第 45 篇 【洛谷】贪心算法题单 -【 贪心算法】 - 【学习笔记】 作者(Author): 郑龙浩 / 仟濹(CSND账号名) 洛谷 P1090[NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G 【贪心算法】 文章目录 洛谷 P1090[NOIP2004 提高组] 合并果子 / [USACO06…...

14.模型,纹理,着色器

模型、纹理和着色器是计算机图形学中的三个核心概念&#xff0c;用通俗易懂的方式来解释&#xff1a; 1. 模型&#xff1a;3D物体的骨架 通俗解释&#xff1a; 模型就像3D物体的骨架&#xff0c;定义了物体的形状和结构。 比如&#xff0c;一个房子的模型包括墙、屋顶、窗户等…...

【微服务与分布式实践】探索 Dubbo

核心组件 服务注册与发现原理 服务提供者启动时&#xff0c;会将其服务信息&#xff08;如服务名、版本、所在节点的网络地址等&#xff09;注册到注册中心。服务消费者则可以从注册中心发现可用的服务提供者列表&#xff0c;并与之通信。注册中心会存储服务的信息&#xff0c…...