目录
Mapper 接口(HwKitchenStoreInfoMapper)
Mapping.xml(HwKitchenStoreInfoMapper.xml)
controller层(KitchenStoreManageController)
service层(IKitchenStoreManageService)
serviceImpl层(KitchenStoreManageServiceImpl)
1、业务场景
(1)、分享原因
之前笔者分享过导出功能的一种写法,既然有导出功能,那相对的导入功能也是存在的一种需求,本期笔者就分享一下导入功能的一种思路;
(2)、需求分析
导入功能可分为两个子需求,子需求1是下载导入模板,子需求2是导入模板数据;
(3)、数据库设计
本次代码演示使用的业务背景是商铺基本信息管理,预插入数据对应的数据库设计如下图所示:
餐厨商铺信息表
2、开发环境和工具
因为该业务功能是在我实习公司已有项目下的拓展,所以环境依赖较多,我将重点阐述我所负责的后端代码逻辑,开发环境和工具只会简单带过;如果在借鉴代码过程中缺失包或者依赖,请根据IDE提示或者自行百度调试(就当锻炼自己对开发工具的熟悉程度啦);
(1)、IDE:IntelliJ IDEA 2022.1
(2)、测试:Postman
(3)、JDK:jdk-11.0.15
(4)、Spring Boot Version:2.2.5.RELEASE
(5)、modelVersion:4.0.0
(6)、pomVersion:0.0.1-SNAPSHOT
3、代码思路
4、参考代码
本次导入功能以最简单的(商铺)管理为代码背景来进行展示和说明:
导出模板vo(KitchenStoreExcelVo)
代码说明:
(1)、@Excel里面需要声明三个东西:
name:列名,对应数据库需要的字段;必填还是选填取决于数据库对应的字段能否为空,可以添加适当备注引导使用者正确填写;注意!并不是所有的数据库字段都需要用户导入,这里选择字段时参照的标准是对应新增功能需要用户填写的信息,所以本质是一个变相的新增功能,只是可以达到批量新增的效果而已;
orderNum:第几列,从0(这里的0等价于第1列)开始;
width:列宽,长度定义取决于你的列名(name)的长度,自行调试感受就行;
(2)、其他就是Vo的基本写法了,定义好属性后idea可以一键生成get和set方法,只需要右键空白处然后点击弹出菜单的Generate选择Getter and Setter,最后全选对应的属性即可;
package xxx.vo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
/**
* <p>
* 商铺信息导入excel模板下载用vo
* </p>
*
* @author Mike-GY
* @since 2022-08-29
*/
public class KitchenStoreExcelVo {
/**
* 商铺名称
*/
@Excel(name = "商铺名称(必填,不能重复)", orderNum = "0", width = 30)
private String storeName;
/**
* 商铺负责人名称
*/
@Excel(name = "负责人(选填)", orderNum = "1", width = 20)
private String leader;
/**
* 商铺负责人电话
*/
@Excel(name = "联系电话(选填)", orderNum = "2", width = 20)
private String leaderPhone;
/**
* 商铺类型名称
*/
@Excel(name = "商铺类型(必填,请按照新增商铺功能下商铺类型可选选项来填写)", orderNum = "3", width = 60)
private String typeName;
/**
* 所属政府区域名称
*/
@Excel(name = "所属组织(必填,请按照新增商铺功能下所属组织可选选项来填写)", orderNum = "4", width = 60)
private String depName;
/**
* 使用的垃圾桶数量
*/
@Excel(name = "容器数量(个)(选填)", orderNum = "5", width = 25)
private Integer garbageCanNum;
/**
* 商铺地址
*/
@Excel(name = "地址(选填)", orderNum = "6", width = 20)
private String storeAddress;
/**
* 营业状态名称
*/
@Excel(name = "营业状态(选填)", orderNum = "7", width = 20)
private String storeStatusName;
/**
* 签约时间
*/
@Excel(name = "签约时间(选填,时间格式:yyyy-MM-dd)", orderNum = "8", width = 40)
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GTM+8")
private Date signTime;
public String getStoreName() {
return storeName;
}
public void setStoreName(String storeName) {
this.storeName = storeName;
}
public String getLeader() {
return leader;
}
public void setLeader(String leader) {
this.leader = leader;
}
public String getLeaderPhone() {
return leaderPhone;
}
public void setLeaderPhone(String leaderPhone) {
this.leaderPhone = leaderPhone;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getDepName() {
return depName;
}
public void setDepName(String depName) {
this.depName = depName;
}
public Integer getGarbageCanNum() {
return garbageCanNum;
}
public void setGarbageCanNum(Integer garbageCanNum) {
this.garbageCanNum = garbageCanNum;
}
public String getStoreAddress() {
return storeAddress;
}
public void setStoreAddress(String storeAddress) {
this.storeAddress = storeAddress;
}
public String getStoreStatusName() {
return storeStatusName;
}
public void setStoreStatusName(String storeStatusName) {
this.storeStatusName = storeStatusName;
}
public Date getSignTime() {
return signTime;
}
public void setSignTime(Date signTime) {
this.signTime = signTime;
}
}
商铺信息表(HwKitchenStoreInfo)
该model对应的是之前提到过的预插入数据对应的数据库的model,我是使用代码生成器快捷生成的,只能借鉴个结构,最上方的注入估计读者们抄不了,因为依赖存放的包位置绝对不一样,请自行查找补充;
package xxx.model;
import com.baomidou.mybatisplus.enums.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serializable;
/**
* <