一、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. JavaScript基础CallBack函数(015)

    前面提到,函数对象是可以作为参数传递给另一函数的,这时,作为参数的函数如果在内部被执行,那么它就是个回调函数(Callback): function writeCode(callback) { // ...

  2. 抓包工具-Charles基础使用

    正在整理,等待编辑过后更新....... 竟然字少不能发不出去 那..... 现..... 在..... 够..... 了..... 吗?????? 不..... 够..... 我..... 在... ...

  3. 基于小程序请求接口 wx.request 封装的类 axios 请求

    基于小程序请求接口 wx.request 封装的类 axios 请求 Introduction wx.request 的配置.axios 的调用方式 源码戳我 feature 支持 wx.reques ...

  4. Python-发送邮件验证码

    前言 ​ 关于 Python 这个栏目,咕了几个月了,今天讲讲如何发送验证码并验证. ​ 因为部分原因,写这篇文章的时候心情是不太好的,播放首歌吧. 代码 导入 导入yagmail,random和ti ...

  5. Oracle归档日志所在目录时间不对&&Oracle集群日志时间显示错误

    Oracle归档日志所在目录时间不对&&Oracle集群日志时间显示错误 前言 这个问题在18年的时候遇到了,基本不注意并且集群或者数据库运行正常是很难注意到的. 忘记当时怎么发现的了 ...

  6. 整理一下CSS最容易躺枪的二十规则,大家能躺中几条?

    整理一下CSS最容易躺枪的二十规则,大家能躺中几条? 转载:API中文网 一.float:left/right 或者 position: absolute 后还写上 display:block? 二. ...

  7. POJ2376贪心

    题意:数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1,t](1<=t<=1,000,000).覆盖整点,即[1,2] ...

  8. 通过注入DLL修改API代码实现钩取(一)

    通过注入DLL修改API代码实现钩取(一) Ox00 大致思路 通过CreateRemoteThread函数开辟新线程,并将DLL注入进去 通过GetProcessAddress函数找到需钩取的API ...

  9. 组件toast(类似于element-ui的message组件)的实现

    实现的toast组件可以通过this.$toast()调用 需要的知识: vue.extend(); new Vue().$mount(); //如果mount内没有要挂载的元素vue只会渲染元素而不 ...

  10. HDFS客户端环境准备

    一.下载Hadoop jar包至非中文路径 下载链接:https://hadoop.apache.org/releases.html 解压至非中文路径 二.配置Hadoop环境变量 配置HADOOP_ ...