jeecg生成二维码
时间: 2025-01-04 14:30:53 浏览: 4
### 使用 Jeecg 框架实现二维码生成功能
#### 1. 准备工作
为了在 Jeecg 框架中实现二维码生成功能,首先需要引入必要的依赖库。由于 Jeecg 是基于 Spring Boot 构建的企业级低代码平台,可以借助 Google ZXing 库来处理二维码的生成。
```xml
<!-- pom.xml -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.0</version>
</dependency>
```
这些依赖项允许应用程序创建和解析二维码图像文件[^1]。
#### 2. 创建 QRCode 工具类
定义 `QRCodeUtil` 类用于封装二维码生成逻辑:
```java
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
public class QRCodeUtil {
private static final int QRCODE_SIZE = 300;
private static final String FORMAT_NAME = "png";
public static byte[] createQrCode(String content, BufferedImage logoImage) throws Exception {
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
ByteArrayOutputStream os = new ByteArrayOutputStream();
writeToFile(bitMatrix, FORMAT_NAME, os, logoImage);
return os.toByteArray();
}
private static void writeToFile(BitMatrix matrix, String format, OutputStream file, BufferedImage logoImage) throws IOException {
BufferedImage image = toBufferedImage(matrix);
Graphics2D g = image.createGraphics();
if (logoImage != null) {
int widthLogo = logoImage.getWidth(null) > QRCODE_SIZE * 2 / 10 ? (QRCODE_SIZE * 2 / 10) : logoImage.getWidth(null),
heightLogo = logoImage.getHeight(null) > QRCODE_SIZE * 2 / 10 ? (QRCODE_SIZE * 2 / 10) : logoImage.getHeight(null);
// 绘制 Logo 图像到二维码中心位置
g.drawImage(logoImage, QRCODE_SIZE / 2 - widthLogo / 2, QRCODE_SIZE / 2 - heightLogo / 2, widthLogo, heightLogo, null);
}
g.dispose();
ImageIO.write(image, format, file);
}
private static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
}
```
此工具类支持带 Logo 的二维码生成,并返回 Base64 编码后的字节数组以便于在网络上传输。
#### 3. 控制器层设计
接着,在控制器层面提供 RESTful API 来接收请求参数并调用上述工具方法完成实际业务操作:
```java
@RestController
@RequestMapping("/api/qr-code")
@Slf4j
public class QRCodeController {
@Autowired
private QRCodeUtil qrCodeUtil;
/**
* Generate a QR code with optional logo.
*/
@PostMapping(value="/generate", produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String,Object>> generate(@RequestParam String text,@RequestParam(required=false) MultipartFile logoFile){
try{
BufferedImage logo=null;
if(Objects.nonNull(logoFile)){
InputStream inputStream = logoFile.getInputStream();
logo = ImageIO.read(inputStream);
}
byte[] bytes = qrCodeUtil.createQrCode(text, logo);
String base64EncodedString = Base64.getEncoder().encodeToString(bytes);
Map<String, Object> resultMap=new HashMap<>(2);
resultMap.put("success",true);
resultMap.put("data","data:image/png;base64,"+base64EncodedString);
return ResponseEntity.ok(resultMap);
}catch(Exception e){
log.error(e.getMessage(),e);
throw new RuntimeException("Failed to generate QR Code.");
}
}
}
```
这段代码实现了 POST 请求 `/api/qr-code/generate` 接口,接受 URL 参数中的文本内容以及可选的 Logo 文件作为输入,最终响应 JSON 数据结构给客户端应用。
#### 4. 前端页面集成
最后一步是在前端页面上展示生成好的二维码图片。假设使用 Vue.js 或其他现代 JavaScript 框架开发单页应用,则可以在模板部分这样写入:
```html
<div class="meetPic">
<img v-if="model.qrQtImg" :src="'data:image/png;base64,' + model.qrQtImg"/>
<div v-else>加载中...</div>
<p>扫描上方二维码</p>
</div>
```
这里通过绑定属性的方式动态设置 `<img>` 标签的 src 属性值为服务器端返回的数据 URI 形式的字符串[^3]。
阅读全文