在Web应用开发中,生成二维码和商品短链接是两类常见的实用功能。二维码便于移动端扫码交互,而短链接则使冗长的URL变得简洁易分享。本文将基于SpringBoot框架,分别演示这两种功能的实现方案。
使用ZXing库生成二维码图片
我们选用Google开源的ZXing库来实现二维码的生成。首先,需要在项目中引入相关Maven依赖。
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.2.1</version>
</dependency>
接下来,我们可以编写一个简单的Controller方法。该方法接收请求后,会将生成的二维码图片直接写入HTTP响应流中。
@GetMapping("/generateQrCodeImage")
public void generateQrCodeImage(HttpServletResponse response) throws Exception {
// 定义二维码图片参数
int width = 200;
int height = 200;
String format = "png";
String content = "https://yunpan.plus"; // 需要编码的内容
ServletOutputStream out = response.getOutputStream();
// 设置编码参数
Map<EncodeHintType,Object> config = new HashMap<>();
config.put(EncodeHintType.CHARACTER_SET,"UTF-8"); // 字符编码
config.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 容错级别
config.put(EncodeHintType.MARGIN, 0); // 边距
// 生成BitMatrix并写入输出流
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, config);
MatrixToImageWriter.writeToStream(bitMatrix, format, out);
logger.info("二维码生成完毕,已输出到响应流。");
}
上图展示了上述代码生成的二维码效果图(示例)。
商品短链接生成原理与实现
短链接服务,如常见的电商商品分享链接,其核心原理是将一个较长的唯一标识(如数据库主键ID)转换为更短的字符串。一个典型的短链接由两部分组成:
- 固定前缀:如
http://your-domain.com/s/
- 短码字符串:如
Uc64ba
其工作机制是:当用户访问短链接时,后端服务根据短码解析出原始的商品ID或完整URL,然后通过HTTP重定向跳转到目标页面。
核心代码实现
一种常见且高效的实现方式是将数字ID转换为62进制(由0-9, a-z, A-Z共62个字符组成)。
1. 定义62进制转换工具类
这个类负责将十进制的长整型数字转换为62进制字符串。
public class Base62Converter {
private static final String CHAR_SET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String toBase62(long number) {
if (number == 0) {
return "0";
}
StringBuilder sb = new StringBuilder();
while (number > 0) {
int remainder = (int) (number % 62);
sb.append(CHAR_SET.charAt(remainder));
number /= 62;
}
return sb.reverse().toString();
}
}
上图可视化了62进制字符集与数字的映射关系。
2. 短链接生成器
基于上面的转换工具,我们可以快速生成短码。
public class ShortUrlGenerator {
public static String generateShortUrl(long productId) {
// 直接将商品ID转换为62进制作为短码
return Base62Converter.toBase62(productId);
}
}
3. 使用示例
public class Main {
public static void main(String[] args) {
long productId = 123456789L; // 假设的商品ID,通常来自数据库
String shortCode = ShortUrlGenerator.generateShortUrl(productId);
System.out.println("商品ID " + productId + " 对应的短码为: " + shortCode);
// 输出示例:Short URL for product ID 123456789 is: 8M0kX
}
}
短链接数据表设计
为了将短码与原始信息关联并持久化,我们需要设计一张数据库表。以下是一个简单的MySQL表结构设计,你可以根据实际业务需求进行扩展。
表名: t_short_url
| 字段名 |
类型 |
说明 |
id |
BIGINT |
主键ID |
sku |
VARCHAR |
商品SKU编码 |
name |
VARCHAR |
商品名称 |
short_code |
VARCHAR |
短码字符串(如 8M0kX) |
full_url |
VARCHAR |
完整的原始商品链接 |
remark |
VARCHAR |
备注信息 |
在实际的SpringBoot项目中,你可以结合MyBatis或Spring Data JPA等持久层框架来操作此表,实现短链的生成、存储和查询跳转逻辑。当处理涉及复杂业务逻辑和高并发的场景时,一个健壮的后端 & 架构设计至关重要。同时,为了提供友好的用户界面,前端也需要与之配合,这离不开对前端框架/工程化技术的运用。