微服务迁移记(五):WEB层搭建(3)-FreeMarker集成

一、redis搭建

二、WEB层主要依赖包

三、FeignClient通用接口

以上三项,参考《微服务迁移记(五):WEB层搭建(1)

四、SpringSecurity集成

参考:《微服务迁移记(五):WEB层搭建(2)-SpringSecurity集成

五、FreeMarker集成

1. 必要导包

<!--整合freemarker-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

2. 配置文件

    freemarker:
    allow-request-override: true
    cache: false
    check-template-location: true
    charset: UTF-8
    content-type: text/html; charset=utf-8
    expose-request-attributes: false
    expose-session-attributes: false
    expose-spring-macro-helpers: false
    suffix: .ftl  #模板文件的扩展名是.ftl(注意不是html)
    template-loader-path: classpath:/templates  #将模板文件放在resources/templates目录下

3. 后台角色分页列表示例

分页样式集成bootstrap样式。bootstrap前台框架,参考《https://v3.bootcss.com/》。最终样式如下:

1) 自定义分页控制类

这是一个实体类,我在构造函数中做了总页数计算,所以实例化时需要构造函数传参,Dao层可以直接返回这个实体类供前台调用。

package com.zyproject.common;

import lombok.Data;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @program: zyproject
 * @description: 分页通用实体类
 * @author: zhouyu(zhouyu629 # qq.com)
 * @create: 2020-02-16
 **/
@Data
public class MyPager<T> {
    private int page; //当前页码,从1开始
    private int pagesize; //分页大小
    private int totalpages; //总页数
    private int totalrecords; //总记录数
    private List<T> list;
    //构造函数中计算总页数
    public MyPager(int page,int pagesize,int totalrecords,List<T> list){
        this.page = page;
        this.pagesize = pagesize;
        this.totalrecords = totalrecords;
        this.list = list;
        //计算总页数
        this.totalpages = totalrecords/pagesize;
        if(totalrecords%pagesize!=0){
            this.totalpages = this.totalpages + 1;
        };
    }
}

2) Dao层获取数据源

通过Feign远程调用,通过Controller塞到前台页面调用,参考前面章节,略。

 /**
     * 分页获取角色列表
     * @param page:当前页码,从1开始
     * @param pagesize:分页大小
     * @return
     */
    public MyPager getRoleByPage(int page,int pagesize){
        //totalrecords
        String countSql = "SELECT count(1) FROM tb_role WHERE del_flag=0";
        int totalRecords = jdbcTemplate.queryForObject(countSql,Integer.class);
        String sql = "SELECT * FROM tb_role WHERE del_flag=0 ORDER BY taxis ASC limit ?,?";
        List<RoleEntity> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper(RoleEntity.class),(page-1)*pagesize,pagesize);
        return new MyPager(page,pagesize,totalRecords,list);
    }

3)freemarker自定义分页宏

这个分页计算,写的不好,应该先算出startpage,endpage,hasprepage,hasmorepage,showfirstpage,showlastpage,然后一段代码展示即可,可以减少代码冗余。有时间再优化下。

<#macro fpage page pagesize totalpages totalrecords url>
    <li><span>共条${totalrecords}记录&nbsp;&nbsp;第${page}页/共${totalpages}页</span></li>
    <#--如果当前不是第一页,则展示前5页-->
    <#if page gt 1>
        <li><span><a href="${url}&page=1">首页</a></span></li>
        <#--至于是前x页?-->
        <#if page gt 5>
            <#assign prepage = page-5 >
        <#else>
            <#assign prepage=1>
        </#if>
        <#--是否显示...-->
        <#if prepage gt 1>
            <li><span><a href="${url}&page=${page-6}">...</a></span></li>
        </#if>
        <#list prepage ..page-1 as p>
            <li><span><a href="${url}&page=${p}">${p}</a></span></li>
        </#list>
        <#--当前页-->
        <li class="active"><span><a href="${url}&page=${page}">${page}</a></span></li>
        <#--后10-page页-->
        <#if page lt totalpages>
            <#if totalpages lte 10>
                <#list page+1..totalpages as p>
                    <li><span><a href="${url}&page=${p}">${p}</a></span></li>
                </#list>
            <#else>
                <#--如果后面的页数超过5页-->
                <#if totalpages-page gt 5>
                    <#list page+1..page+5 as p>
                        <li><span><a href="${url}&page=${p}">${p}</a></span></li>
                    </#list>
                    <li><span><a href="${url}&page=${page+6}">...</a></span></li>
                <#else>
                    <#list page+1..totalpages as p>
                        <li><span><a href="${url}&page=${p}">${p}</a></span></li>
                    </#list>
                </#if>
            </#if>
            <#--显示尾页-->
            <li><span><a href="${url}&page=${totalpages}">尾页</a></span></li>
        </#if>
    <#else>
        <#--如果总页数大于10页,只显示前十页,后面用...代替-->
        <#if totalpages gt 10>
            <#list 1..10 as p>
                <li <#if p==1>class="active"</#if>><span><a href="${url}&page=${p}">${p}</a></span></li>
            </#list>
            <li><span><a href="${url}&page=${page+10}">...</a></span></li>
        <#else>
            <#list 1..totalpages as p>
                <li <#if p==1>class="active"</#if>><span><a href="${url}&page=${p}">${p}</a></span></li>
            </#list>
        </#if>
        <#--是否显示尾页-->
        <#if totalpages gt 1>
            <li><span><a href="${url}&page=${totalpages}">尾页</a></span></li>
        </#if>
    </#if>
</#macro>

 4) HTML 页面调用

pager:是从controller传过来的MyPager对象

<ul class="row pagination">
       <#import "../public/page.ftl" as fpage />
                <@fpage.fpage page=pager.page pagesize=pager.pagesize totalpages=pager.totalpages totalrecords=pager.totalrecords url="/manage/role/index?tree_id=${tree.tree_id?c}" />
</ul>

六、权限管理

待续

原文地址:https://www.cnblogs.com/zhouyu629/p/12366775.html