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

vue3+Pinia+element-plus 后台管理系统项目实战记录

vue3+Pinia+element-plus 后台管理系统项目实战记录
参考项目:https://www.bilibili.com/video/BV1L24y1n7tB

全局api

provide、inject

vue2

import api from'@/api'
vue.propotype.$api = apithis.$api.xxx

vue3

import api from'@/api'
app.provide('$api', api)import { inject } from 'vue'
const $api = inject('$api')
$api.xxx

父子组件传值

defineProps、defineEmits、defineExpose

defineProps

在 script setup 中必须使用 defineProps 和 defineEmits API 来声明 props 和 emits ,它们具备完整的类型推断,并且在 script setup 中是直接可用的

<Detail name="李四" :result="1"></Detail>
const props = defineProps({name: {type: String,default: '张三'required: true},result: {type: number,default: '0'required: true}
})
defineEmits

子组件声明并触发自定义事件,父组件监听自定义事件并执行相应的操作

子组件:

<button @click="incrementCounter"></button>import { defineEmits, ref } from 'vue';const emits = defineEmits(['increment']); // 定义方法
const counter = ref(0);function incrementCounter() {emits('increment', counter.value);	  // 提交方法
}

父组件:

<ChildComponent @increment="handleIncrement" />
<p>Counter: {{ counter }}</p>import ChildComponent from './ChildComponent.vue';
import { ref } from 'vue';const counter = ref(0);function handleIncrement(value) {counter.value = value;
}
defineExpose

适用于子组件向父组件暴露方法和属性,父组件通过子组件示例进行调用

const exposeStr = ref("")
defineExpose({ exposeStr })
<Detail ref="detail"></Detail>
const detail = ref(null)detail.value.exposeStr = "exposeStr"

接收父组件数据

props、ref、toRefs

<son :str='str' :num='num' />
const str = ref('abc')
const num = ref('123')
import { toRefs } from'vue'
const props = definProps({str: {type: string,default: '字符串'},num:{type: number,default: 1}
})
const { str, num } = toRefs(props)

向父组件传递数据

emit

const emit = defineEmits(['customEvent'])const clickEvent = (val) => {emit('customEvent', val)
}
<son :str='str' :num='num' @customEvent='customEvent' />const custom = (val) => {...
}

表格删除数据

  • 记录当前页码
  • 判断是否是当前页的最后一条数据,是的话页码-1
  • 根据id删除数据,携带页码请求数据

router相关

{path: '小写',name: '小驼峰',compoment: '大驼峰'
}<router-link to:'xxx/xxx'></router-link>const toXxx = () => {router.push('/xxx/xxx')
}

element 的菜单高亮

<el-menu :default-active="$route.meta.activeMenu || $route.path"></el-menu>

富文本编辑器

wangEditor:https://www.wangeditor.com/v5/getting-started.html

创建一个供用户编辑文本的富文本编辑器

Pinia

npm i pinia
import { defineStore } from 'pinia'const useGoodsStore = defineStore('goods', {state: () => {return {title:'xxx"}},actions: {setRowData(payload){this.title = xxx}}
}export default useGoodsStore
import useGoodsStore from '@/store/GoodsInfo'  		// 获取仓库的方法
const goodsStore = useGoodsStore();				   	// 定义常量接收仓库方法goodsStore.setRowData({ title: "xxx" })				// 修改仓库数据
goodsStore.title = "xxx"							// 修改仓库数据

注意:考虑页面刷新的场景,哪些数据需要做持久化处理

Pinia持久化

npm i pinia-plugin-persistedstate -s
// main.jsimport { createApp }from "vue";
import App from "./App.vue";
import { createPinia } from 'pinia'
import piniapluginpersistedstate from 'pinia-plugin-persistedstate'const app = createApp(App);
const pinia = createPinia();
pinia.use(piniapluginpersistedstate);
import { definestore } from 'pinia'const useGoodsstore = definestore('goods', {state: () => ({ data: '数据' }),actions: {upData(payload){this.data = payload.data}}// 开启数据持久化persist: true
})export default useGoodsstore

原地深拷贝

let newData = JSON.parse(JSON.stringify(data))

视图不更新

问题:在某些场景下,修改通过reactive声明的响应式数据,修改成功,但是在视图上该数据不更新

  • 修改为 ref 声明:data.value = newData

  • 在原先reactive声明的值上修改,改为一个对象,再将原先的值赋予该对象

    const data = reactive([{ id: 1 }, { id: 2 }]}// 改为const data = reactive({result: [{ id: 1 },{ id: 2 }]
    })data.result = newData
    

导出Excel

1、安装模块

npm i xlsx file-saver -s

2、模板使用

<el-button type="warning" @click="download">导出</el-button>
<el-table id='table'></el-table>import * as XLXS from "xlsx";
import Filesaver from "file-saver";// 导出名称
const name = ref('替换表名')// 导出excel事件
const download = () => {const table = document.getElementById("table")const wb = XLXs.utils.table_to_book(table, { raw: true });const wbout = XLXS.write(wb, {bookType: "xlsx",bookSST: true,type: "array",});try {FileSaver.saveAs(new Blob([wbout], {//定义文件格式流type: "application/octet-stream"}),name.value + ".xlsx");}catch(e){console.log(e)}return wbout
}

PDF预览下载打印

通过npm官网查找合适的第三方库:http://npm.p2hp.com/

根据第三方库的提供方法进行编写代码

同时要考虑:乱码、格式、排版、大小等

npm i vue3-pdf-app -s
<template><el-button @click="printEvent">打印</el-button><PDF pdf="../../../../public/vitae.pdf" style="height: 100vh"></PDF>
</template><script setup>
import PDF from "vue3-pdf-app";
import "vue3-pdf-app/dist/icons/main.css";
import { ref } from 'vue';
</script>
<el-dialog width="60%"><Pdf/></el-dialog>import Pdf from './Pdf.vue'

Element表单清空

reactive 响应式的变量,需要打点出属性,单独清空,不能使用ElementPlus的resetFields()

ref 响应式的变量,可使用ElementPlus提供的resetFields(),myForm.value.resetFields()

// let formInline = ref({ name: "", date: ""})
let formInline = reactive({ name: "", date: ""})const customEvent = () => {// formInline.name = '';// formInline.date = '';myForm.value.resetFields();
}

Element表格分页英转中

全导入element-plus,在main.js添加配置

import Elementplus from 'element-plus ';
import locale from "element-plus/lib/locale/lang/zh-cn";	// 需要新加的代码
const app = createApp(App);
app.use(ElementPlus,{locale});								// 需要改变的地方,加入locale

按需导入element-plus,在App.vue添加配置

// 在App.vue 的文件中修改即可
<template><el-config-provider :locale="locale"><router-view></router-view></el-config-provider>
</template><script lang="ts" setup>import {reative} from 'vuex'import { ElConfigProvider } from 'element-plus'import zhCn from 'element-plus/lib/locale/lang/zh-cn ' 	const { locale } = reactive({locale: zhCn});
</script>

Element的提示框

样式:除了需要复制相关代码,还需要单独引入相关的css

层级:由于他跟APP页面是同一级,所以提示框会被后来的组件页面所覆盖

  • 在App.vue的 <style>修改其层级
  • 在当前组件新建第二个<style>,修改其层级
  • 在当前组件减低其他 Dom元素 的层级
  • 修改源码,如需修改源码,需要从 node_modules 单独提出来,再重新引入css(不推荐)

Element面包屑

1、编辑好面包屑组价【Breadcrumb.vue】

<template><el-breadcrumb separator="/" class="bread"><el-breadcrumb-item v-for="item in navs" :key="item.path" :to="item.path">{{ item.meta.title }}</el-breadcrumb-item></el-breadcrumb>
</template><script setup>
import { useRoute } from "vue-router";
import { computed } from "vue";const route = useRoute();const navs = computed(() => {let routes = route.matched;// 处理第一个路由的信息routes[0].path = "/";return routes;
})
</script><style lang="scss" scoped>.bread {margin-bottom: 10px;}
</style>

2、配置路由元信息

const routes = [{path:'/',component: Layout,meta:{title:'首页'},children:[{path:'/',name:'home',component: Home,meta:{title:'首页'}},{path: "/product",name: "product",component: Product,redirect: '/product/list',	//重定向,保证页面信息展示meta:{title: '产品管理'},children: [{path: "category"name:"category",component: category,meta:{title:'产品分类’}},{path: "list"name:"list",component: List,meta:{title:'产品列表’}}]}]},{path:'/login',name:'login',component: Login}
]

3、main.js引入组件,并全局注册

import Breadcrumb from './components/Breadcrumb/Breadcrumb.vue'
app.compoment('Breadcrumb', Breadcrumb)

4、各个页面顶部使用组件

<Breadcrumb />

5、菜单高亮修改

<el-menu :default-active="activePath"></el-menu>import { ref, watch } from 'vue'
import { useRoute } from 'vue-router'const activePath = ref('')
const route = ref(useRoute())
activePath.value = route.pathwatch(route.value, () => {activePath.value = route.value.fullPath}
)

注意:在发生部分页面发生页面跳转,需要动态配置路由元信息,跳转时传递数据

第三方库

时间处理dayjs
npm i dayjs -s
{{ time }}import dayjs from 'dayjs'const time = dayjs().format('YYYY年MM月DD日 HH:mm:ss')
语言环境Vue i18n

官网:https://kazupon.github.io/vue-i18n/zh/

提醒:注意vue2和vue3的版本,vue3要使用vue-i18n必须要9以上的版本

npm i vue-i18n@9

在src文件下新建lang文件夹,里面建好“cn.js”、“en.js”、 “index.js”文件,分别对应中文、英文、配置

const messages = {menu: {title: '中文',}
}export default messages
const messages = {home: {title: 'English',}
}export default messages
import { createI18n } from 'vue-i18n'
import en from './en'
import cn from './zh'const messages = { en, cn }const localeData = {legacy: true,			// 组合式 APIglobalInjection: true,	// 全局生效$tlocale: zh, 			// 默认语言messages
}export function setupI18n (app) {const i18n = createI18n(localeData)app.use(i18n)
}
import i18n from "@/I18n"
App.use(i18n)
{{ $t('home.title') }}
Lodash深拷贝

方式一:JSON.parse( JSON.string( xxx ) ) 会破坏函数,不适合复杂类型

方式二:Lodash.js,官网:www.lodashjs.com

# 安装
npm i lodash -s# 全导 + 单导
improt _ from 'lodash'
improt { cloneDeep } from 'lodash'# 使用
let b = cloneDeep(a)

相关文章:

vue3+Pinia+element-plus 后台管理系统项目实战记录

vue3Piniaelement-plus 后台管理系统项目实战记录 参考项目&#xff1a;https://www.bilibili.com/video/BV1L24y1n7tB 全局api provide、inject vue2 import api from/api vue.propotype.$api apithis.$api.xxxvue3 import api from/api app.provide($api, api)import {…...

安装 Node.js 和配置 cnpm 镜像源

一、安装 Node.js 方式一&#xff1a;官网下载&#xff08;适合所有系统&#xff09; 访问 Node.js 官网 推荐选择 LTS&#xff08;长期支持&#xff09;版本&#xff0c;点击下载安装包。 根据系统提示一步步完成安装。 方式二&#xff1a;通过包管理器安装&#xff08;建…...

MacOS内存管理-删除冗余系统数据System Data

文章目录 一、问题复现二、解决思路三、解决流程四、附录 一、问题复现 以题主的的 Mac 为例&#xff0c;我们可以看到System Data所占数据高达77.08GB&#xff0c;远远超出系统所占内存 二、解决思路 占据大量空间的是分散在系统中各个位置Cache数据&#xff1b; 其中容量最…...

电脑开机后长时间黑屏,桌面图标和任务栏很久才会出现,但是可通过任务管理器打开应用程序,如何解决

目录 一、造成这种情况的主要原因&#xff08;详细分析&#xff09;&#xff1a; &#xff08;1&#xff09;启动项过多&#xff0c;导致系统资源占用过高&#xff08;最常见&#xff09; 检测方法&#xff1a; &#xff08;2&#xff09;系统服务启动异常&#xff08;常见&a…...

行为型:中介者模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、注意事项 1、核心思想 目的&#xff1a;通过引入一个中介对象来封装一组对象之间的交互&#xff0c;解决对象间过度耦合、频繁交互的问题。不管是对象引用维护还是消息的转发&am…...

光谱相机在生态修复监测中的应用

光谱相机通过多维光谱数据采集与智能分析技术&#xff0c;在生态修复监测中构建起‌“感知-评估-验证”‌的全周期管理体系&#xff0c;其核心应用方向如下&#xff1a; 一、土壤修复效能量化评估 ‌重金属污染动态监测‌ 通过短波红外&#xff08;1000-2500nm&#xff09;波…...

吉林大学操作系统上机实验五(磁盘引臂调度算法(scan算法)实现)

本次实验无参考&#xff0c;从头开始实现。 一.实验内容 模拟实现任意一个磁盘引臂调度算法&#xff0c;对磁盘进行移臂操作列出基于该种算法的磁道访问序列&#xff0c;计算平均寻道长度。 二.实验设计 假设磁盘只有一个盘面&#xff0c;并且磁盘是可移动头磁盘。磁盘是可…...

【深度学习-pytorch篇】4. 正则化方法(Regularization Techniques)

正则化方法&#xff08;Regularization Techniques&#xff09; 1. 目标 理解什么是过拟合及其影响掌握常见正则化技术&#xff1a;L2 正则化、Dropout、Batch Normalization、Early Stopping能够使用 PyTorch 编程实现这些正则化方法并进行比较分析 2. 数据构造与任务设定 …...

ESP8266+STM32 AT驱动程序,心知天气API 记录时间: 2025年5月26日13:24:11

接线为 串口2 接入ESP8266 esp8266.c #include "stm32f10x.h"//8266预处理文件 #include "esp8266.h"//硬件驱动 #include "delay.h" #include "usart.h"//用得到的库 #include <string.h> #include <stdio.h> #include …...

WPF【11_5】WPF实战-重构与美化(MVVM 实战)

11-10 【重构】创建视图模型&#xff0c;显示客户列表 正式进入 MVVM 架构的代码实战。在之前的课程中&#xff0c; Model 和 View 这部分的代码重构实际上已经完成了。 Model 就是在 Models 文件夹中看到的两个文件&#xff0c; Customer 和 Appointment。 而 View 则是所有与…...

⭐️⭐️⭐️ 模拟题及答案 ⭐️⭐️⭐️ 大模型Clouder认证:RAG应用构建及优化

考试注意事项: 一、单选题(21题) 检索增强生成(RAG)的核心技术结合了什么? A. 图像识别与自然语言处理 B. 信息检索与文本生成 C. 语音识别与知识图谱 D. 数据挖掘与机器学习 RAG技术中,“建立索引”步骤不包括以下哪项操作? A. 将文档解析为纯文本 B. 文本片段分割(…...

kali系统的安装及配置

1 kali下载 Kali 下载地址&#xff1a;Get Kali | Kali Linux &#xff08;https://www.kali.org/get-kali&#xff09; 下载 kali-linux-2024.4-installer-amd64.iso (http://cdimage.kali.org/kali-2024.4/) 2. 具体安装步骤&#xff1a; 2.1 进入官方地址&#xff0c;点击…...

CSS--background-repeat详解

属性介绍 background-repeat ‌属性在CSS中用于控制背景图像是否以及如何重复。当背景图像的尺寸小于其容器的尺寸时&#xff0c;该属性决定了图像如何填充额外的空间。默认情况下&#xff0c;背景图像会在横向和纵向上重复&#xff0c;直到覆盖整个元素。 常见取值 repeat …...

Redis的大Key问题如何解决?

大家好&#xff0c;我是锋哥。今天分享关于【Redis的大Key问题如何解决&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis的大Key问题如何解决&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis中的“大Key”问题是指某个键的值占用了过多…...

影楼精修-AI追色算法解析

注意&#xff1a;本文样例图片为了避免侵权&#xff0c;均使用AIGC生成&#xff1b; AI追色是像素蛋糕软件中比较受欢迎的一个功能点&#xff0c;本文将针对AI追色来解析一下大概的技术原理。 功能分析 AI追色实际上可以理解为颜色迁移的一种变体或者叫做升级版&#xff0c;…...

node入门:安装和npm使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装npm命令nvm 前言 因为学习vue接触的&#xff0c;一直以为node是和vue绑定的&#xff0c;还以为vue跑起来必须要node&#xff0c;后续发现并不是。 看…...

‘js@https://registry.npmmirror.com/JS/-/JS-0.1.0.tgz‘ is not in this registry

解决方法&#xff1a; 1. npm cache clean --force 2.临时切换到官方源 npm config set registry https://registry.npmjs.org/ npm install js0.1.0 npm config set registry https://registry.npmmirror.com/ # 切换回镜像源...

el-table-column如何获取行数据的值

在Element UI的el-table组件中&#xff0c;你可以通过el-table-column的slot-scope属性&#xff08;在Vue 2.x中&#xff09;或者#default插槽的scope属性&#xff08;在Vue 3.x中&#xff09;来获取当前行的数据。以下是如何实现这一功能的详细步骤&#xff1a; ‌在el-table-…...

leetcode450.删除二叉搜索树中的节点:迭代法巧用中间节点应对多场景删除

一、题目深度解析与BST特性剖析 在二叉搜索树&#xff08;BST&#xff09;中删除节点&#xff0c;需确保删除操作后树依然保持BST特性。题目要求我们根据给定的节点值key&#xff0c;在BST中删除对应节点。BST的核心特性是左子树所有节点值小于根节点值&#xff0c;右子树所有…...

java虚拟机2

一、垃圾回收机制&#xff08;GC&#xff09; 1. 回收区域&#xff1a;GC主要回收堆内存区域。堆用于存放new出来的对象 。程序计数器、元数据区和栈一般不是GC回收的重点区域。 2. 回收单位&#xff1a;GC以对象为单位回收内存&#xff0c;而非字节。按对象维度回收更简便&am…...

自监督软提示调优:跨域NLP新突破

自监督的软提示调优方法(SPSS) 这篇论文提出了一种基于自监督的软提示调优方法(SPSS),用于无监督领域自适应。其核心目标是通过挖掘源域和目标域的内部知识,解决传统提示调优在跨域场景中依赖通用知识、模板生成低效的问题。 一、核心实现原理 1. 自监督分层聚类优化(…...

Pydantic 学习与使用

Pydantic 学习与使用 在 Fastapi 的 Web 开发中的数据验证通常都是在使用 Pydantic 来进行数据的校验&#xff0c;本文将对 Pydantic 的使用方法做记录与学习。 **简介&#xff1a;**Pydantic 是一个在 Python 中用于数据验证和解析的第三方库&#xff0c;它现在是 Python 使…...

PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理、 目录 前言 1.二极管 1.发光…...

能按需拆分 PDF 为多个文档的工具

软件介绍 彩凤 PDF 拆分精灵是一款具备 PDF 拆分功能的软件。 功能特点 PDF 拆分功能较为常见&#xff0c;很多 PDF 软件都具备&#xff0c;例如 DC 软件提取 PDF 较为方便&#xff0c;但它不能从一个 PDF 里提取出多个 PDF。据印象&#xff0c;其他 PDF 软件也似乎没有能从…...

Apifox 5 月产品更新|数据模型支持查看「引用资源」、调试 AI 接口可实时预览 Markdown、性能优化

Apifox 新版本上线啦&#xff01; 看看本次版本更新主要涵盖的重点内容&#xff0c;有没有你所关注的功能特性&#xff1a; 自动解析 JSON 参数名和参数值调试 AI 接口时&#xff0c;可预览 Markdown 格式的内容性能优化&#xff1a;新增「实验性功能」选项 使用独立进程执行…...

LiveGBS海康、大华、宇视、华为摄像头GB28181国标语音对讲及语音喊话:摄像头设备与服务HTTPS准备

LiveGBS海康、大华、宇视、华为摄像头GB28181国标语音对讲及语音喊话&#xff1a;摄像头设备与服务HTTPS准备 1、背景2、准备工作2.1、服务端必备条件&#xff08;注意事项&#xff09;2.2、语音对讲设备准备2.2.1、大华摄像机2.2.2、海康摄像机 3、开启音频并开始对讲4、相关问…...

Sqlalchemy 连mssql坑

连接失败: (pyodbc.OperationalError) (08001, [08001] [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:0A00014D:SSL routines::legacy sigalg disallowed or unsupported] (-1) (SQLDriverConnect)) (Background on this error at: https://sqlalche.me/e/…...

Prompt Engineering 提示工程介绍与使用/调试技巧

1. 介绍 Prompt Engineering 是一种人工智能&#xff08;AI&#xff09;技术&#xff0c;它通过设计和改进 AI 的 prompt 来提高 AI 的表现。Prompt Engineering 的目标是创建高度有效和可控的 AI 系统&#xff0c;使其能够准确、可靠地执行特定任务。 如果你从来没有使用过Pr…...

LLaMaFactory - 支持的模型和模板 常用命令

一、 环境准备 激活LLaMaFactory环境&#xff0c;进入LLaMaFactory目录 cd LLaMA-Factoryconda activate llamafactory 下载模型 #模型下载 from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen2.5-0.5B-Instruct) 二、启动一个 Qwen3-0.6B…...

大模型深度学习之双塔模型

前言 双塔模型&#xff08;Two-Tower Model&#xff09;是一种在推荐系统、信息检索和自然语言处理等领域广泛应用的深度学习架构。其核心思想是通过两个独立的神经网络&#xff08;用户塔和物品塔&#xff09;分别处理用户和物品的特征&#xff0c;并在共享的语义空间中通过相…...