【第22章】Vue实战篇之文章分类

news2024/10/23 2:39:18

文章目录

  • 前言
  • 一、文章分类列表查询
    • 1. 界面
    • 2. 脚本
    • 3. 展示
  • 二、文章分类添加
    • 1. 界面
    • 2. 接口脚本
    • 3. 点击事件
  • 三、文章分类编辑
    • 1. 界面
    • 2. 接口脚本
    • 3. 点击事件
  • 四、文章分类删除
    • 1. 界面
    • 2. 接口脚本
    • 3. 点击事件
  • 总结


前言

这里来学习文章分类相关界面和接口的调用(增删改查)。


一、文章分类列表查询

1. 界面

<script setup>
import {
    Edit,
    Delete
} from '@element-plus/icons-vue'
import { ref } from 'vue'
import articleCategoryListService from '@/api/article.js'

const categorys = ref([])
const articleCategoryList= async () => {
    let result=await articleCategoryListService();
    if(result.code==0){
        categorys.value=result.data
    }
}
articleCategoryList()
</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>

2. 脚本

import request from '@/utils/request.js'

const articleCategoryListService = ()=>{
    return request.get('/article/category')
}
export default articleCategoryListService

3. 展示

在这里插入图片描述

二、文章分类添加

1. 界面

<!-- 添加分类弹窗 -->
        <el-dialog v-model="dialogVisible" title="添加文章分类" width="30%">
            <el-form ref="addFormRef" :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" @click="addCategory"> 确认 </el-button>
                </span>
            </template>
        </el-dialog>

2. 接口脚本

export const addCategoryService = (categoryData)=>{
    return request.post('/article/category',categoryData)
}

3. 点击事件

//添加文章分类
//控制添加分类弹窗
const dialogVisible = ref(false)

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

import { addCategoryService } from '@/api/article.js'

const addFormRef = ref(null)
const addCategory = () => {
    if (!addFormRef) return
    addFormRef.value.validate(async(valid, fields) => {
        if (valid) {
            const result = await addCategoryService(categoryModel.value)
            const message = result.message
                if (result.code == 0) {
                    ElMessage.success(message ? message : '添加成功!')
                    articleCategoryList()
                    dialogVisible.value = false
                    categoryModel.value = ''
                } else {
                    ElMessage.error(message ? message : '添加失败,请稍后重试!')
                }
        }
    })
}
const resetFields=(addFormRef)=>{
    if(!addFormRef)return
    addFormRef.resetFields()
}

三、文章分类编辑

1. 界面

这里和新增使用同一套表单和校验,我们用变量控制显示不同的文字和触发不同的事件

<!-- 添加/编辑分类弹窗 -->
 <el-dialog v-model="dialogVisible" :title="title" width="30%">
     <el-form ref="categoryFormRef" :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" @click="index === 0 ? addCategory() : editCategory()"> 确认 </el-button>
         </span>
     </template>
 </el-dialog>

2. 接口脚本

export const editCategoryService = (categoryData)=>{
    return request.put('/article/category',categoryData)
}

3. 点击事件

import { addCategoryService, editCategoryService } from '@/api/article.js'

const resetFields = (categoryFormRef) => {
    if (!categoryFormRef) return
    categoryFormRef.resetFields()
    categoryModel.value = {
        categoryName: '',
        categoryAlias: ''
    }
}
const titleArray = ref(['添加文章分类', '编辑文章分类'])
const index = ref(0)
const addCategoryClick = (categoryFormRef) => {
    index.value = 0
    dialogVisible.value = true;
    resetFields(categoryFormRef)
    title.value = titleArray.value[index.value]
}
//编辑文章分类
const title = ref('')
const editCategoryClick = (row) => {
    resetFields(categoryFormRef.value)
    index.value = 1
    title.value = titleArray.value[index.value]
    dialogVisible.value = true
    console.log(row);
    categoryModel.value.id = row.id
    categoryModel.value.categoryName = row.categoryName
    categoryModel.value.categoryAlias = row.categoryAlias
}
const editCategory = () => {
    if (!categoryFormRef) return
    categoryFormRef.value.validate(async (valid, fields) => {
        if (valid) {
            const result = await editCategoryService(categoryModel.value)
            const message = result.message
            if (result.code == 0) {
                ElMessage.success(message ? message : '更新成功!')
                articleCategoryList()
                dialogVisible.value = false
                resetFields(categoryFormRef.value)
            } else {
                ElMessage.error(message ? message : '更新失败,请稍后重试!')
            }
        }
    })
}

四、文章分类删除

1. 界面

<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" @click="editCategoryClick(row)"></el-button>
          <el-popconfirm title="确认删除吗?" @confirm="deleteCategoryClick(row)">
              <template #reference>
                  <el-button :icon="Delete" circle plain type="danger"></el-button>
              </template>
          </el-popconfirm>
      </template>
  </el-table-column>
  <template #empty>
      <el-empty description="没有数据" />
  </template>
</el-table>

2. 接口脚本

export const deleteCategoryService = (categoryData)=>{
    return request.delete('/article/category?id='+categoryData)
    // var params = new URLSearchParams()
    // params.append('id', categoryData)
    // return request.delete('/article/category',{params:params})
}

3. 点击事件

import { addCategoryService, editCategoryService, deleteCategoryService } from '@/api/article.js'

//删除文章分类
const deleteCategoryClick = async (row) => {
    const result = await deleteCategoryService(row.id)
    const message = result.message
    if (result.code == 0) {
        ElMessage.success(message ? message : '删除成功!')
        articleCategoryList()

    } else {
        ElMessage.error(message ? message : '删除失败,请稍后重试!')
    }
}

总结

回到顶部

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

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

相关文章

Java 笔记:常见正则使用

文章目录 Java 笔记&#xff1a;常见正则使用正则简介常用匹配年月日的时间匹配手机号码校验 参考文章 Java 笔记&#xff1a;常见正则使用 正则简介 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言&#xff0c;但…

在Maven工程中手动配置并测试SpringBoot(巨详)

本篇博客承继自博客&#xff1a; 在IDEA 2024.1.3 (Community Edition)中创建Maven项目_idea2024.1.3如何创建maven项目-CSDN博客 配置POM文件 打开工程中的pom.xml文件&#xff0c;先向其中写入 <parent><groupId>org.springframework.boot</groupId><…

Adams 插件Plugin二次开发教程

通过cmd或python开发的Adams程序&#xff0c;可以通过执行cmd&#xff08;python&#xff09;命令的方式直接运行&#xff0c;也可以根据cmd教程中提供的创建菜单和对话框的方式调用这些程序&#xff0c;当然更合适的方式是通过插件的方式对二次开发的程序进行管理&#xff0c;…

Openldap集成Kerberos

文章目录 一、背景二、Openldap集成Kerberos2.1kerberos服务器中绑定Ldap服务器2.1.1创建LDAP管理员用户2.1.2添加principal2.1.3生成keytab文件2.1.4赋予keytab文件权限2.1.5验证keytab文件2.1.6增加KRB5_KTNAME配置 2.2Ldap服务器中绑定kerberos服务器2.2.1生成LDAP数据库Roo…

MicroPython+ESP32 C3+ST7735S LCD屏 WIFI联网显示实时时间

案例地址&#xff1a;https://gitee.com/whltaoin_admin/MP_ESP32_ST7735S- 展示效果 ESP32LCD屏 WIFI联网并显示实时时间 TFT LCD模块参数介绍 名称&#xff1a;1.8 128*160 RGB_TFT驱动芯片&#xff1a;ST7735S ESP32 C3 参数介绍&#xff08;经典款&#xff09; 外观及…

LeetCode 算法:两两交换链表中的节点 c++

原题链接&#x1f517;&#xff1a;两两交换链表中的节点 难度&#xff1a;中等⭐️⭐️ 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交…

sqlcoder实践

背景 Defog llama-3 意义 翻译自然语言到sql&#xff0c;类似脑机接口&#xff0c;大模型重要应用领域 sql是数据库查询标准;关系数据库&#xff0c;工具(datax,sqoop&#xff0c;logstash,hive)&#xff0c;非关系数据库&#xff08;MongoDB&#xff0c;图数据库&#xff…

安装Xshell和Xftp后,打开程序下无法使用,要继续使用此程序,您必须应用最新的更新或使用新版本。

之前我遇到这种情况的时候&#xff0c;修改了nslicense.dll&#xff0c;结果这次重新下载结果把修改代码给忘了&#xff08;因为我也不会这个&#xff09;&#xff0c;于是我用了最直接的办法去官网找最新版本下载&#xff1a;xshell/xftp官网 后面直接点下载&#xff0c;然后开…

网络编程5----初识http

1.1 请求和响应的格式 http协议和前边学过的传输层、网络层协议不同&#xff0c;它是“一问一答”形式的&#xff0c;所以要分为请求和响应两部分看待&#xff0c;同时&#xff0c;请求和响应的格式是不同的&#xff0c;我们来具体介绍一下。 1.1.1 请求 在介绍请求之前&…

PMP报考千万不要踩这些坑

8月份的PMP考试即将到来&#xff0c;在这里预祝大家都能一次过~~~~ - 现在这个大环境不是很好&#xff0c;很多公司都是需要学历、相关证书的&#xff0c;说实在的我公司要求就是除了要有专业证书之外还要额外其他的证书&#xff0c;例如&#xff0c;pmp证书。这段时间我的同…

卷积篇 | YOLOv8改进之引入重新参数化再聚焦卷积RefConv | 即插即用

前言:Hello大家好,我是小哥谈。论文提出了重新参数化再聚焦卷积RefConv作为常规卷积层的替代品,它是一个即插即用模块,可以在没有任何推理成本的情况下提高性能。具体来说,在给定预训练模型的情况下,RefConv对从预训练模型继承的基核进行可训练的再聚焦变换,以建立参数之…

AI制作PPT如何简化大学生的答辩准备?

时间过的好快&#xff0c;马上又到了一年一度的毕业季了。大学生活是丰富多彩的&#xff0c;同时大学的学业也是非常重要的。对于大学生来说最后的毕业答辩是非常重要的&#xff0c;关乎到能不能顺利毕业&#xff0c;想到自己为了答辩PPT熬的夜&#xff0c;掉的头发&#xff0c…

番外篇 | 基于改进YOLOv5的安全帽佩戴检测 | 重参数化结构RepVGG + 空间对象注意力机制RCS-OSA模块

前言:Hello大家好,我是小哥谈。RCS-YOLO是一种目标检测算法,它是基于YOLOv3算法的改进版本。通过查看RCS-YOLO的整体架构可知,其中包括RCS-OSA模块。RCS-OSA模块在模型中用于堆叠RCS模块,以确保特征的复用并加强不同层之间的信息流动。本文针对安全帽佩戴的检测就是基于RC…

dup和dup2函数

#include <unistd.h> int dup(int oldfd); 功能&#xff1a;根据oldfd生成newfd,newfd采用最小位使用原则分配&#xff0c;新旧文件描述符都可以操作文件&#xff0c;它们共享光标和打开文件的方式。 参数&#xff1a;olfd:旧的文件描述符 返回值&#xff1a;成功返回新的…

视频监控平台功能:国外的硬盘录像机NVR通过ISUP协议(原ehome协议)接入AS-V1000视频平台

目录 一、背景说明 二、ISUP协议介绍 1、海康ISUP协议概述 2、ISUP协议支持主码流和子码流切换 &#xff08;1&#xff09;灵活配置和个性化 &#xff08;2&#xff09;适应不同网络带宽&#xff0c;提高使用体验 3、海康ehome相关文章 三、ISUP协议接入说明 1、平台侧…

【ARMv8/v9 GIC 系列 4.1 -- GIC CPU Interface 访问支持情况】

文章目录 GIC CPU Interface 访问支持Bit[27:24]: GIC CPU接口汇编代码实现访问小结 GIC CPU Interface 访问支持 在ARMv8架构中&#xff0c;ID_AA64PFR0_EL1是一个系统寄存器&#xff0c;提供了有关处理器功能的详绀信息。这个寄存器的位[27:24]专门用于描述GIC&#xff08;通…

VScode中js关闭烦人的ts检查

类似如下的代码在vscode 会报错&#xff0c;我们可以在前面添加忽略检查或者错误&#xff0c;如下&#xff1a; 但是&#xff01;&#xff01;&#xff01;这太不优雅了&#xff01;&#xff01;&#xff01;&#xff0c;js代码命名没有问题&#xff0c;错在ts上面&#xff0c;…

码蹄集 BD202401 补给

错误解法&#xff1a;简单将取半前后的综合排序后取最小值&#xff0c;这样没有考虑这样一种情况&#xff1a;取半的时机不对&#xff0c;也许取半某个大一点的P之后反而能进一步取一个补给点了呢&#xff1f;&#xff1f;对不对。这样简单排序只不过是“最省钱”的一种&#x…

Linux源码阅读笔记02-进程原理及系统调用

进程和进程的生命周期 进程&#xff1a;指计算机中已运行的程序。进程本身不是基本的运行单位&#xff0c;而是线程的容器。程序本身不是基本的运行单位&#xff0c;而是线程的容器。程序是指令、数据和组织形式的描述&#xff0c;进程才是程序的真正运行实例。Linux内核把进程…

AndroidStudio中如何运行class中的main()函数?

直接右键运行Run main()是会报错的, * What went wrong: A problem occurred configuring project :app. > Could not create task :app:RsaUtils.main(). > SourceSet with name main not found. 需要Run main with Coverage 有些文章说需要在gradle.xml里面加上&…