project-admin/src/main/java/com/project/admin/controller/system/SysCompanyController.java
@@ -1,12 +1,18 @@ package com.project.admin.controller.system; import cn.hutool.core.convert.Convert; import com.project.common.annotation.Log; import com.project.common.annotation.RepeatSubmit; import com.project.common.config.ProjectConfig; import com.project.common.core.controller.BaseController; import com.project.common.core.domain.AjaxResult; import com.project.common.core.page.TableDataInfo; import com.project.common.enums.BusinessType; import com.project.common.utils.StringUtils; import com.project.common.utils.file.ImageUtils; import com.project.common.utils.poi.ExcelUtil; import com.project.common.utils.zip.ZipUtils; import com.project.system.domain.SysCompany; import com.project.system.domain.bo.editBo.SysCompanyBo; import com.project.system.domain.bo.queryBo.SysCompanyQueryBo; import com.project.system.domain.vo.SysCompanyResultVo; @@ -20,9 +26,11 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** * 企业信息Controller @@ -38,6 +46,7 @@ private final ISysCompanyService iSysCompanyService; @ApiOperation("查询企业信息列表") @GetMapping("/list") public TableDataInfo list(SysCompanyQueryBo bo) @@ -48,6 +57,22 @@ } @ApiOperation("下载二维码") @GetMapping("/downloadQrcode") public void downloadQrcode(SysCompanyQueryBo bo, HttpServletResponse response) { List<SysCompanyVo> list = iSysCompanyService.queryList(bo); list.forEach(e->{ if (StringUtils.isEmpty(e.getQrcodeImg())){ String qrcode = ImageUtils.createQrcode(e.getCompanyCode(), e.getCompanyName(), "2"); e.setQrcodeImg(qrcode); iSysCompanyService.updateById(Convert.convert(SysCompany.class, e)); } }); List<String> collect = list.stream().map(SysCompanyVo::getQrcodeImg).collect(Collectors.toList()); ZipUtils.downloadToZip(collect, response); } @ApiOperation("导出企业信息列表") //@PreAuthorize("@ss.hasPermi('system:company:export')") project-admin/src/main/java/com/project/admin/controller/tool/QrcodeController.java
New file @@ -0,0 +1,37 @@ package com.project.admin.controller.tool; import com.project.common.core.domain.AjaxResult; import com.project.common.utils.file.ImageUtils; import com.project.system.service.ISysConfigService; import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 功能描述: * * @author ZQN * @version 1.0 2024年07月17日 */ @Api(value = "二维码", tags = {"二维码"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @RequestMapping("/tool/qrcode") public class QrcodeController { private final ISysConfigService configService; @PostMapping("/createQrcode") public AjaxResult createQrcode() { String content = configService.selectConfigByKey("sys.trans.qrcode.url"); return AjaxResult.success(ImageUtils.createQrcode("abssdf1asdfasdfasdfasdsa","沈丘县华顺农业建设工程有限公司沈丘分公司","2")); } } project-common/src/main/java/com/project/common/utils/file/ImageUtils.java
@@ -1,5 +1,17 @@ package com.project.common.utils.file; import com.alibaba.fastjson2.JSONObject; import com.google.zxing.WriterException; import com.project.common.config.ProjectConfig; import com.project.common.constant.Constants; import com.project.common.utils.StringUtils; import com.project.common.utils.WeChatUtils; import com.project.common.utils.qrcode.QRCodeUtil; import org.apache.poi.util.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.net.ssl.*; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; @@ -8,23 +20,6 @@ import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Arrays; import com.alibaba.fastjson2.JSONObject; import com.project.common.config.ProjectConfig; import com.project.common.utils.WeChatUtils; import com.project.common.utils.qrcode.QRCodeUtil; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import org.apache.poi.util.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.project.common.constant.Constants; import com.project.common.utils.StringUtils; import javax.net.ssl.*; import static com.project.common.utils.file.FileUploadUtils.getPathFileName; @@ -120,7 +115,7 @@ * @throws WriterException * @throws IOException */ public static Object createQrcode(String content, String type) public static String createQrcode(String content, String name, String type) { // 本地资源路径 String localPath = ProjectConfig.getQrcodePath(); @@ -192,15 +187,7 @@ } } else if ("2".equals(type)){ try { String destPath = localPath+"/logo.png"; QRCodeUtil.encode(content, destPath, file.getPath(),true); } catch (IOException | WriterException e) { throw new RuntimeException(e); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } QRCodeUtil.contextLoads2(content, name, file.getPath()); } } project-common/src/main/java/com/project/common/utils/qrcode/QRCodeUtil.java
@@ -2,6 +2,7 @@ import com.google.zxing.*; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; @@ -14,7 +15,11 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; public class QRCodeUtil { private static final String CHARSET = "utf-8"; @@ -106,7 +111,8 @@ QRCodeUtil.encode(content, null, outputStream, false); } public static String decode(File file) throws IOException, NotFoundException { public static String decode(File file) throws IOException, NotFoundException { BufferedImage image; image = ImageIO.read(file); if (image == null) { @@ -133,5 +139,70 @@ } } //二维码图上带字 public static void contextLoads2(String content, String name, String filePathStr) { int qrCodeWidth = 700; int qrCodeHeight = 700; int textPadding = 5; // 文本与二维码之间的间距 int textSize = 30; // 文本字体大小 int totalHeight = qrCodeHeight + 300; try { // 生成二维码的BitMatrix BitMatrix bitMatrix = generateQRCode(content, qrCodeWidth, qrCodeHeight); // 将BitMatrix转换为BufferedImage BufferedImage qrCodeImage = MatrixToImageWriter.toBufferedImage(bitMatrix); // 创建一个新的BufferedImage来容纳二维码和文本 BufferedImage combinedImage = new BufferedImage( qrCodeWidth, 900, BufferedImage.TYPE_INT_RGB); // 绘制二维码到新的BufferedImage上 Graphics2D g2d = combinedImage.createGraphics(); g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, qrCodeWidth, 900); g2d.drawImage(qrCodeImage, 0, 0, null); // 设置文本样式 Font font = new Font("BLACK", Font.PLAIN, textSize); g2d.setFont(font); g2d.setColor(Color.BLACK); // 文本颜色 // 绘制文本到图片下方 FontMetrics metrics = g2d.getFontMetrics(); int textX = (qrCodeWidth - metrics.stringWidth("沈丘惠企执法")) / 2; int textX1 = (qrCodeWidth - metrics.stringWidth(name)) / 2; int textY = qrCodeHeight + textPadding; g2d.drawString("沈丘惠企执法", textX, textY); g2d.drawString(name, textX1, textY+50); g2d.dispose(); // 指定存储图片的路径 Path filePath = Paths.get(filePathStr); // 确保文件路径的父目录存在 filePath.getParent().toFile().mkdirs(); // 保存图片到文件 ImageIO.write(combinedImage, "PNG", filePath.toFile()); System.out.println("QR Code with text has been generated: " + filePath.toAbsolutePath()); } catch (WriterException | IOException e) { e.printStackTrace(); } } private static BitMatrix generateQRCode(String text, int width, int height) throws WriterException { Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); return new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints); } } project-common/src/main/java/com/project/common/utils/zip/ImageDownloader.java
New file @@ -0,0 +1,50 @@ package com.project.common.utils.zip; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class ImageDownloader { public static void main(String[] args) throws IOException { File[] imageFiles = new File("images").listFiles(); if (imageFiles != null) { File zipFile = new File("images.zip"); FileOutputStream fos = new FileOutputStream(zipFile); ZipArchiveOutputStream zos = new ZipArchiveOutputStream(fos); for (File imageFile : imageFiles) { if (imageFile.isFile()) { ZipArchiveEntry entry = new ZipArchiveEntry(imageFile.getName()); zos.putArchiveEntry(entry); FileInputStream fis = new FileInputStream(imageFile); byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) != -1) { zos.write(buffer, 0, length); } fis.close(); zos.closeArchiveEntry(); } } zos.finish(); zos.close(); fos.close(); System.out.println("Images downloaded and packed into 'images.zip' successfully."); } else { System.out.println("No images found."); } } } project-common/src/main/java/com/project/common/utils/zip/ZipUtils.java
New file @@ -0,0 +1,60 @@ package com.project.common.utils.zip; import cn.hutool.core.util.ZipUtil; import com.project.common.config.ProjectConfig; import com.project.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; @Component @Slf4j public class ZipUtils { // 本地资源路径 private static String localPath = ProjectConfig.getQrcodePath(); /** * 下载多个文件转zip压缩包 * * @param list 图片数组 * @param response 响应 */ public static void downloadToZip(List<String> list, HttpServletResponse response) { int i = 0; //如果有附件 进行zip处理 if (StringUtils.isNotEmpty(list)) { try { //被压缩文件流集合 InputStream[] srcFiles = new InputStream[list.size()]; //被压缩文件名称 String[] srcFileNames = new String[list.size()]; for (String path : list) { //以下代码为获取图片inputStream String s = path.substring(path.lastIndexOf("/")); InputStream ins = Files.newInputStream(Paths.get(localPath + s)); //塞入流数组中 srcFiles[i] = ins; srcFileNames[i] = path.substring(path.lastIndexOf("/",path.lastIndexOf("-"))); i++; } response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载.zip", "UTF-8")); //多个文件压缩成压缩包返回 ZipUtil.zip(response.getOutputStream(), srcFileNames, srcFiles); } catch (IOException e) { e.printStackTrace(); } } } } project-system/src/main/java/com/project/system/domain/SysCompany.java
@@ -82,6 +82,9 @@ @ApiModelProperty("自定义排序") private Integer sortNum; @ApiModelProperty("企业二维码") private String qrcodeImg; project-system/src/main/java/com/project/system/domain/vo/SysCompanyVo.java
@@ -93,6 +93,9 @@ @ApiModelProperty("备注") private String remark; @ApiModelProperty("企业二维码") private String qrcodeImg; @ApiModelProperty("错误信息数据") private List<ImportError> errorList; project-system/src/main/java/com/project/system/service/impl/SysCompanyServiceImpl.java
@@ -1,28 +1,29 @@ package com.project.system.service.impl; import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.project.common.constant.UserConstants; import com.project.common.core.domain.entity.SysUser; import com.project.common.core.domain.model.ImportError; import com.project.common.exception.base.BaseException; import com.project.common.utils.SecurityUtils; import com.project.common.utils.StringUtils; import com.project.common.utils.file.ImageUtils; import com.project.system.domain.SysCompany; import com.project.system.domain.bo.editBo.SysCompanyBo; import com.project.system.domain.bo.queryBo.SysCompanyQueryBo; import com.project.system.domain.vo.SysCompanyResultVo; import com.project.system.domain.vo.SysCompanyVo; import com.project.system.mapper.SysCompanyMapper; import com.project.system.service.ISysCompanyService; import com.project.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import cn.hutool.core.convert.Convert; import com.project.common.utils.StringUtils; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.transaction.annotation.Transactional; import com.project.system.domain.vo.SysCompanyVo; import com.project.system.domain.bo.editBo.SysCompanyBo; import com.project.system.domain.bo.queryBo.SysCompanyQueryBo; import com.project.system.domain.SysCompany; import com.project.system.mapper.SysCompanyMapper; import com.project.system.service.ISysCompanyService; import java.util.ArrayList; import java.util.Collection; @@ -51,6 +52,11 @@ public SysCompanyVo queryById(Long companyId) { SysCompany db = this.baseMapper.selectById(companyId); if (StringUtils.isEmpty(db.getQrcodeImg())){ String qrcode = ImageUtils.createQrcode(db.getCompanyCode(), db.getCompanyName(), "2"); db.setQrcodeImg(qrcode); this.updateById(db); } return Convert.convert(SysCompanyVo.class , db); } @@ -62,6 +68,9 @@ SysCompany add = Convert.convert(SysCompany.class, bo); add.setCompanyStatus(1); validEntityBeforeSave(add); String qrcode = ImageUtils.createQrcode(add.getCompanyCode(), add.getCompanyName(), "2"); add.setQrcodeImg(qrcode); boolean save = this.save(add); if (isAddUser(bo.getCompanyPhone())){ addCompanyUser(add, 0); @@ -156,6 +165,10 @@ } }); List<SysCompany> companies = Convert.toList(SysCompany.class, resultVo.getVoList()); companies.forEach(e->{ String qrcode = ImageUtils.createQrcode(e.getCompanyCode(), e.getCompanyName(), "2"); e.setQrcodeImg(qrcode); }); boolean b = this.saveOrUpdateBatch(companies); for (SysCompany company : companies) { if (isAddUser(company.getCompanyPhone())){ @@ -168,6 +181,7 @@ //------------------------------------------------------------------------------------- /** * 保存前校验 * @param entity 参数