Vue3项目练习详细步骤(第三部分:文章分类页面模块)

文章分类列表

主体结构 

接口文档

文章分类列表查询接口数据绑定

 Pinia状态管理库

axios请求拦截器 

Pinia持久化插件-persist 

未登录统一处理

添加文章分类 

主体结构 

 接口文档

 绑定请求数据

编辑文章分类

弹框结构 

 数据回显

 接口文档

绑定请求数据

删除分类 

接口文档

 绑定请求数据

 

文章分类列表

主体结构 

 在ArticleCategory.vue文件中完成文章分类列表组件

<script setup>
import {Edit,Delete
} from '@element-plus/icons-vue'
import { ref } from 'vue'
const categorys = ref([{"id": 3,"categoryName": "美食","categoryAlias": "my","createTime": "2023-09-02 12:06:59","updateTime": "2023-09-02 12:06:59"},{"id": 4,"categoryName": "娱乐","categoryAlias": "yl","createTime": "2023-09-02 12:08:16","updateTime": "2023-09-02 12:08:16"},{"id": 5,"categoryName": "军事","categoryAlias": "js","createTime": "2023-09-02 12:08:33","updateTime": "2023-09-02 12:08:33"}
])
</script>
<template><el-card class="page-container"><template #header><div class="header"><span>文章分类</span><div class="extra"><el-button type="primary">添加分类</el-button></div></div></template><el-table :data="categorys" style="width: 100%"><el-table-column label="序号" width="100" type="index"> </el-table-column><el-table-column label="分类名称" prop="categoryName"></el-table-column><el-table-column label="分类别名" prop="categoryAlias"></el-table-column><el-table-column label="操作" width="100"><template #default="{ row }"><el-button :icon="Edit" circle plain type="primary" ></el-button><el-button :icon="Delete" circle plain type="danger"></el-button></template></el-table-column><template #empty><el-empty description="没有数据" /></template></el-table></el-card>
</template><style lang="scss" scoped>
.page-container {min-height: 100%;box-sizing: border-box;.header {display: flex;align-items: center;justify-content: space-between;}
}
</style>

保存查看

接口文档

详细接口文档链接:https://blog.csdn.net/dafsq/article/details/138500082?spm=1001.2014.3001.5502 

文章分类列表查询接口数据绑定

在api目录下新建article.js文件

完成分类列表查询请求方法 

//导入请求工具文件
import request from '@/utils/request.js'//文章分类列表查询
export const ArticleCategoryListService = () => {return request.get('/category')
}

 在文章分类ArticleCategory.vue文件中声明文章分类列表查询异步函数

//声明文章分类列表查询异步函数
import {articleCategoryListService} from '@/api/article.js'
const articleCategoryList = async() => {let result = await articleCategoryListService();if(result.code == 0){//成功获取categorys.value = result.data;}else{//获取失败ElMessage.error('获取失败')}
}
//调用
articleCategoryList();

 Pinia状态管理库

 Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态

在项目目录下安装pinia

npm install pinia

在main.js文件中应用实例中使用pinia

创建src/stores/token.js文件 在其中定义store

在登录页面Login.vue文件中定义tokenStore并把登录时的token存入pinia

axios请求拦截器 

        当进入主页后,将来要与后台交互,都需要携带token,如果每次请求都写这样的代码,将会比较繁琐,此时可以将携带token的代码通过请求拦截器统一处理

在请求工具request.js文件中使用axios请求拦截器将token以请求头的方式携带请求

//导入token状态
import { useTokenStore } from '@/stores/token.js';
//添加请求拦截器
instance.interceptors.request.use((config)=>{//在发送请求之前做什么let tokenStore = useTokenStore()//如果token中有值,在携带if(tokenStore.token){config.headers.Authorization=tokenStore.token}return config},(err)=>{//如果请求错误做什么Promise.reject(err)}
)

 保存可以查看到账号中已有的文章分类信息

Pinia持久化插件-persist 

  • Pinia默认是内存存储,当刷新浏览器的时候会丢失数据。
  • Persist插件可以将pinia中的数据持久化的存储 

在项目目录下安装persist

npm install pinia-persistedstate-plugin

在main.js文件在pinia中使用persist

在token.js文件中定义状态Store时指定持久化配置参数,在defineStore函数中添加第三个参数

 

这样登录刷新后token持久保存 就不会报错了 

 

未登录统一处理

        在后续访问接口时,如果没有登录,则前端不携带token,后台服务器会返回响应状态码401,代表未登录,此时可以在axios的响应拦截器中,统一对未登录的情况做处理

//导入Element-Plus提示框组件
import { ElMessage } from 'element-plus'//导入路由
import router from '@/router/router.js'
//添加响应拦截器
instance.interceptors.response.use(result=>{return result.data;},err=>{//如果响应状态码时401,代表未登录,给出对应的提示,并跳转到登录页if(err.response.status===401){ElMessage.error('请先登录!')router.push('/login')}else{ElMessage.error('服务异常');}return Promise.reject(err);//异步的状态转化成失败的状态}
)

 

添加文章分类 

主体结构 

在ArticleCategory.vue文件中添加分类弹窗组件

                <!-- 添加分类弹窗 --><el-dialog v-model="dialogVisible" title="添加弹层" width="30%"><el-form :model="categoryModel" :rules="rules" label-width="100px" style="padding-right: 30px"><el-form-item label="分类名称" prop="categoryName"><el-input v-model="categoryModel.categoryName" minlength="1" maxlength="10"></el-input></el-form-item><el-form-item label="分类别名" prop="categoryAlias"><el-input v-model="categoryModel.categoryAlias" minlength="1" maxlength="15"></el-input></el-form-item></el-form><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">取消</el-button><el-button type="primary"> 确认 </el-button></span></template></el-dialog>

 添加表单校验和数据模型

//控制添加分类弹窗
const dialogVisible = ref(false)//添加分类数据模型
const categoryModel = ref({categoryName: '',categoryAlias: ''
})
//添加分类表单校验
const rules = {categoryName: [{ required: true, message: '请输入分类名称', trigger: 'blur' },],categoryAlias: [{ required: true, message: '请输入分类别名', trigger: 'blur' },]
}

在添加分类按钮处绑定显示弹窗的单击事件

<el-button type="primary" @click="dialogVisible = true">添加分类</el-button>

点击添加文章按钮时弹窗正常显示

 绑定数据模型

绑定校验规则

已绑定成功

 绑定取消按钮事件,使弹框不显示

 接口文档

 绑定请求数据

在article.js文件中添加请求函数

//文章分类添加
export const articleCategoryAddService = (categoryModel) => {return request.post('/category',categoryModel)
}

在文章分类页面ArticleCategory.vue文件中添加单击事件请求函数

//导入Element-Plus提示框组件
import { ElMessage } from 'element-plus'
//导入articleCategoryAddService函数
import {articleCategoryAddService} from '@/api/article.js'
const addCategory = async () => {let result = await articleCategoryAddService(categoryModel.value);if(result.code == 0){//成功添加ElMessage(result.message? result.message:'添加成功')//隐藏弹窗dialogVisible.value = false//再次访问后台接口,查询所有分类articleCategoryList();}else{//添加失败ElMessage.error('添加失败')}
}

在确认按钮中绑定该事件函数 

<el-button type="primary" @click="addCategory"> 确认 </el-button>

 

编辑文章分类

弹框结构 

 在编辑按钮处添加事件,点击后显示弹框

<el-button :icon="Edit" circle plain type="primary" @click="dialogVisible = true"></el-button>

定义变量控制弹窗标题 

//定义变量控制弹窗标题
const title=ref('')

在弹窗标题中绑定变量

<el-dialog v-model="dialogVisible" :title="title" width="30%">

 在添加分类按钮中赋值给标题变量

<el-button type="primary" @click="dialogVisible = true;title='添加分类'">添加分类</el-button>

在编辑按钮中赋值标题变量

<el-button :icon="Edit" circle plain type="primary" @click="dialogVisible = true;title='编辑分类'"></el-button>

 保存之后点击不同的按钮将会显示对应的弹框标题

 数据回显

 定义数据回显函数

//修改分类回显
const updateCategoryEcho = (row) => {title.value = '修改分类'dialogVisible.value = true//将row中的数据赋值给categoryModelcategoryModel.value.categoryName=row.categoryNamecategoryModel.value.categoryAlias=row.categoryAlias//修改的时候必须传递分类的id,所以扩展一个id属性categoryModel.value.id=row.id
}

 通过插槽的方式得到被点击按钮所在行的数据

    <template #default="{ row }"><el-button :icon="Edit" circle plain type="primary" @click="updateCategoryEcho(row)"></el-button><el-button :icon="Delete" circle plain type="danger"></el-button></template>

保存后点击编辑 文本框回显效果

 

 接口文档

 

绑定请求数据

在article.js文件中添加请求函数

 在文章分类页面ArticleCategory.vue文件中添加修改文章分类单击事件请求函数

//导入articleCategoryUpdateService函数
import {articleCategoryUpdateService} from '@/api/article.js'
//修改分类
const updateCategory=async ()=>{let result = await articleCategoryUpdateService(categoryModel.value)if(result.code == 0){ElMessage.success(result.message? result.message:'修改成功')//隐藏弹窗dialogVisible.value=false//再次访问后台接口,查询所有分类articleCategoryList();}else{//添加失败ElMessage.error('修改失败')}
}

由于现在修改和新增共用了一个数据模型,所以在点击添加分类后,有时候会显示数据,此时可以将categoryModel中的数据清空  

//清空模型数据
const clearData = ()=>{categoryModel.value.categoryName='',categoryModel.value.categoryAlias=''
}

 修改确定按钮的绑定事件

<el-button type="primary" @click="title==='添加分类'? addCategory():updateCategory()"> 确认 </el-button>

 修改添加按钮的点击事件

<el-button type="primary" @click="dialogVisible = true;title='添加分类';clearData()">添加分类</el-button>

 保存之后就能完成添加和修改的功能了

删除分类 

接口文档

 

 绑定请求数据

 在article.js文件中添加请求函数

//删除分类
export const articleCategoryDeleteService = (id) => {return request.delete('/category?id='+id)
}

  在文章分类页面ArticleCategory.vue文件中编写删除文章分类单击事件请求函数并在函数内部添加提示框组件

//导入element的ElMessageBox提示框组件
import { ElMessageBox } from 'element-plus'
//导入articleCategoryDeleteService函数
import {articleCategoryDeleteService} from '@/api/article.js'
//删除分类
const deleteCategory = (row) => {ElMessageBox.confirm('确认是否删除该分类信息?','提示',{confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning',}).then(async () => {//用户点击了确认let result = await articleCategoryDeleteService(row.id)ElMessage.success(result.message?result.message:'删除成功')//再次调用getAllCategory,获取所有文章分类articleCategoryList();}).catch(() => {//用户点击了取消ElMessage({type: 'info',message: '取消删除',})})
}

 在删除图标按钮处绑定该点击事件函数

<el-button :icon="Delete" circle plain type="danger" @click="deleteCategory(row)"></el-button>

 保存后即可正常删除文章分类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19025.shtml

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

相关文章

在window中使用HTTP服务器获取kali的文件

文章目录 一、在window中使用HTTP服务器获取kali的文件1、疑问2、执行条件3、成功读取 一、在window中使用HTTP服务器获取kali的文件 1、疑问 有时候kali上面有的文件想传入window但是发现不允许这样操作那怎么办呢&#xff1f;特别是在一些限制工具的比赛中想把kali的文件传…

数字化学校渠道的建造内容

数字化学校渠道的建造内容可以用阶段来区分&#xff1a; 1.网络硬件为主的建造 这一阶段首要重视的是学校网络的硬件基础建造&#xff0c;一起供给部分网络根本服务&#xff0c;与此一起&#xff0c;也进行部分信息使用内容的建造&#xff0c;如电子阅览室、归纳管理信息体系等…

国产操作系统上apt命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上apt命令详解 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用apt命令的详解文章。apt&#xff08;Advanced Package Tool&#xff09;是Debian及其衍生发行版&#xff08;如统信UOS…

TPshop商城的保姆教程(windows)

提前准备 phpStudy下载&#xff1a;https://www.xp.cn/download.html 选择适合自己的版本下载 TPshop商城源文件下载链接&#xff1a; https://pan.baidu.com/s/143fLrxbwe9CTMCbyx7mXJQ?pwd6666 开始安装 安装完phpstudy后 以管理员的身份启动phpstudy.exe 选择合适自己…

2024年03月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 以下选项中,创建类正确的是?() A: class test1: def prt(self): …… B: class Mg(): def__init__(na,ag): self.na=na C: class A(): def print(self): print(“Yes”) a=A() a.print() D…

Android SDK下载安装(_指定版本)

安装完sdk&#xff0c;就可以直接使用adb命令了&#xff0c;如果想做app相关自动化测试&#xff0c;也是需要sdk环境依赖的 一、SDK下载 A&#xff1a;官网下载&#xff1a; 管内镜像网站(推荐)&#xff1a;https://www.androiddevtools.cn/index.html 官网&#xff1a;htt…

渗透测试一些知识点

1、如果提示缺少参数&#xff0c;如{msg&#xff1a;params error}&#xff0c;可尝使用字典模糊测试构造参数&#xff0c;进一步攻击。 2、程序溢出&#xff0c;int最大值为2147483647&#xff0c;可尝试使用该值进行整数溢出&#xff0c;观察现象。 3、403&#xff0c;404响…

【YashanDB知识库】ODBC驱动类问题定位方法

【标题】ODBC驱动类问题定位方法 【需求分类】故障分析 【关键字】ODBC 【需求描述】由于我们的ODBC接口目前尚不完善&#xff0c;经常会遇见ODBC接口能力不足导致应用功能无法运行的问题&#xff0c;需要定位手段确定底层是哪个接口报错 【需求原因分析】方便一线数据库管…

markdown语法保存

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

实验七 RTP、DSPP协议的配置

一、实验目的 掌握 RIP 动态路由协议的配置、诊断方法。 二、实验步骤 1、 运行 Cisco Packet Tracer 软件&#xff0c;在逻辑工作区放入两台路由器、两台工作站 PC&#xff0c;分别点击各路由器&#xff0c;打开其配置窗口&#xff0c;关闭电源&#xff0c;分别加入一个 2 …

PowerPivot-跨表取值

在PowerPivot中&#xff0c;跨表取值通常涉及创建关系和使用DAX&#xff08;数据分析表达式&#xff09;函数。 以下是一些基本步骤和常用的DAX函数&#xff0c;帮助你在PowerPivot中实现跨表取值&#xff1a; 步骤1&#xff1a;创建关系 加载数据&#xff1a;确保你已将需要…

运维笔记:流编辑器sed命令用法解析

运维笔记 sed命令用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/arti…

Matlab 结构光相移法(单频多相)

文章目录 一、简介1、基于点的测距2、基于条纹的测距二、条纹编码2.1 二进制编码2.2相移法三、实现代码参考文献一、简介 在介绍相移法之前,我们需要先了解一下为啥会有相移法,了解了其来龙去脉,则更容易去应用它。 1、基于点的测距 首先我们从点的测距开始,这有点类似于立…

每日一题《leetcode--117.填充每个结点的下一个右侧结点指针||》

https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/ 这道题与我之前发布的题目116是一样的解题过程&#xff0c;只是本题所给的数组大小与116不同&#xff0c;这是需要注意的。 116题目链接&#xff1a; http://t.csdnimg.cn/3Ub02 struct Node* c…

RAID配置实战

概念 raid磁盘阵列&#xff1a;可以用不同的硬盘分区&#xff0c;组成一个逻辑上的硬盘。具有高可用 raid级别&#xff1a; raid0 &#xff1a;条带化存储&#xff1a;数据分散在多个物理硬盘上的存储方式。利用多个磁盘并行读取和写入。存储性能和读写性能是最好的。没有冗…

端到端目标检测 |从DETR 到 GroundingDINO

文章目录 一&#xff0c;DETR1. 简介2. 亮点3. 细节4. 总结一下 二&#xff0c;GroundingDINOGrounding DINO的整体流程Grounding DINO的目标函数 一&#xff0c;DETR 之前的目标检测框架&#xff0c;需要很多的人工干预&#xff0c;很多的先验知识&#xff0c;而且可能还需要…

Pandas格式化DataFrame的浮点数列

在呈现数据的同时&#xff0c;以所需的格式显示数据也是一个重要而关键的部分。有时&#xff0c;值太大了&#xff0c;我们只想显示其中所需的部分&#xff0c;或者我们可以说以某种所需的格式。 让我们看看在Pandas中格式化DataFrame的数值列的不同方法。 例1&#xff1a;将…

DNSlog环境搭建

阿里云域名公网VPS地址 购买阿里云域名后设置“自定义DNSHOST” DNS服务器填写ns1和ns2 如&#xff1a;ns1.aaa.com IP地址填写你的VPS地址 如&#xff1a;1.1.1.1 填写解析记录&#xff0c;一个A记录、一个NS记录 NS记录就是*.域名指向记录值ns1.域名 如&#xff1a;*.aaa…

服务器的远程桌面无法连接,服务器远程桌面无法连接问题处理教程

服务器的远程桌面无法连接&#xff0c;服务器远程桌面无法连接问题处理教程。 一、问题概述 服务器远程桌面无法连接是日常运维中常见的问题之一。它可能由多种原因造成&#xff0c;如网络问题、服务器配置错误、远程桌面服务未启动等。本教程将指导您逐步排查并解决这些问题。…

计算机算法中的数字表示法——原码、反码、补码

目录 1.前言2.研究数字表示法的意义3.数字表示法3.1 无符号整数3.2 有符号数值3.3 二进制补码(Twos Complement, 2C)3.4 二进制反码(也称作 1 的补码, Ones Complement, 1C)3.5 减 1 表示法(Diminished one System, D1)3.6 原码、反码、补码总结 1.前言 昨天有粉丝让我讲解下定…