全网最通俗易懂的【短链接二维码】实战-深蓝源码网


时间: 2020-09-03 00:08:26 人气: 2272 评论: 0

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

效果展示

项目搭建与相关依赖

新建一个普通的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内存数据库

  1. 添加必要的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>
  2. 在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
  3. 添加数据库结构脚本 在resource目录下新建文件夹db,创建文件schema.sql,内容如下 create table if not exists short_link ( id int not null primary key, url varchar(1000), create_time DATE );
  4. 测试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";
    
						 技术沙龙 教程文章 热点综合					

评论