微服务迁移记(五):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}记录 第${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集成的更多相关文章
- 微服务迁移记(五):WEB层搭建(5)-集成ueditor编辑器,伪分布式图片上传
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- 微服务迁移记(五):WEB层搭建(4)-简单的权限管理
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- 微服务迁移记(五):WEB层搭建(2)-SpringSecurity集成
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 接下来,集成SpringSecruity,实现用户 ...
- 微服务迁移记(五):WEB层搭建(1)
WEB层是最终表现层,注册至注册中心,引用接口层(不需要引用实现层).公共服务层.用户登录使用SpringSecurity,Session保存在redis中,权限管理没有用SpringSecurity ...
- docker微服务部署之:二、搭建文章微服务项目
docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...
- docker微服务部署之:三,搭建Zuul微服务项目
docker微服务部署之:二.搭建文章微服务项目 一.新增demo_eureka模块,并编写代码 右键demo_parent->new->Module->Maven,选择Module ...
- docker微服务部署之:一,搭建Eureka微服务项目
先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...
- 微服务实践(五):微服务的事件驱动数据管理 - DockOne.io
原文:微服务实践(五):微服务的事件驱动数据管理 - DockOne.io [编者的话]本文是使用微服务创建应用系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第 ...
- .Net微服务实践(五)[服务发现]:Consul介绍和环境搭建
目录 介绍 服务发现 健康检查.键值存储和数据中心 架构 Consul模式 环境安装 HTTP API 和Command CLI 示例API介绍 最后 在上篇.Net微服务实践(四)[网关]:Ocel ...
随机推荐
- Maven中央仓库正式成为Oracle官方JDBC驱动程序组件分发中心
1. 前言 相信参与使用Oracle数据库进行项目开发.运维的同学常常被Oracle JDBC驱动的Maven依赖折磨.现在这一情况在今年二月份得到了改变,甲骨文这个老顽固终于开窍了. 一位甲骨文的工 ...
- c语言学习笔记第三章———数据和C
B站有视频演示 本章将会讲解c语言的数据定义和使用,您将会了解int.float.double.char的含义,了解命名的规则,对c语言会有更加深刻的认识. 变量命名: 我们先讲上次视频没讲的变量命名 ...
- CSS3的过渡效果,使用transition实现鼠标移入/移出效果
在css中使用伪类虽然实现了样式的改变,但由于没有过渡效果会显得很生硬.以前如果要实现过渡,就需要借助第三方的js框架来实现.现在只需要使用CSS3的过渡(transition)功能,就可以从一组样式 ...
- springboot启动只显示图标不报错
问题如下: 问题原因是:logback.xml文件中日志打印级别设置的有问题.设置不打印
- HDU 3686 Traffic Real Time Query System (图论)
HDU 3686 Traffic Real Time Query System 题目大意 给一个N个点M条边的无向图,然后有Q个询问X,Y,问第X边到第Y边必需要经过的点有多少个. solution ...
- 【第五空间智能安全大赛】hate_php WriteUp
环境:https://www.ctfhub.com/#/challenge 打开题目可以看到源码: 阅读源码发现过滤掉了f l a g . p h / ; " ' ` | [ ] _ =这些 ...
- 复杂链表的复制(剑指offer-25)
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点.(注意,输出结果中请不要返回 ...
- django开发自动化测试平台简介
Django的优点 1:功能完善.要素齐全:自带大量常用工具和框架(比如分页,auth,权限管理), 适合快速开发企业级网站. 2:完善的文档:经过十多年的发展和完善,Django有广泛的实践案例和完 ...
- Mariadb之主从复制的读写分离
首先我们来回顾下代理的概念,所谓代理就是指的是一端面向客户端,另外一端面向服务端,代理客户端访问服务端,我们把这种代理叫正向代理:代理服务端响应客户端我们叫做反向代理,这个我们在之前nginx系列博客 ...
- redis的集群化方案
关于 目前有三种 (1)Twitter开发的twemproxy (2)豌豆荚开发的codis (3)redis官方的redis-cluster Twemproxy 架构简单 就是用proxy对后端re ...