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


    文章分类列表

    主体结构 

    接口文档

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

     Pinia状态管理库

    axios请求拦截器 

    Pinia持久化插件-persist 

    未登录统一处理

    添加文章分类 

    主体结构 

     接口文档

     绑定请求数据

    编辑文章分类

    弹框结构 

     数据回显

     接口文档

    绑定请求数据

    删除分类 

    接口文档

     绑定请求数据

     

    文章分类列表

    主体结构 

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

    1. <script setup>
    2. import {
    3. Edit,
    4. Delete
    5. } from '@element-plus/icons-vue'
    6. import { ref } from 'vue'
    7. const categorys = ref([
    8. {
    9. "id": 3,
    10. "categoryName": "美食",
    11. "categoryAlias": "my",
    12. "createTime": "2023-09-02 12:06:59",
    13. "updateTime": "2023-09-02 12:06:59"
    14. },
    15. {
    16. "id": 4,
    17. "categoryName": "娱乐",
    18. "categoryAlias": "yl",
    19. "createTime": "2023-09-02 12:08:16",
    20. "updateTime": "2023-09-02 12:08:16"
    21. },
    22. {
    23. "id": 5,
    24. "categoryName": "军事",
    25. "categoryAlias": "js",
    26. "createTime": "2023-09-02 12:08:33",
    27. "updateTime": "2023-09-02 12:08:33"
    28. }
    29. ])
    30. script>
    31. <template>
    32. <el-card class="page-container">
    33. <template #header>
    34. <div class="header">
    35. <span>文章分类span>
    36. <div class="extra">
    37. <el-button type="primary">添加分类el-button>
    38. div>
    39. div>
    40. template>
    41. <el-table :data="categorys" style="width: 100%">
    42. <el-table-column label="序号" width="100" type="index"> el-table-column>
    43. <el-table-column label="分类名称" prop="categoryName">el-table-column>
    44. <el-table-column label="分类别名" prop="categoryAlias">el-table-column>
    45. <el-table-column label="操作" width="100">
    46. <template #default="{ row }">
    47. <el-button :icon="Edit" circle plain type="primary" >el-button>
    48. <el-button :icon="Delete" circle plain type="danger">el-button>
    49. template>
    50. el-table-column>
    51. <template #empty>
    52. <el-empty description="没有数据" />
    53. template>
    54. el-table>
    55. el-card>
    56. template>
    57. <style lang="scss" scoped>
    58. .page-container {
    59. min-height: 100%;
    60. box-sizing: border-box;
    61. .header {
    62. display: flex;
    63. align-items: center;
    64. justify-content: space-between;
    65. }
    66. }
    67. style>

    保存查看

    接口文档

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

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

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

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

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

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

    1. //声明文章分类列表查询异步函数
    2. import {articleCategoryListService} from '@/api/article.js'
    3. const articleCategoryList = async() => {
    4. let result = await articleCategoryListService();
    5. if(result.code == 0){
    6. //成功获取
    7. categorys.value = result.data;
    8. }else{
    9. //获取失败
    10. ElMessage.error('获取失败')
    11. }
    12. }
    13. //调用
    14. 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以请求头的方式携带请求

    1. //导入token状态
    2. import { useTokenStore } from '@/stores/token.js';
    3. //添加请求拦截器
    4. instance.interceptors.request.use(
    5. (config)=>{
    6. //在发送请求之前做什么
    7. let tokenStore = useTokenStore()
    8. //如果token中有值,在携带
    9. if(tokenStore.token){
    10. config.headers.Authorization=tokenStore.token
    11. }
    12. return config
    13. },
    14. (err)=>{
    15. //如果请求错误做什么
    16. Promise.reject(err)
    17. }
    18. )

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

    Pinia持久化插件-persist 

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

    在项目目录下安装persist

    npm install pinia-persistedstate-plugin

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

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

     

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

     

    未登录统一处理

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

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

     

    添加文章分类 

    主体结构 

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

    1. <el-dialog v-model="dialogVisible" title="添加弹层" width="30%">
    2. <el-form :model="categoryModel" :rules="rules" label-width="100px" style="padding-right: 30px">
    3. <el-form-item label="分类名称" prop="categoryName">
    4. <el-input v-model="categoryModel.categoryName" minlength="1" maxlength="10">el-input>
    5. el-form-item>
    6. <el-form-item label="分类别名" prop="categoryAlias">
    7. <el-input v-model="categoryModel.categoryAlias" minlength="1" maxlength="15">el-input>
    8. el-form-item>
    9. el-form>
    10. <template #footer>
    11. <span class="dialog-footer">
    12. <el-button @click="dialogVisible = false">取消el-button>
    13. <el-button type="primary"> 确认 el-button>
    14. span>
    15. template>
    16. el-dialog>

     添加表单校验和数据模型

    1. //控制添加分类弹窗
    2. const dialogVisible = ref(false)
    3. //添加分类数据模型
    4. const categoryModel = ref({
    5. categoryName: '',
    6. categoryAlias: ''
    7. })
    8. //添加分类表单校验
    9. const rules = {
    10. categoryName: [
    11. { required: true, message: '请输入分类名称', trigger: 'blur' },
    12. ],
    13. categoryAlias: [
    14. { required: true, message: '请输入分类别名', trigger: 'blur' },
    15. ]
    16. }

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

    "primary" @click="dialogVisible = true">添加分类

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

     绑定数据模型

    绑定校验规则

    已绑定成功

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

     接口文档

     绑定请求数据

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

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

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

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

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

    "primary" @click="addCategory"> 确认 

     

    编辑文章分类

    弹框结构 

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

    "Edit" circle plain type="primary" @click="dialogVisible = true">

    定义变量控制弹窗标题 

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

    在弹窗标题中绑定变量

    "dialogVisible" :title="title" width="30%">

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

    "primary" @click="dialogVisible = true;title='添加分类'">添加分类

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

    "Edit" circle plain type="primary" @click="dialogVisible = true;title='编辑分类'">

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

     数据回显

     定义数据回显函数

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

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

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

     

     接口文档

     

    绑定请求数据

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

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

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

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

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

     修改确定按钮的绑定事件

    "primary" @click="title==='添加分类'? addCategory():updateCategory()"> 确认 

     修改添加按钮的点击事件

    "primary" @click="dialogVisible = true;title='添加分类';clearData()">添加分类

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

    删除分类 

    接口文档

     

     绑定请求数据

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

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

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

    1. //导入element的ElMessageBox提示框组件
    2. import { ElMessageBox } from 'element-plus'
    3. //导入articleCategoryDeleteService函数
    4. import {articleCategoryDeleteService} from '@/api/article.js'
    5. //删除分类
    6. const deleteCategory = (row) => {
    7. ElMessageBox.confirm(
    8. '确认是否删除该分类信息?',
    9. '提示',
    10. {
    11. confirmButtonText: '确认',
    12. cancelButtonText: '取消',
    13. type: 'warning',
    14. }
    15. )
    16. .then(async () => {
    17. //用户点击了确认
    18. let result = await articleCategoryDeleteService(row.id)
    19. ElMessage.success(result.message?result.message:'删除成功')
    20. //再次调用getAllCategory,获取所有文章分类
    21. articleCategoryList();
    22. })
    23. .catch(() => {
    24. //用户点击了取消
    25. ElMessage({
    26. type: 'info',
    27. message: '取消删除',
    28. })
    29. })
    30. }

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

    "Delete" circle plain type="danger" @click="deleteCategory(row)">

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

  • 相关阅读:
    在RT-Thread下为MPU手搓以太网MAC驱动-3
    Android Studio 新版本 Logcat 的使用
    React如何命令式调用自定义的Antd-Modal组件
    建信金融科技--软开笔试题1.答案--java--9.12
    ubuntu20.04的 ROS安装与入门介绍
    Winform和WPF数据绑定区别小结
    opencv交互式调整视觉算法参数(一)-图像阈值参数
    计算机复试面试题总结
    带头双向循环链表
    Golang 整合RocketMQ
  • 原文地址:https://blog.csdn.net/dafsq/article/details/139267449