全网最通俗易懂的【短链接二维码】实战-深蓝源码网
导读 昨天的文章推送中有一篇题为全网最通俗易懂的【短链接】入门,让我觉得颇为有趣好玩,这不正好理论知识学完了,实操代码撸起来。如果有不了解的同学可以看看入门那篇的介绍,我这里直接从实战说起,代码中有超过的中文注释,让你更容易阅读理解。话不多说,上代码!效果展示项……
昨天的文章推送中有一篇题为全网最通俗易懂的【短链接】入门, 让我觉得颇为有趣好玩,这不正好理论知识学完了,实操代码撸起来。如果有不了解的同学可以看看入门那篇的介绍,我这里直接从实战说起,代码中有超过的中文注释,让你更容易阅读理解。话不多说,上代码!
效果展示


项目搭建与相关依赖
新建一个普通的maven java 工程,如图所示

自己给项目取组名(group)和模块名(artifact)


至此项目搭建完成,此时我们为项目引入一些基本的jar包
<properties> <spring.version>5.1.8.RELEASE</spring.version> <spring.boot.version>2.1.6.RELEASE</spring.boot.version> </properties> <dependencies> <!-- spring boot依赖,表示这是一个springboot web程序. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency> <!-- apache 的工具包. --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> </dependencies>
如何实现短链接生成功能
集成H2内存数据库
- 添加必要的jar包 <!-- 引入H2的相关包. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <!--辅助jar包,用于查看内存数据库--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>${spring.boot.version}</version> <optional>true</optional> </dependency>
- 在application.properties中添加必要的配置 #h2配置 spring.jpa.show-sql = true spring.jpa.hibernate.ddl-auto = update ##数据库连接设置 spring.datasource.url = jdbc:h2:mem:dbtest spring.datasource.username = root spring.datasource.password = root spring.datasource.driverClassName =org.h2.Driver ##数据初始化设置 #进行该配置后,每次启动程序,程序都会运行resources/db/schema.sql文件,对数据库的结构进行操作。 spring.datasource.schema=classpath:db/schema.sql #进行该配置后,每次启动程序,程序都会运行resources/db/data.sql文件,对数据库的数据操作。 #spring.datasource.data=classpath:db/data.sql ##h2 web console设置 spring.datasource.platform=h2 # 进行该配置后,h2 web consloe 就可以在远程访问了。否则只能在本机访问。 spring.h2.console.settings.web-allow-others=true #进行该配置,你就可以通过YOUR_URL/h2访问h2 web consloe。YOUR_URL是你程序的访问URl。 spring.h2.console.path=/h2 #进行该配置,程序开启时就会启动h2 web consloe。当然这是默认的,如果你不想在启动程序时启动h2 web consloe,那么就设置为false。 spring.h2.console.enabled=true
- 添加数据库结构脚本
在
resource目录下新建文件夹db,创建文件schema.sql,内容如下 create table if not exists short_link ( id int not null primary key, url varchar(1000), create_time DATE ); - 测试H2数据库
启动springboot应用程序,在浏览器中输入
http://localhost:2088/h2,可以打开h2数据库管理器登录界面,能够进入如下页面说明H2集成成功!
输入配置的数据库信息,点击登录,即可打开操作界面:
使用spring data jpa
创建实体与数据库表的映射对象
@Entity @Data @NoArgsConstructor @ToString public class ShortLink { @Id @GeneratedValue private long id; private String url; private Date createTime; public ShortLink(String url, Date date){ this.url = url; this.createTime =date; } }
创建DAO数据库交互层,CrudRepository实现了对 DB 基本的增删改查方法
/** * CrudRepository 实现了对 ShortLink 基本的增删改查方法 * @author jiangpeng * @date 2019/11/2715:29 */ public interface ShortLinkRepository extends CrudRepository<ShortLink, Long> { }
短链接的ID转换生成器
/** * 短链接生成 * 10进制、62进制互转 * @author jiangpeng */ @Slf4j public class ConversionUtils { /** * 初始化 62 进制数据,索引位置代表字符的数值,比如 A代表10,z代表61等 */ private static String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; private static int scale = 62; /** * 将数字转为62进制 * * @param num Long 型数字 * @param length 转换后的字符串长度,不足则左侧补0 * @return 62进制字符串 */ public static String encode(long num, int length) { StringBuilder sb = new StringBuilder(); int remainder; // id混淆算法 long snum = num & 0xff000000; snum += (num & 0x0000ff00) << 8; snum += (num & 0x00ff0000) >> 8; snum += (num & 0x0000000f) << 4; snum += (num & 0x000000f0) >> 4; while (snum > scale - 1) { /* 对 scale 进行求余,然后将余数追加至 sb 中,由于是从末位开始追加的,因此最后需要反转(reverse)字符串 */ remainder = Long.valueOf(snum % scale).intValue(); sb.append(chars.charAt(remainder)); snum = snum / scale; } sb.append(chars.charAt(Long.valueOf(snum).intValue())); String value = sb.reverse().toString(); log.info("encode id: {}", snum); return StringUtils.leftPad(value, length, '0'); } /** * 62进制字符串转为数字 * * @param str 编码后的62进制字符串 * @return 解码后的 10 进制字符串 */ public static long decode(String str) { /* 将 0 开头的字符串进行替换 */ str = str.replace("^0*", ""); long num = 0; int index; for (int i = 0; i < str.length(); i++) { /* 查找字符的索引位置 */ index = chars.indexOf(str.charAt(i)); /* 索引位置代表字符的数值 */ num += (long) (index * (Math.pow(scale, str.length() - i - 1))); } // id混淆算法 long snum = num & 0xff000000; snum += (num & 0x00ff0000) >> 8; snum += (num & 0x0000ff00) << 8; snum += (num & 0x000000f0) >> 4; snum += (num & 0x0000000f) << 4; return snum; } /** * @param args */ public static void main(String[] args) { System.out.println("62进制:" + encode(1, 5)); System.out.println("10进制:" + decode("0000G")); } }
可以执行main方法查看运行结果,比对是否进制转后还是原来的值
集成 freeMarker 静态页面
引入freeMarker的依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> <version>${spring.boot.version}</version> </dependency>
freeMarker默认读取模板文件路径为resource/templates目录下,所以在这个目录下创建页面文件 short_link.ftl
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"/> <title></title> </head> <body> <h2>短链接转换</h2> <form action="shortLink" method="post"> 要转换的url:<textarea rows="1" style="width: 432px; height: 43px;" name="url">${url?default('')}</textarea> <br/><br/> <input type="submit" value="提交"/> </form> <#if shortUrl?? && shortUrl != ""> <a href="${shortUrl}" target="_blank">${shortUrl}</a> </#if> </body> </html> 复制代码
创建请求Controller
/** * 生成短链接请求类 * * @author jiangpeng * @date 2019/11/2715:19 */ @Controller @RequestMapping("shortLink") public class ShortLinkController { @Autowired private ShortLinkRepository shortLinkRepository; @GetMapping public String shortLink() { return "short_link";
猜你喜欢
