diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 958e4cc..e91bfef 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -20,5 +20,6 @@ + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 649fe27..4c7f39d 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -4,5 +4,6 @@ + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 44de3ab..1b1ae75 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,18 +1,21 @@ + - + \ No newline at end of file diff --git a/spzx-manager/pom.xml b/spzx-manager/pom.xml index 3a3364d..0433159 100644 --- a/spzx-manager/pom.xml +++ b/spzx-manager/pom.xml @@ -53,6 +53,7 @@ org.springframework.boot spring-boot-starter-test + test diff --git a/spzx-manager/src/main/java/cn/bunny/controller/CategoryController.java b/spzx-manager/src/main/java/cn/bunny/controller/CategoryController.java index 2fecbce..f76efec 100644 --- a/spzx-manager/src/main/java/cn/bunny/controller/CategoryController.java +++ b/spzx-manager/src/main/java/cn/bunny/controller/CategoryController.java @@ -7,11 +7,10 @@ import cn.bunny.common.spzx.model.vo.common.ResultCodeEnum; import cn.bunny.service.CategoryService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -22,6 +21,20 @@ public class CategoryController { @Autowired CategoryService categoryService; + @Operation(summary = "导入文件", operationId = "导入Excel") + @PostMapping("importData") + public Result importData(@RequestParam("file") MultipartFile file) { + categoryService.importData(file); + return Result.build(null, ResultCodeEnum.SUCCESS); + } + + @Operation(summary = "导出Excel", operationId = "导出文件为Excel") + @GetMapping("exportData") + public void exportData(HttpServletResponse response) { + categoryService.exportData(response); + } + + @Operation(summary = "查询分类类别", description = "使用懒加载") @GetMapping("/findCategoryList/{id}") public Result findCategoryList(@PathVariable("id") Long id) { diff --git a/spzx-manager/src/main/java/cn/bunny/controller/SysUserController.java b/spzx-manager/src/main/java/cn/bunny/controller/SysUserController.java index 780abc9..18e7558 100644 --- a/spzx-manager/src/main/java/cn/bunny/controller/SysUserController.java +++ b/spzx-manager/src/main/java/cn/bunny/controller/SysUserController.java @@ -22,15 +22,17 @@ public class SysUserController { @Operation(summary = "查询用户列表", description = "查询用户列表,包含关键字分页器") @GetMapping(value = "findByPage/{pageNum}/{pageSize}") - public Result findByPage(@PathVariable("pageNum") Integer pageNum, @PathVariable("pageSize") Integer pageSize, SysUserDto sysUserDto) { + public Result findByPage(@PathVariable("pageNum") Integer pageNum, + @PathVariable("pageSize") Integer pageSize, + SysUserDto sysUserDto) { PageInfo pageInfo = sysUserService.findByPage(pageNum, pageSize, sysUserDto); return Result.build(pageInfo, ResultCodeEnum.SUCCESS); } @Operation(summary = "用户添加", description = "添加用户") - @PostMapping("saveSysuser") - public Result saveSysuser(@RequestBody SysUser sysUser) { - sysUserService.saveSysuser(sysUser); + @PostMapping("saveSysUser") + public Result saveSysUser(@RequestBody SysUser sysUser) { + sysUserService.saveSysUser(sysUser); return Result.build(null, ResultCodeEnum.SUCCESS); } @@ -42,7 +44,7 @@ public class SysUserController { } @Operation(summary = "删除用户", description = "删除用户将status改为1") - @PutMapping("deleteUserById/{userId}") + @DeleteMapping("deleteById/{userId}") public Result deleteUserById(@PathVariable("userId") Integer userId) { sysUserService.deleteUserById(userId); return Result.build(null, ResultCodeEnum.SUCCESS); diff --git a/spzx-manager/src/main/java/cn/bunny/lister/ExcelLister.java b/spzx-manager/src/main/java/cn/bunny/lister/ExcelLister.java new file mode 100644 index 0000000..8652257 --- /dev/null +++ b/spzx-manager/src/main/java/cn/bunny/lister/ExcelLister.java @@ -0,0 +1,55 @@ +package cn.bunny.lister; + +import cn.bunny.common.spzx.model.entity.product.Category; +import cn.bunny.common.spzx.model.vo.product.CategoryExcelVo; +import cn.bunny.mapper.CategoryMapper; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.util.ListUtils; + +import java.util.List; + +public class ExcelLister extends AnalysisEventListener { + /** + * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 + */ + private static final int BATCH_COUNT = 100; + /** + * 缓存的数据 + */ + private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + + // 获取mapper对象 + private final CategoryMapper categoryMapper; + + public ExcelLister(CategoryMapper categoryMapper) { + this.categoryMapper = categoryMapper; + } + + @Override + public void invoke(T o, AnalysisContext analysisContext) { + CategoryExcelVo data = (CategoryExcelVo) o; + cachedDataList.add(data); + // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM + if (cachedDataList.size() >= BATCH_COUNT) { + saveData(); + // 存储完成清理 list + cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + } + } + + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // excel解析完毕以后需要执行的代码 + // 这里也要保存数据,确保最后遗留的数据也存储到数据库 + saveData(); + } + + /** + * 保存方法 + */ + private void saveData() { + categoryMapper.batchInsert((List) cachedDataList); + } +} diff --git a/spzx-manager/src/main/java/cn/bunny/mapper/CategoryMapper.java b/spzx-manager/src/main/java/cn/bunny/mapper/CategoryMapper.java index 09204fe..e90bbed 100644 --- a/spzx-manager/src/main/java/cn/bunny/mapper/CategoryMapper.java +++ b/spzx-manager/src/main/java/cn/bunny/mapper/CategoryMapper.java @@ -12,4 +12,10 @@ public interface CategoryMapper { // 查询是否有下级菜单 int selectCountByParentId(Long parentId); + + // 导出Excel---查询所有分类 + List findAll(); + + // 保存方法---插入数据 + void batchInsert(List categoryList); } diff --git a/spzx-manager/src/main/java/cn/bunny/service/CategoryService.java b/spzx-manager/src/main/java/cn/bunny/service/CategoryService.java index 735fa96..9349baa 100644 --- a/spzx-manager/src/main/java/cn/bunny/service/CategoryService.java +++ b/spzx-manager/src/main/java/cn/bunny/service/CategoryService.java @@ -1,10 +1,18 @@ package cn.bunny.service; import cn.bunny.common.spzx.model.entity.product.Category; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; import java.util.List; public interface CategoryService { // 根据id查询分类列表 List findCategoryList(Long id); + + // 导出Excel + void exportData(HttpServletResponse response); + + // 导入文件 + void importData(MultipartFile multipartFile); } diff --git a/spzx-manager/src/main/java/cn/bunny/service/SysUserService.java b/spzx-manager/src/main/java/cn/bunny/service/SysUserService.java index 100daa0..bfcf3f1 100644 --- a/spzx-manager/src/main/java/cn/bunny/service/SysUserService.java +++ b/spzx-manager/src/main/java/cn/bunny/service/SysUserService.java @@ -21,7 +21,7 @@ public interface SysUserService { PageInfo findByPage(Integer pageNum, Integer pageSize, SysUserDto sysUserDto); // 用户添加 - void saveSysuser(SysUser sysUser); + void saveSysUser(SysUser sysUser); // 用户修改 void updateSysUser(SysUser sysUser); diff --git a/spzx-manager/src/main/java/cn/bunny/service/impl/CategoryServiceImpl.java b/spzx-manager/src/main/java/cn/bunny/service/impl/CategoryServiceImpl.java index 19e8fd0..d048822 100644 --- a/spzx-manager/src/main/java/cn/bunny/service/impl/CategoryServiceImpl.java +++ b/spzx-manager/src/main/java/cn/bunny/service/impl/CategoryServiceImpl.java @@ -1,12 +1,24 @@ package cn.bunny.service.impl; +import cn.bunny.common.exception.BunnyException; import cn.bunny.common.spzx.model.entity.product.Category; +import cn.bunny.common.spzx.model.vo.common.ResultCodeEnum; +import cn.bunny.common.spzx.model.vo.product.CategoryExcelVo; +import cn.bunny.lister.ExcelLister; import cn.bunny.mapper.CategoryMapper; import cn.bunny.service.CategoryService; +import com.alibaba.excel.EasyExcel; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.List; @Service @@ -28,4 +40,50 @@ public class CategoryServiceImpl implements CategoryService { } return categoryList; } + + // 导出Excel + @Override + public void exportData(HttpServletResponse response) { + try { + // 1. 设置响应头信息 + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + + String filename = URLEncoder.encode("分类数据", StandardCharsets.UTF_8); + + response.setHeader("Content-dispostion", "attachment;filename=" + filename + ".xlsx"); + // 2. 调用mapper,查询所有分类,返回list集合 + List categoryList = categoryMapper.findAll(); + List categoryExcelVoArrayList = new ArrayList<>(); + + for (Category category : categoryList) { + CategoryExcelVo categoryExcelVo = new CategoryExcelVo(); + BeanUtils.copyProperties(category, categoryExcelVo); + categoryExcelVoArrayList.add(categoryExcelVo); + } + + EasyExcel.write(response.getOutputStream(), CategoryExcelVo.class) + .sheet("分类数据") + .doWrite(categoryExcelVoArrayList); + } catch (Exception e) { + e.printStackTrace(); + throw new BunnyException(ResultCodeEnum.DATA_ERROR); + } + + } + + // 导入文件 + @Override + public void importData(MultipartFile file) { + try { + // 创建监听器对象,传递mapper对象 + ExcelLister excelListener = new ExcelLister<>(categoryMapper); + // 调用read方法读取excel数据 + EasyExcel.read(file.getInputStream(), + CategoryExcelVo.class, + excelListener).sheet().doRead(); + } catch (IOException e) { + throw new BunnyException(ResultCodeEnum.DATA_ERROR); + } + } } \ No newline at end of file diff --git a/spzx-manager/src/main/java/cn/bunny/service/impl/SysRoleServiceImpl.java b/spzx-manager/src/main/java/cn/bunny/service/impl/SysRoleServiceImpl.java index 749795f..5df5746 100644 --- a/spzx-manager/src/main/java/cn/bunny/service/impl/SysRoleServiceImpl.java +++ b/spzx-manager/src/main/java/cn/bunny/service/impl/SysRoleServiceImpl.java @@ -31,8 +31,7 @@ public class SysRoleServiceImpl implements SysRoleService { // 根据条件查询所以数据 List list = sysRoleMapper.findByPage(sysRoleDto); // 封装pageinfo对象 - PageInfo pageInfo = new PageInfo<>(list); - return pageInfo; + return new PageInfo<>(list); } // 角色添加的方法 diff --git a/spzx-manager/src/main/java/cn/bunny/service/impl/SysUserServiceImpl.java b/spzx-manager/src/main/java/cn/bunny/service/impl/SysUserServiceImpl.java index 9621959..5c7d64d 100644 --- a/spzx-manager/src/main/java/cn/bunny/service/impl/SysUserServiceImpl.java +++ b/spzx-manager/src/main/java/cn/bunny/service/impl/SysUserServiceImpl.java @@ -96,13 +96,13 @@ public class SysUserServiceImpl implements SysUserService { @Override public PageInfo findByPage(Integer pageNum, Integer pageSize, SysUserDto sysUserDto) { PageHelper.startPage(pageNum, pageSize); - List list = sysUserMapper.findByPage(sysUserDto); - return new PageInfo<>(list); + List sysUserList = sysUserMapper.findByPage(sysUserDto); + return new PageInfo(sysUserList); } // 用户添加 @Override - public void saveSysuser(SysUser sysUser) { + public void saveSysUser(SysUser sysUser) { // 判断用户名不重复 String userName = sysUser.getUserName(); SysUser dbUser = sysUserMapper.selectUserInfoByUserName(userName); diff --git a/spzx-manager/src/main/resources/mapper/category/CategoryMapper.xml b/spzx-manager/src/main/resources/mapper/category/CategoryMapper.xml index ad73207..c96a113 100644 --- a/spzx-manager/src/main/resources/mapper/category/CategoryMapper.xml +++ b/spzx-manager/src/main/resources/mapper/category/CategoryMapper.xml @@ -8,6 +8,34 @@ id,name,image_url,parent_id,status,order_num,create_time,update_time,is_deleted + + + insert into category ( + id, + name, + image_url, + parent_id, + status, + order_num, + create_time , + update_time , + is_deleted + ) values + + ( + #{item.id}, + #{item.name}, + #{item.imageUrl}, + #{item.parentId}, + #{item.status}, + #{item.orderNum}, + now(), + now(), + 0 + ) + + + + + + diff --git a/spzx-manager/src/main/resources/mapper/user/SysUserMapper.xml b/spzx-manager/src/main/resources/mapper/user/SysUserMapper.xml index 6d9d191..2c5a139 100644 --- a/spzx-manager/src/main/resources/mapper/user/SysUserMapper.xml +++ b/spzx-manager/src/main/resources/mapper/user/SysUserMapper.xml @@ -86,7 +86,6 @@ and is_deleted=0 - order by id desc \ No newline at end of file diff --git a/spzx-manager/src/main/test/java/cn/bunny/common/EasyExcel.java b/spzx-manager/src/main/test/java/cn/bunny/common/EasyExcel.java new file mode 100644 index 0000000..8788490 --- /dev/null +++ b/spzx-manager/src/main/test/java/cn/bunny/common/EasyExcel.java @@ -0,0 +1,31 @@ +package java.cn.bunny.common; + +import cn.bunny.common.spzx.model.vo.product.CategoryExcelVo; +import cn.bunny.service.CategoryService; + +import java.util.ArrayList; +import java.util.List; + +public class EasyExcel { + public static void main(String[] args) { + read(); + // write(); + } + + public static void read() { + String fileName = "F:\\java项目\\尚硅谷-尚品甄选项目\\资料\\01.xlsx"; + ExcelListener excelListener = new ExcelListener(); + com.alibaba.excel.EasyExcel.read(fileName, CategoryService.class, excelListener) + .sheet().doRead(); + + List data = excelListener.getData(); + System.out.println(data); + } + + public static void write() { + List list = new ArrayList<>(); + + com.alibaba.excel.EasyExcel.write("F:\\java项目\\尚硅谷-尚品甄选项目\\资料\\02.xlsx", CategoryExcelVo.class) + .sheet("分类数据").doWrite(list); + } +} diff --git a/spzx-manager/src/main/test/java/cn/bunny/common/ExcelListener.java b/spzx-manager/src/main/test/java/cn/bunny/common/ExcelListener.java new file mode 100644 index 0000000..36c632c --- /dev/null +++ b/spzx-manager/src/main/test/java/cn/bunny/common/ExcelListener.java @@ -0,0 +1,26 @@ +package java.cn.bunny.common; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +public class ExcelListener extends AnalysisEventListener { + private final List data = new ArrayList<>(); + + // 读取Excel内容 + @Override + public void invoke(T t, AnalysisContext analysisContext) { + data.add(t); + } + + public List getData() { + return data; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + + } +}