谷粒商城第七天-商品服务之分类管理下的删除、新增以及修改商品分类

news2024/11/17 3:34:12

目录

一、总述

1.1 前端思路

1.2 后端思路

二、前端部分

2.1 删除功能

2.2 新增功能

2.3 修改功能

三、后端部分

3.1 删除接口

3.2 新增接口

3.3 修改接口

四、总结


一、总述

1.1 前端思路

 删除和新增以及修改的前端无非就是点击按钮,就向后端发送请求,交与后端真正的执行相关操作。

具体来说,就是正确的找到按钮,合理的绑定好点击事件,然后处理的方法写好:使用引入的请求对象,使用请求对象发送请求

对于删除操作前和操作后是需要进行消息框提示的,这可以直接使用若依框架提供给我们进行提示。

对于新增和修改都是需要点击后弹出一个弹窗,新增的话就是在表单输入信息,然后将信息动态绑定到数据域中的字段,然后点击提交将信息提交给后端完成新增操作即可,新增通常有些字段是需要有默认值的,修改和新增差不多,就字段而言的话,就只是某几个字段的修改,不涉及到默认值什么的,就将修改的几个字段提交给后端就行了,这点区别还是次要的,修改最关键的就是内容回显,需要回显最新的数据,这点需要注意。就是打开弹窗,需要向后端获取到最新数据,然后绑定到数据域中,由于和表单信息进行了绑定,表单里面的信息就能正常显示最新信息了。

这里代码如果要不冗余的话,那个弹窗完全就可以复用,当点击新增或者是修改按钮的时候,记录下当前是什么情况打开的这个弹窗,然后最后点击提交时按照不同的情况,做不同的处理。

1.2 后端思路

后端就没什么了,简单的增删还有获取信息接口,具体实现交由MyBatisPlus完成增删获取操作。

注意:增删并不是直接无脑的使用,还是需要配置一些东西的。否则的话,会出现一些小的bug,比较烦躁,下面我会进行说明

二、前端部分

现在还是分类管理,所以不需要创建新的组件,仍然使用原先 显示三级分类列表的那个组件就行了。下面我将以此介绍增删改这三个功能的前端实现:

2.1 删除功能

这个删除功能的前端逻辑就那样很简单:

1. 当点击删除按钮给予提示信息,是否确认删除

2. 当点击确认删除之后,向后端发送请求,服务器进行删除

3. 当成功删除之后,基于删除成功的提示信息

代码:

remove(node, data) {
      this.$modal
        .confirm('是否确认删除类别名称为"' + data.name + '"的类别?')
        .then(function () {
          var ids = [];
          ids.push(data.catId);
          return deleteCategory(ids);
        })
        .then(() => {
          this.getTreeList();
          this.selectCids.push(data.parentCid);
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
    }

注意:新增和删除之前要先调好弹窗

<el-dialog :title="title" :visible.sync="dialogVisible" width="30%">
      <el-form :model="category">
        <el-form-item label="分类名称">
          <el-input v-model="category.name" autocomplete="off" ></el-input>
        </el-form-item>
        <el-form-item label="图标地址">
          <el-input v-model="category.icon" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="计量单位">
          <el-input v-model="category.productUnit" autocomplete="off"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="submitData">确 定</el-button>
      </span>
    </el-dialog>

当然这里发请求最重要的请求对象别落下:

export function deleteCategory(data) {
    return request({
        url: '/product/category',
        method: 'delete',
        data: data
    })
}

不要忘记在组件中进行导入哦!!! 

2.2 新增功能

新增的话,我在前端思路那里已经说了,其实很简单

1. 点击新增按钮,打开弹窗(也就是修改弹窗的属性值,参考elementUI官网),并根据父级分类设置好当前新增分类的必要属性值(层级、父id),并保存打开弹窗的方式是新增的状态(以便提交的时候作判断)

注意:因为这里新增和删除要到了同一套的属性,一旦修改过后,其某些属性其实已经就有值了,倘若新增时不清空掉属性值,就会出现错误的值,而新增我们是需要字段属性都为空的。

先在数据域中定义好数据:

新增按钮位置: 

 关键代码:

append(data) {
      this.dialogType = "add";
      this.title = "添加分类";
      this.category.parentCid = data.catId;
      this.category.catLevel = data.catLevel+1;
      this.category.name = "";
      this.category.icon = "";
      this.category.productUnit = "";
      this.dialogVisible = true;
    }

2. 点击提交的时候,将数据域中的信息提交给后端,完成添加操作,之后关闭弹窗,并给予添加成功的提示,最后注意要”还原现场“:也就是新增之后不要收缩起来,新增之后就要展开显示这个新增,这里就参考elementUI文档,展开当前新增节点的父节点(注意这部分的逻辑都是单独写在一个方法中,最终点击提交的时候,再去调用这个方法,至于为什么会调用这个方法而不会调用修改分类方法,原因就是当初打开弹窗的时候保存了状态,再最终提交的时候做了判断)

 

addCategoty() {
      console.log(this.category);
      addCategory(this.category).then((response) => {
        this.dialogVisible = false;
        this.$modal.msgSuccess("添加成功");
        this.getTreeList();
        this.selectCids.push(this.category.parentCid);
      });
    }

submitData(){
        if(this.dialogType == "add"){
            this.addCategory();
        }
        if(this.dialogType == "edit"){
            this.editCategory();
        }
    }

最后重要的请求对象不要忘记编写:

export function addCategory(data) {
    return request({
        url: '/product/category',
        method: 'post',
        data: data
    })
}

2.3 修改功能

修改和新增类似

1. 同样也是点击修改按钮之后,打开弹窗,需要保存打开方式是修改的状态

在打开弹窗之前,向后端发送请求获取到分类的最新信息,绑定到数据域里面去,由于表单的字段属性值与数据域中的进行了绑定,因此分类的最新信息就能进行回显

修改按钮位置:

 关键代码:

edit(data){
        this.dialogType = "edit";
        this.title = "修改分类";
        //拿到分类的最新信息
        getCategory(data.catId).then((response)=>{
            this.category.name = response.data.name;
            this.category.icon = response.data.icon;
            this.category.productUnit = response.data.productUnit;
            this.category.parentCid = response.data.parentCid;
            this.category.catId = response.data.catId;
        })
        this.dialogVisible = true;
    }

2. 填写好信息,填写好的信息会动态的更新数据域中的信息(因为进行了绑定),抽取需要的信息发送到后端,完成分类信息的修改,然后和新增一样也是关闭弹窗,给予提示,最后展开其当前修改节点的父节点

editCategory(){
        var {name,icon,productUnit,catId} = this.category;
        updateCategory({name,icon,productUnit,catId}).then((response)=>{
            this.dialogVisible = false;
            this.$modal.msgSuccess("修改成功");
            this.getTreeList();
            this.selectCids.push(this.category.parentCid);
        })
    }

 最终逻辑,封装的

submitData(){
        if(this.dialogType == "add"){
            this.addCategory();
        }
        if(this.dialogType == "edit"){
            this.editCategory();
        }
    }

 同样请求对象:

export function updateCategory(data) {
    return request({
        url: '/product/category',
        method: 'put',
        data: data
    })
}

三、后端部分

3.1 删除接口

没什么好说的

controller:

/**
     * 删除商品三级分类
     */
    @ApiOperation("删除商品三级分类")
    //@PreAuthorize("@ss.hasPermi('product:category:remove')")
    @Log(title = "商品三级分类", businessType = BusinessType.DELETE)
    @DeleteMapping
    public AjaxResult remove(@RequestBody Long[] catIds) {
        return toAjax(categoryService.removeMenuByIds(Arrays.asList(catIds)));
    }

service:

接口:

boolean removeMenuByIds(List<Long> list);

实现:

 @Override
    public boolean removeMenuByIds(List<Long> list) {
        boolean result = removeByIds(list);
        return result;
    }

这里直接使用的MP的批量删除方法,所以就没有显式写dao层了,逆向代码自动生成的

注意:

1. 这里是逻辑删除,不是物理删除,所以可以在MP的全局配置中配一下字段,另外这里与实际含义相反,所以得在实体类中指明好

实际上删除时0的,在实体类中标明一下:

2. 这里我在测试的时候遇到一个坑,就是删除不了,不知道主键是什么字段,因为我这是使用的MP的自带的根据主键进行删除,就需要指定好实体类哪个属性是主键,得告诉MP

使用@TableId注解进行标识 

/**
     * 新增商品三级分类
     */
    @ApiOperation("新增商品三级分类")
    //@PreAuthorize("@ss.hasPermi('product:category:add')")
    @Log(title = "商品三级分类", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody Category category) {
        return toAjax(categoryService.save(category));
    }

所以最好实体类最开始就把这个注解加上,因为根据主键来进行修改或者是删除这样的操作实在是太多了。 

3. 明明声明主键的注解也加上了,可是还是删除不了,也不报错。

最终是由于jdk版本高的缘故,MP对于高版本的jdk还不支持根据主键删除的方法,将jdk修改为8可以解决

3.2 新增接口

这没什么好说的也是直接使用MP的现成方法,也就是MP中直接插入对象

controller:

/**
     * 新增商品三级分类
     */
    @ApiOperation("新增商品三级分类")
    //@PreAuthorize("@ss.hasPermi('product:category:add')")
    @Log(title = "商品三级分类", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody Category category) {
        return toAjax(categoryService.save(category));
    }

反正直接使用的MP中现成的service接口中的方法,我这里就不写出来了。

注意:

默认的话新增的话,MP默认新增的主键值是按照雪花算法生成的,并不是我们通常想要的主键自增,所以得在配置文件中,在MP的配置那里加上主键自增的配置。这也是使用MP时经常容易忘记的

这是全局配置

3.3 修改接口

同样也是直接使用MP的现成方法

controller:

@ApiOperation("修改商品三级分类")
    //@PreAuthorize("@ss.hasPermi('product:category:edit')")
    @Log(title = "商品三级分类", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody Category category) {
        return toAjax(categoryService.updateById(category));
    }

下面没什么好些的,都是MP的service

注意:这里和删除一样,一定得记得在实体类上标明哪个字段是主键,否则找不到

四、总结

前端部分依旧是写组件中的相关内容。

这里主要是方法逻辑的编写,新增删除修改,新的东西也就是elementUI中的弹窗了,用一下。

其实最终练习的目的就是掌握,一张表的增删改查操作,得掌握这种套路,都差不多的,当然这里主要是练习,因为这里代码很是固定,因此之后都不需要我们再去一个一个的自己去写了,可以使用若依帮我们逆向自动生成的,可见逆向生成器是多么的厉害,后端代码给我们生成好了一套,前端的组件以及api也帮我们生成好了。我们程序员只需要关注核心业务即可。

后端部分更没什么好说的,基本上我都不需要写什么,只是实际在测试的过程中发现了一些问题,

主要是MP的配置上面,比如说主键的指定,主键的增长方式等,以后注意即可。

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

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

相关文章

动脑学院Jetpack Compose学习笔记

最近b站学习了一下Compose相关内容&#xff0c;整理了相关笔记&#xff0c;仅供大家参考。 资源链接如下&#xff0c;象征性收取1个积分 https://download.csdn.net/download/juliantem/88125198

C数据结构——无向图(邻接表方式) 创建与基本使用

源码注释 // // Created by Lenovo on 2022-05-17-下午 4:37. // 作者&#xff1a;小象 // 版本&#xff1a;1.0 //#include <stdio.h> #include <malloc.h>#define TRUE 1 #define FALSE 0#define MAX_ALVNUMS 100 // 最大顶点数/** 定义链队*/ typedef int QEle…

服务器部署Go项目

最近在研究服务器部署项目&#xff0c;用了好几种办法成功部署。这些方法互有利弊&#xff0c;本文就逐一详细演示说明&#xff1a; 目录 1.服务器下载Go环境&#xff0c;直接将项目代码放到服务器上运行 2.服务器不下载Go环境&#xff0c;本地将项目打包成可执行的二进制…

【小程序】快来开发你的第一个微信小游戏(详细流程)

&#x1f973; 作者&#xff1a;伯子南 &#x1f60e; 坚信&#xff1a; 好记性不如乱笔头&#xff0c;独乐乐不如众乐乐 &#x1f4aa; 个人主页&#xff1a;https://blog.csdn.net/qq_34577234?spm1010.2135.3001.5421 &#x1f46c;&#x1f3fb; 觉得博主文章不错的话&…

java基础String类的特性

文章目录 1 String的特性2 String的内存结构1&#xff1a;拼接相关2&#xff1a;new相关3&#xff1a;intern() 1 String的特性 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如"hello" &#xff09;都可以看作是实现此类的实例。 字符…

Python面向对象(二)(构造方法、其它内置方法)

构造方法 属性&#xff08;成员变量&#xff09;的赋值 class Student:name None # 姓名age None # 年龄tel None # 手机号stu1 Student() stu1.name "张三" stu1.age 20 stu1.tel "1212121211"stu2 Student() stu2.name "张…

Pytorch气温预测实战

数据集 数据有8个特征&#xff0c;一个标签值 自变量因变量yearactual:当天的真实最高温度monthdayweek:星期几temp_1:昨天的最高温度temp_2:前天的最高温度值average:在历史中&#xff0c;每年这一天的平均最高温度friend:朋友猜测的温度 year,month,day,week,temp_2,temp_…

【Linux】HTTPS协议是如何保证数据安全的

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;基础概念…

【Linux】进程篇Ⅰ:进程信息、进程状态、环境变量、进程地址空间

文章目录 一、概述二、查看进程信息1. 系统文件夹 /proc2. 用户级工具 ps3. getpid() 函数&#xff1a;查看进程 PID4. 用 kill 杀进程5. 进程优先级 二、进程状态分析0. 1. R (running) 运行状态2. S (sleeping) 休眠状态3. D (disk sleep) 不可中断的休眠状态4. T (stopped) …

【数据结构】顺序表(SeqList)(增、删、查、改)详解

一、顺序表的概念和结构 1、顺序表的概念&#xff1a; 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 2、顺序表的结构&#xff1a; &#xff08;1&#xff09;静态顺序表&#xff1a;使…

Redis Cluster 在Spring中遇到的问题

Redis集群配置可能会在运行时更改。可以添加新节点&#xff0c;可以更改特定插槽的主节点。还有可能因为master宕机或网络抖动等原因&#xff0c;引起了主从切换。 无法感知集群槽位变化 SpringBoot2.x 开始默认使用的 Redis 客户端由 Jedis 变成了 Lettuce&#xff0c;但是当…

忽略nan值,沿指定轴计算标准(偏)差numpy.nanstd()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 沿指定轴方向 计算标准(偏)差 numpy.nanstd() [太阳]选择题 import numpy as np a np.array([[1,2],[np.nan,3]]) print("【显示】a ") print(a) print("【执行】np.std(a)&qu…

QT项目代码去UI界面常用开发步骤

QT项目代码去UI界面常用开发步骤 因项目开发需求&#xff0c;领导要求整个QT项目中不要用UI方式来实现界面&#xff0c;这样能保障程序运行稳定性以及代码的逻辑和可读性,先记录具体操作步骤如下&#xff1a; 1、首先我们通过拖控件的方式来实现界面的设计效果&#xff0c…

ARM汇编基本变量的定义和使用

一、ARM汇编中基本变量是什么? 数字变量: GBLA LCLA SETA 逻辑变量:GBLL LCLL SETL 字符串:GBLS LCLS SETLS 注意需要TAB键定义变量和行首改变值 二、使用步骤 1.引入库 代码如下(示例): GBLA led_num Reset_Handler PROCEXPORT Reset_Handler [WEA…

HCIP BGP综合实验

题目 1、AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24该地址不能在任何协议中宣告&#xff1b; 2、AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以互相通讯&#xff1b; 3、AS间的骨干链路I…

Vue3搭建启动

Vue3搭建&启动 一、创建项目二、启动项目三、配置项目1、添加编辑器配置文件2、配置别名3、处理sass/scss4、处理tsx 四、添加Eslint 一、创建项目 npm create vite 1.project-name 输入项目名vue3-vite 2.select a framework 选择框架 3.select a variant 选择语言 二、启…

idea 安装 插件jrebel 报错LS client not configured.

这个报错找了好久&#xff0c;有博主说版本不对&#xff0c;我脑子没反应过来以为是随便换一个低版本的就行&#xff0c;没想到只能是2022.4.1 这个版本才行 一定要用jrebel 2022.4.1的插件版本&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 插件下载地址&…

网络面试合集

传输层的数据结构是什么&#xff1f; 就是在问他的协议格式&#xff1a;UDP&TCP 2.1.1三次握手 通信前&#xff0c;要先建立连接&#xff0c;确保双方都是在线&#xff0c;具有数据收发的能力。 2.1.2四次挥手 通信结束后&#xff0c;会有一个断开连接的过程&#xff0…

❤️创意网页:绚丽粒子雨动画

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

Codeforces Round 889 (Div. 2) 题解

晚上睡不着就来总结一下叭~&#xff08;OoO&#xff09; 赛后榜(希望不要被Hack...Orz) 终榜&#xff01;&#xff01;&#xff01; 瞬间的辉煌(呜呜呜~) 先不放图了。。怕被dalaoHack...呜呜呜~ 总结 7.29半夜比赛&#xff0c;本来是不想打的&#xff0c;感觉最近做的题太多…