一、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>

六、权限管理

待续

微服务迁移记(五):WEB层搭建(3)-FreeMarker集成的更多相关文章

  1. 微服务迁移记(五):WEB层搭建(5)-集成ueditor编辑器,伪分布式图片上传

    一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...

  2. 微服务迁移记(五):WEB层搭建(4)-简单的权限管理

    一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...

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

    一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 接下来,集成SpringSecruity,实现用户 ...

  4. 微服务迁移记(五):WEB层搭建(1)

    WEB层是最终表现层,注册至注册中心,引用接口层(不需要引用实现层).公共服务层.用户登录使用SpringSecurity,Session保存在redis中,权限管理没有用SpringSecurity ...

  5. docker微服务部署之:二、搭建文章微服务项目

    docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...

  6. docker微服务部署之:三,搭建Zuul微服务项目

    docker微服务部署之:二.搭建文章微服务项目 一.新增demo_eureka模块,并编写代码 右键demo_parent->new->Module->Maven,选择Module ...

  7. docker微服务部署之:一,搭建Eureka微服务项目

    先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...

  8. 微服务实践(五):微服务的事件驱动数据管理 - DockOne.io

    原文:微服务实践(五):微服务的事件驱动数据管理 - DockOne.io [编者的话]本文是使用微服务创建应用系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第 ...

  9. .Net微服务实践(五)[服务发现]:Consul介绍和环境搭建

    目录 介绍 服务发现 健康检查.键值存储和数据中心 架构 Consul模式 环境安装 HTTP API 和Command CLI 示例API介绍 最后 在上篇.Net微服务实践(四)[网关]:Ocel ...

随机推荐

  1. 恕我直言你可能真的不会java第10篇-集合元素归约

    Stream API为我们提供了Stream.reduce用来实现集合元素的归约.reduce函数有三个参数: Identity标识:一个元素,它是归约操作的初始值,如果流为空,则为默认结果. Acc ...

  2. Linux虚拟网络:Docker网络知识之基础篇

    我们在工作中应用了docker容器化技术,服务的部署.维护和扩展都方便了很多.然而,近期在私有化部署过程中,由于不同服务器环境的复杂多变,常常遇到网络方面的问题,现象为容器服务运行正常,但宿主机.容器 ...

  3. Linux CentOS 7 防火墙/端口设置【转发】

    CentOS升级到7之后用firewall代替了iptables来设置Linux端口, 下面是具体的设置方法: []:选填 <>:必填 [<zone>]:作用域(block.d ...

  4. java语言基础(六)_String类_static_Arrays类_Math类

    String类 1. 使用 java.lang.String类代表字符串.lang包含的包不用特意引用,即默认已经引用了. API当中说:Java 程序中的所有字符串字面值(如 "abc&q ...

  5. 美国6w刀的远程工作高级工程师职位,说下在线评估, 倒在第一阶段, 认知能力测试?智商不够怎么办?!

    前几天刚被裁员了, 然后在Linkedin上面看到一个crossover的senior software engineer的职位,写的可以remote, 6w刀, 我第一次参加这个公司的这种在线测试, ...

  6. C++中vector和堆的常用使用方法&例题:数据流中的中位数

    vector常用函数: (1)a.size();//返回a中元素的个数: (2)a.push_back(5);//在a的最后一个向量后插入一个元素,其值为5 (3)a[i]; //返回a的第i个元素, ...

  7. Jmeter系列(38)- 详解性能监控工具 nmon

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 做性能测试,服务器监控是至关重要 ...

  8. Codeforces 1215D Ticket Game 题解

    Codeforces 1215D Ticket Game 原题 题目 Monocarp and Bicarp live in Berland, where every bus ticket consi ...

  9. 你是如何理解Vue的响应式系统的

    1.响应式系统简述: 任何一个 Vue Component 都有一个与之对应的 Watcher 实例. Vue 的 data 上的属性会被添加 getter 和 setter 属性. 当 Vue Co ...

  10. 数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?

    https://zhuanlan.zhihu.com/p/109964336 ​今年是闰年,有星友问我,在Power BI中,2月29日的上年同期是怎么计算的? 这是个好问题,正好梳理一下,Power ...