《尚品甄选》:后台系统——权限管理之分类和品牌管理,使用EasyExcel导入导出数据(debug一遍)

文章目录

  • 一、分类管理
    • 1.1 表结构介绍
    • 1.2 分类列表查询
  • 二、EasyExcel使用
    • 2.1 EasyExcel简介
    • 2.2 导出功能
    • 2.3 导入功能
  • 三、品牌管理
    • 3.1 表结构介绍
    • 3.2 列表查询
    • 3.3 添加品牌
    • 3.4 修改品牌
    • 3.5 删除品牌

一、分类管理

分类管理就是对商品的分类数据进行维护。

在这里插入图片描述

1.1 表结构介绍

分类数据所对应的表结构如下所示,分类数据是具有层级结构的

CREATE TABLE `category` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '分类id',
  `name` varchar(50) DEFAULT NULL COMMENT '分类名称',
  `image_url` varchar(200) DEFAULT NULL,
  `parent_id` bigint DEFAULT NULL COMMENT '父分类id',
  `status` tinyint DEFAULT NULL COMMENT '是否显示[0-不显示,1显示]',
  `order_num` int DEFAULT NULL COMMENT '排序',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0:可用 1:不可用)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9992 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品分类'

1.2 分类列表查询

需求分析:
当页面初始化完毕以后,此时请求后端接口查询所有的一级分类数据,一级分类数据的parent_id为0。当用户点击某一个分类前的小箭头,那么此时就需要查询该分类下所对应的所有的子分类数据,是一种懒加载实现方式。

话不多说,让我们来debug一遍:首先来到controller层,拿到前端传来的第一级id值
在这里插入图片描述
进入业务层,根据id值从数据库中查询数据,可以看到,我这里有10条数据
在这里插入图片描述
下图的for循环是用来判断该分类下是否有子节点,有子节点就设置字段hasChildren为true;前端根据hasChildren的值来展示样式。
在这里插入图片描述
对应的两个SQL语句如下:

@Mapper
public interface CategoryMapper {
    @Select("select * from category where parent_id = #{parentId} and is_deleted = 0 order by id desc")
    List<Category> selectByParentId(Long parentId);
    
    @Select("select count(*) from category where parent_id = #{id} and is_deleted = 0")
    int countByParentId(Long id);
}

二、EasyExcel使用

后台管理系统是管理、处理企业业务数据的重要工具,在这样的系统中,数据的导入和导出功能是非常重要的,其主要意义包括以下几个方面:

  • 提高数据操作效率:手动逐条添加或修改数据不仅费时费力,而且容易出错,此时就可以将大量数据从Excel等表格软件中导入到系统中,通过数据导入功能,可以直接将表格中的数据批量导入到系统中,提高了数据操作的效率。

  • 实现数据备份与迁移:通过数据导出功能,管理员可以将系统中的数据导出为 Excel 或其他格式的文件,以实现数据备份,避免数据丢失。同时,也可以将导出的数据文件用于数据迁移或其他用途。

  • 方便企业内部协作:不同部门可能会使用不同的系统或工具进行数据处理,在这种情况下,通过数据导入和导出功能,可以方便地转换和共享数据,促进企业内部协作。


2.1 EasyExcel简介

官网地址:https://easyexcel.opensource.alibaba.com/

EasyExcel 的主要特点如下:

  • 高性能:EasyExcel 采用了异步导入导出的方式,并且底层使用 NIO 技术实现,使得其在导入导出大数据量时的性能非常高效。

  • 易于使用:EasyExcel 提供了简单易用的 API,用户可以通过少量的代码即可实现复杂的 Excel 导入导出操作。

  • 可扩展性好:EasyExcel 具有良好的扩展性,用户可以通过自定义 Converter 对自定义类型进行转换,或者通过继承 EasyExcelListener 来自定义监听器实现更加灵活的需求。

2.2 导出功能

需求说明:
当用户点击导出按钮的时候,此时将数据库中所有分类的数据导出到一个excel文件中,如图所示:

在这里插入图片描述

首先引入依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.0</version>
</dependency>

接着定义一个实体类来封装每一行的数据:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CategoryExcelVo {
	@ExcelProperty(value = "id" ,index = 0)
	private Long id;
	@ExcelProperty(value = "名称" ,index = 1)
	private String name;
	@ExcelProperty(value = "图片url" ,index = 2)
	private String imageUrl ;
	@ExcelProperty(value = "上级id" ,index = 3)
	private Long parentId;
	@ExcelProperty(value = "状态" ,index = 4)
	private Integer status;
	@ExcelProperty(value = "排序" ,index = 5)
	private Integer orderNum;
}

debug看一遍流程,来到controller层
在这里插入图片描述
来到业务层,首先设置响应结果类型,接着查询分类表,可以看到查询到了703条数据
在这里插入图片描述
数据库查询到的数据不是我们需要的数据格式,因此需要将数据库查询到的数据转换成自己定义的CategoryExcelVo类格式。
在这里插入图片描述
SQL语句编写如下:

    @Select("select id, name, image_url, parent_id, status, order_num from category where is_deleted = 0 order by id")
    List<Category> selectAll();

2.3 导入功能

需求说明:
当用户点击导入按钮的时候,此时会弹出一个对话框,让用户选择要导入的excel文件,选择完毕以后将文件上传到服务端,服务端通过easyExcel解析文件的内容,然后将解析的结果存储到category表中。如下所示:

在这里插入图片描述

通过EasyExcel的操作文档,对于导入功能,我们需要创建监听器类ExcelListener,让其实现ReadListener接口。

public class ExcelListener<T> implements ReadListener<T> {
    /**
     * 每隔100条将数据存入数据库
     */
    private static final int BATCH_COUNT = 100;
    /**
     * 缓存的数据
     */
    private List<T> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    private CategoryMapper categoryMapper;
    public ExcelListener(CategoryMapper categoryMapper) {
        this.categoryMapper = categoryMapper;
    }
    //每解析一行数据就会调用一次该方法
    @Override
    public void invoke(T o, AnalysisContext analysisContext) {
        cachedDataList.add(o);
        //达到BATCH_COUNT时,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            //存储完成,清理list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }
    //excel解析完毕以后需要执行的代码,这里也要保存数据,确保最后遗留的数据也存储到数据库
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
    }
    //保存数据到数据库
    private void saveData() {
        categoryMapper.batchInsert(cachedDataList);
    }
}

这里的批量插入SQL语句编写如下:

    <!--    <T> void batchInsert(List<T> cachedDataList);-->
    <insert id="batchInsert">
        insert into category values
        <foreach collection="cachedDataList" item="item" separator=",">
            (#{item.id}, #{item.name}, #{item.imageUrl}, #{item.parentId},
            #{item.status}, #{item.orderNum},now(), now(), 0)
        </foreach>
    </insert>

创建好监听器,接下来让我们debug,首先来到controller层,接收文件"01.xlsx"

在这里插入图片描述
来到业务层,首先创建监听器类,然后调用read方法读取excel数据。
在这里插入图片描述

三、品牌管理

品牌管理就是对商品所涉及到的品牌数据进行维护。

3.1 表结构介绍

CREATE TABLE `brand` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '品牌名称',
  `logo` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '品牌图标',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0:可用 1:不可用)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='分类品牌'

3.2 列表查询

需求说明:
当品牌管理页面加载完毕以后就向后端发送分页查询请求,后端进行分页查询,返回分页结果数据。

在这里插入图片描述

继续debug,在controller层,接收到分页参数信息
在这里插入图片描述
业务层代码也很简单,分页查询品牌数据,我这里只查到了2条数据
在这里插入图片描述

SQL语句的编写也很容易

    @Select("select * from brand where is_deleted = 0 order by id desc")
    List<Brand> findByPage();

3.3 添加品牌

需求说明:
用户点击添加按钮,填写表单数据,点击提交按钮,请求后端接口完成数据的保存操作。效果如下所示:
在这里插入图片描述
controller层获取品牌name、logo图片地址
在这里插入图片描述
业务层将数据存入品牌表
在这里插入图片描述
SQL语句编写如下:

    @Insert("insert into brand (name, logo, create_time, update_time, is_deleted)\n" +
            "values (#{name}, #{logo}, now(), now(), 0)")
    void save(Brand brand);

3.4 修改品牌

需求说明:
当用户点击修改按钮的时候,对话框中需要将当前行所对应的品牌数据在该表单页面进行展示。当用户在该表单中点击提交按钮的时候那么此时就需要将表单进行提交,在后端需要提交过来的表单数据修改数据库中的即可。
在这里插入图片描述
controller拿到修改的数据,我这里只修改了name字段
在这里插入图片描述
业务层根据实体类,修改品牌表。
在这里插入图片描述
修改操作对应的SQL语句如下:

    <!--    void updateById(Brand brand);-->
    <update id="updateById">
        update brand set
        <if test="name != null and name != ''">
            name = #{name},
        </if>
        <if test="logo != null and logo != ''">
            logo = #{logo},
        </if>
        update_time = now()
        where
        id = #{id}
    </update>

3.5 删除品牌

需求说明:
当点击删除按钮的时候此时需要弹出一个提示框,询问是否需要删除数据?如果用户点击是,那么此时向后端发送请求传递id参数,后端接收id参数进行逻辑删除

在这里插入图片描述
来到controller层,获取到要删除品牌的id值
在这里插入图片描述
业务层也同样很简单,简单的更新语句
在这里插入图片描述
SQL编写如下:

    @Update("update brand set is_deleted = 1,update_time = now() where id = #{id}")
    void deleteById(Long id);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Positive Technologies 公司发布了一种保护容器环境的产品 PT Container Security

根据 Positive Technologies 公司的数据&#xff0c;该类产品在俄罗斯的市场容量为 25 亿卢布&#xff0c;据预测&#xff0c;到 2026 年将增长两倍 Positive Technologies 公司正在增加应用安全方面的产品组合。新产品 PT Container Security可在构建、部署和工业运行阶段自动…

【数学】旋转矩阵

参考链接 OpenGL from OpenGL.GL import * from OpenGL.GLUT import * from math import * import numpy as np def draw_axes():glClear(GL_COLOR_BUFFER_BIT)# 绘制坐标轴glColor3f(1.0, 1.0, 1.0) # 设置坐标轴颜色为白色glBegin(GL_LINES)glVertex2f(-1.0, 0.0) # x 轴g…

Dijkstra算法(贪心),Floyd-Warshall算法(动态规划), Bellman-Ford算法——用Python实现

图论中最短路径三剑客 前言一、Dijkstra算法&#xff08;贪心&#xff09;1.1 Dijkstra在生活中的应用举例1.2 设计思路1.3 算法应用实例1.3.1 以交通规划为例1.3.2 Dijkstra算法执行步骤1.3.3 python代码 1.4 时空复杂度 二、Floyd-Warshall算法&#xff08;动态规划&#xff…

2020年6月9日 Go生态洞察:VS Code Go扩展加入Go项目

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

常用的系统播放器——MediaPlayer生命周期

常用的系统播放器——MediaPlayer 状态图以及生命周期 Idle状态、End状态、Error状态 MediaPlayer创建实例或者调用reset&#xff08;&#xff09;后就处于Idle状态&#xff0c;即就绪。 任意时刻调用release&#xff08;&#xff09;就会进入End 当运行过程中出错&#xf…

Shell - cron_protect.sh 监控 Python、Streaming 程序

目录 一.引言 二.Flink 程序监控 1.shell 脚本 2.crontab 配置 三.Python 程序监控 1.shell 脚本 2.crontab 配置 四.总结 一.引言 业务有流式处理数据的需求&#xff0c;需要 7x24 通过 Flink Python 程序进行处理。为了监控 Flink 与 Python 的程序运行状态并在程…

【RT-DETR改进】SIoU、GIoU、CIoU、DIoU、AlphaIoU等二十余种损失函数

一、本文介绍 这篇文章介绍了RT-DETR的重大改进&#xff0c;特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体&#xff0c;如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU&#xff0c;还融合了“Alpha”思想&#xff0c;创造了一系列新的损失函数。这些组合形式的…

Python中使用matplotlib库绘图中如何给图形的图例设置中文字体显示

问题&#xff1a;当使用matplotlib绘图时遇到绘图&#xff0c;图例显示不出来中文字体 解决方式&#xff1a; 1&#xff09;加载字体管理库 from matplotlib.font_manager import FontProperties 2&#xff09;设置系统上字体的路径 font FontProperties(fname"C:\\W…

MybatisPlus改造逻辑删除有多方便

MybatisPlus的逻辑删除可以有效保留历史数据。之前没有用逻辑删除的项目&#xff0c;想改造成逻辑删除总共需要几步&#xff1f; 答案&#xff1a;4步搞定 一、修改pom.xml的MybatisPlus版本&#xff08;注意版本兼容性&#xff09; <properties>...<!--<mybatis-…

时尚和美容网站的技术 SEO:提示和最佳实践

如果你对美容和时尚感兴趣&#xff0c;做了一个网站&#xff0c;但不知道如何在上面做技术SEO&#xff1f;此外&#xff0c;时尚和美容网站的技术 SEO 没有任何特别的指南&#xff01; 我们听到了你的声音&#xff01;但首先&#xff0c;请记住&#xff0c;技术性SEO不是在一两…

与珎同行录-开篇-231129

与珎同行录-开篇 珎就是对陪伴并帮助我写代码的AI的昵称 能不能读懂这个绕口令问题呢? 连续的椎体的相邻椎体质心的相邻质心的质心作为当前质心所在的椎体的质心, 该质心的方向代表该椎体的上下方向 如何代码实现呢? 还是没看懂…好吧最终的算法是:

记一次处理大数据而导致的内存溢出问题

问题 订单服务通过MQ进行订单同步时&#xff0c;刚启动可以正常消费&#xff0c;但是跑一会就会卡住&#xff0c;每次都是第8个kafka分区不行再进行消费&#xff0c;其他分区消费的很慢。 现象 首先&#xff0c;CPU超高&#xff0c;达到百分之300多&#xff1b;其次&#xf…

Python内置类属性`__name__`属性的使用教程

更多Python学习内容&#xff1a;ipengtao.com Python中的__name__是一种内置的特殊属性&#xff0c;通常用于判断模块是作为主程序运行还是作为模块被导入。本文将深入讲解__name__属性的用法&#xff0c;通过丰富的示例代码展示其在不同情景下的应用。 模块作为主程序运行 当一…

深入了解Java8新特性-日期时间API:LocalDateTime类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概22000多字&#xff0c;预计阅读时间长需要20分钟以上。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

idea创建spring boot项目,java版本只能选择17和21

1.问题描述 java版本为"11.0.20"&#xff0c;idea2023创建spring boot项目时&#xff08;File->Project->Spring Initializr&#xff09;&#xff0c;java版本无法选择11&#xff0c;导致报错&#xff0c;如下图所示&#xff1a; 2.原因 spring2.X版本在2023…

类 —— 友元、常/静态成员函数

类 类的大小 和结构体大小求法一致。但需注意&#xff0c;普通空类也会占用 1 字节大小&#xff0c;因为普通空类可以实例化对象。 而 抽象空类占 4 字节&#xff08;32 位机中&#xff09;&#xff0c;因为抽象空类中含有虚指针&#xff08;含有虚函数的非抽象空类同理&am…

Vue指令之v-html

在Vue中有很多特殊的标签属性&#xff0c;这些属性一般以’v’开头&#xff0c;用于在标签中实现特殊的功能。 例如&#xff0c;当Vue实例的data是一个inner html&#xff0c;我们想在网页上渲染这部分html&#xff0c;如果依然使用之前的{{ variable }}&#xff0c;则只会将i…

排序算法:n个0~1000之间的整数,将他们从大到小排序

上榜理由&#xff1a; 如果没见过这种排序题&#xff0c;可能首先想到的就是常用的排序算法&#xff0c;比如快速排序&#xff0c;归并排序&#xff0c;那如果输入的n足够大&#xff0c;时间复杂度肯定比较高。其实题目0-1000的范围是一个题眼&#xff0c;所以一定有更优的排序…

【鸿蒙应用ArkTS开发系列】- 选择图片、文件和拍照功能实现

文章目录 前言创建多媒体Demo工程创建MediaBean 实体类创建MediaHelper工具类API标记弃用问题动态申请多媒体访问权限实现选择图片显示功能打包测试 前言 在使用App的时候&#xff0c;我们经常会在一些社交软件中聊天时发一些图片或者文件之类的多媒体文件&#xff0c;那在鸿蒙…

网络安全--基于Kali的网络扫描基础技术

文章目录 1. 标准ICMP扫描1.1使用Ping命令1.1.1格式1.1.2实战 1.2使用Nmap工具1.2.1格式1.2.2实战1.2.2.1主机在线1.2.2.2主机不在线 1.3使用Fping命令1.3.1格式1.3.2实战 2. 时间戳查询扫描2.1格式2.2实战 3. 地址掩码查询扫描3.1格式3.2实战 2. TCP扫描2.1TCP工作机制2.2TCP …