一、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. 常用API - 字符串

    String类 java.lang.String类代表字符串 Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 特点 字符串的内容不可变!! 因为 St ...

  2. 苹果手机history.back()返回不刷新问题

    苹果手机,a页面打开b页面,b页面使用history.back(-1)返回a页面时,a页面不刷新,可在a页面添加以下代码: var isPageHide = false; window.addEven ...

  3. 【UWP】利用EF Core操作SQLite

    在以往开发中,一定要在vs中安装SQLite for Universal App Platform以及一款wrapper,如SQLitePCL.现在有了EntitfyFramewrok Core,我们 ...

  4. python学习笔记之函数(方法)(四)

    一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在C中叫function,在Java里面叫做method. 定义: ...

  5. 源码剖析@ApiImplicitParam对@RequestParam的required属性的侵入性

    问题起源 使用SpringCloud构建项目时,使用Swagger生成相应的接口文档是推荐的选项,Swagger能够提供页面访问,直接在网页上调试后端系统的接口, 非常方便.最近却遇到了一个有点困惑的 ...

  6. HotSpot的类模型(4)

    我们继续接着上一篇 HotSpot的类模型(3)分析,这次主要分析表示java数组的C++类. 4.ArrayKlass类 ArrayKlass继承自Klass,是所有数组类的抽象基类,类及重要属性的 ...

  7. Pop!_OS安装与配置(二):基础配置

    Pop!_OS相关使用配置 #0x0 书接上回 #0x1 换源 #0x10 nopasswd sudo #0x11 换国内源 0x2 安装应用 #0x0 书接上回 首先请看上一章末尾, Pop!_OS ...

  8. MYSQL 之 JDBC(二): 数据库连接(二)通过DriverManager获取数据库连接

    通过DriverManager获取数据库连接 修改一下配置文件 driver=com.mysql.cj.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/ ...

  9. Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇

    Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...

  10. 通过代理模块拦截网页应用程序流量 - Intercept Web Application Traffic Using Proxy Modules

    测试网站: http://testphp.vulnweb.com/login.php 浏览器代理设置为:127.0.0.1:8080 查看拦截流量: 方式1:通Proxy - Intercept 方式 ...