diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 4d3fdbc..864130b 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,6 +2,7 @@ + diff --git a/.vscode/settings.json b/.vscode/settings.json index 7b016a8..e012065 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "java.compile.nullAnalysis.mode": "automatic" + "java.compile.nullAnalysis.mode": "automatic", + "java.configuration.updateBuildConfiguration": "interactive" } \ No newline at end of file diff --git a/vuetest/springboot/pom.xml b/vuetest/springboot/pom.xml index a40b96c..109923a 100644 --- a/vuetest/springboot/pom.xml +++ b/vuetest/springboot/pom.xml @@ -76,6 +76,23 @@ 2.3 + + + cn.hutool + hutool-all + 5.8.18 + + + + + org.apache.poi + poi-ooxml + 5.2.3 + + + + + org.freemarker diff --git a/vuetest/springboot/src/main/java/com/example/springboot/controller/UserController.java b/vuetest/springboot/src/main/java/com/example/springboot/controller/UserController.java index 299511b..4db2007 100644 --- a/vuetest/springboot/src/main/java/com/example/springboot/controller/UserController.java +++ b/vuetest/springboot/src/main/java/com/example/springboot/controller/UserController.java @@ -10,11 +10,22 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.springboot.service.IUserService; import com.example.springboot.entity.User; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.io.InputStream; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletOutputStream; +import java.net.URLEncoder; +import cn.hutool.poi.excel.ExcelReader; +import cn.hutool.poi.excel.ExcelWriter; +import cn.hutool.poi.excel.ExcelUtil; +import org.springframework.beans.factory.annotation.Value; +import java.util.LinkedHashMap; +import java.time.LocalDateTime; /** *

@@ -32,6 +43,9 @@ public class UserController { @Resource private IUserService userService; + @Value("${files.upload.path}") // 从配置文件中读取上传路径 + private String fileUploadPath; + // 新增或者更新 @PostMapping public boolean save(@RequestBody User user) { @@ -79,6 +93,98 @@ public class UserController { queryWrapper.orderByDesc("id"); return userService.page(new Page<>(pageNum, pageSize), queryWrapper); } + + + //导入接口 + @CrossOrigin // 添加跨域注解 + @PostMapping("/import") + public boolean imp(@RequestParam("file") MultipartFile file) throws IOException { + if (file.isEmpty()) { + return false; + } + + try { + InputStream inputStream = file.getInputStream(); + ExcelReader reader = ExcelUtil.getReader(inputStream); + + // 设置列名映射 + reader.addHeaderAlias("用户名", "username"); + reader.addHeaderAlias("密码", "password"); + reader.addHeaderAlias("昵称", "nickname"); + reader.addHeaderAlias("邮箱", "email"); + reader.addHeaderAlias("电话", "phone"); + reader.addHeaderAlias("地址", "address"); + + // 读取数据 + List list = reader.readAll(User.class); + + // 设置创建时间 + for (User user : list) { + user.setCreateTime(LocalDateTime.now()); + } + + // 保存到数据库 + return userService.saveBatch(list); + + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + //导出接口 + @GetMapping("/export") + public void export(HttpServletResponse response) throws IOException { + try { + // 查询所有数据 + List list = userService.list(); + + // 创建一个工作簿 + ExcelWriter writer = ExcelUtil.getWriter(true); + + // 清除默认标题别名 + writer.clearHeaderAlias(); + + // 按照指定顺序设置标题别名 + LinkedHashMap headerAliasMap = new LinkedHashMap<>(); + headerAliasMap.put("username", "用户名"); + headerAliasMap.put("password", "密码"); + headerAliasMap.put("nickname", "昵称"); + headerAliasMap.put("email", "邮箱"); + headerAliasMap.put("phone", "电话"); + headerAliasMap.put("address", "地址"); + + // 设置标题别名 + writer.setHeaderAlias(headerAliasMap); + + // 只导出设置了别名的字段 + writer.setOnlyAlias(true); + + // 写入数据 + writer.write(list, true); + + // 设置响应头 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + String fileName = URLEncoder.encode("用户信息.xlsx", "UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + + // 输出 + ServletOutputStream out = response.getOutputStream(); + writer.flush(out, true); + + // 关闭流 + writer.close(); + out.close(); + + } catch (Exception e) { + e.printStackTrace(); + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println("导出失败:" + e.getMessage()); + } + } } diff --git a/vuetest/springboot/src/main/java/com/example/springboot/entity/User.java b/vuetest/springboot/src/main/java/com/example/springboot/entity/User.java index c85fe76..cdad5dd 100644 --- a/vuetest/springboot/src/main/java/com/example/springboot/entity/User.java +++ b/vuetest/springboot/src/main/java/com/example/springboot/entity/User.java @@ -3,9 +3,12 @@ package com.example.springboot.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldFill; import java.io.Serializable; import java.time.LocalDateTime; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; /** *

@@ -15,6 +18,7 @@ import io.swagger.v3.oas.annotations.media.Schema; * @author hzk * @since 2025-02-10 */ +@Data @TableName("sys_user") @Schema(description = "User对象") public class User implements Serializable { @@ -26,26 +30,32 @@ public class User implements Serializable { private Integer id; @Schema(description = "用户名") - private String username; + private String username = ""; @Schema(description = "密码") - private String password; + private String password = ""; @Schema(description = "邮箱") - private String email; + private String email = ""; @Schema(description = "电话") - private String phone; + private String phone = ""; @Schema(description = "地址") - private String address; + private String address = ""; @Schema(description = "昵称") - private String nickname; + private String nickname = ""; + @TableField(fill = FieldFill.INSERT) @Schema(description = "创建时间") private LocalDateTime createTime; + // 构造函数 + public User() { + this.createTime = LocalDateTime.now(); + } + public Integer getId() { return id; } diff --git a/vuetest/springboot/src/main/resources/application.yml b/vuetest/springboot/src/main/resources/application.yml index ed85a60..6b26bdf 100644 --- a/vuetest/springboot/src/main/resources/application.yml +++ b/vuetest/springboot/src/main/resources/application.yml @@ -9,6 +9,11 @@ spring: jackson: serialization: fail-on-empty-beans: false + servlet: + multipart: + max-file-size: 10MB + max-request-size: 10MB + enabled: true server: port: 9090 @@ -23,4 +28,9 @@ springdoc: enabled: true swagger-ui: path: /swagger-ui.html - enabled: true \ No newline at end of file + enabled: true + +files: + upload: + path: D:/temp/ # Windows系统 + # path: /tmp/ # Linux/Mac系统 \ No newline at end of file