基于Thymeleaf、bootstrap、layUI 混合前端应用

news2024/11/15 20:07:06

目录

1、项目结构

2、pom依赖导入

3、页面加载机制

4、前端案例

4.1、加载公共页面及静态文件

4.2、Bootstrap col-md栅栏

4.3、BootStrap Table表格加载

4.4、Layui select下拉项加载

4.5、Layui radio 单选项加载

4.6、Ajax Post请求


以下代码基于Spring boot + Thymeleaf框架,

前端采用BootstrapV3.3.7 LayUIV2.9.13 版本

1、项目结构

html文件存放 resources/templates 目录

静态资源存放 resources/static 目录

2、pom依赖导入

<shiro.version>1.13.0</shiro.version>
        <spring-boot.version>2.5.13</spring-boot.version>
        <thymeleaf.extras.shiro.version>2.1.0</thymeleaf.extras.shiro.version>

 

<!-- 对外服务必须引入 boot-starter、web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- SpringBoot Web容器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot 拦截器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
 <!--模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

<!-- Shiro核心框架 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>${shiro.version}</version>
        </dependency>

        <!-- Shiro使用Spring框架 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>${shiro.version}</version>
        </dependency>

        <!-- Shiro使用EhCache缓存框架 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-ehcache</artifactId>
            <version>${shiro.version}</version>
        </dependency>

  <!-- thymeleaf模板引擎和shiro框架的整合 -->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>${thymeleaf.extras.shiro.version}</version>
        </dependency>

3、页面加载机制

由于使用Thymeleaf框架,需要将html页面代码,经过服务端进行模板渲染

页面访问需要与后端交互。

访问需要通过HTTP.GET请求,后端返回html页面相对地址【字符串类型】

针对如下代码示例中,请求的地址最终为 /test/add

返回页面路径为 resources/templates/test/add.html

@Controller
@RequestMapping("/test")
public class TestController {

   private String prefix = "test";

   @GetMapping("/add")
   public String add() {
        return prefix + "/add";
   }


}

4、前端案例

4.1、加载公共页面及静态文件

1)th:include 表示加载 /template/include.html 页面内容,并替换内容,不是以iframe内容加载。

::header 表示加载内部中的指定子模块

2)th:href 表示加载指定路径下文件,避免多层级下的文件,减少 ../ 方式查找的复杂度

<head>
    <th:block th:include="include :: header('我的标题')" />
    <link type="text/css" rel="stylesheet" th:href="@{/ajax/libs/layui/css/layui.css}"/>
    <link type="text/css" rel="stylesheet" th:href="@{/ajax/libs/ckplayer/css/ckplayer.css}"/>
</head>

4.2、Bootstrap col-md栅栏

参考  全局 CSS 样式 · Bootstrap v3 中文文档 | Bootstrap 中文网
<div class="layui-container" style="width: 98%;padding-top: 20px">
    <div class="layui-row">
        <div class="layui-col-md2">
             ....
        </div>
        <div class="layui-col-md10">
             ....
        </div>
    </div>
</div>

总单位12栏 使用单一的一组 .col-md-* 栅格类,就可以创建一个基本的栅格系统

4.3、Bootstrap Table表格加载

依赖 ry-ui.js 文件【若依框架】
必须使用div 包裹 table、 且定义class=“select-table” 
以下代码中 $.table 为ry-ui.js 框架对bootstrap的封装

<div class="select-table" >
    <table id="anno-table"></table>
</div>
function initAnnoTable(){
        var options = {
            id: "anno-table",
            elem: '#anno-table',
            // 禁止右上方按钮栏
            showSearch: false,
            showPageGo: false,
            showRefresh: false,
            showColumns: false,
            showToggle: false,
            // 禁止分页
            pagination: false,
            columns: [
                {
                    title: '序号',
                    width: 100,
                    formatter: function (text, record, index) {
                        return (index + 1);
                    }
                },
                {field: 'startTime',title: '开始时间',},
                {field: 'endTime',title: '结束时间',},
                {field: 'emoDesc',title: '标签结果',},
                {align: 'center',title: '操作',
                    formatter: function(value, row, index) {
                        var actions = [];
                        actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="editAnno(\'' + index + '\')"><i class="fa fa-edit"></i>编辑</a> ');
                        return actions.join('');
                    }},
            ],
            data: [],
        };
        $.table.init(options);
    }

表格数据动态刷新

$.table.refreshOptions({
    id: 'anno-table',
    data: annoList
})

4.4、Layui select下拉项加载

<div class="layui-form layui-row">
                    <select lay-filter="task-select-filter" id="taskSelect">

                    </select>
                </div>
var form = layui.form;

// select 事件
    form.on('select(task-select-filter)', function(data){
        var value = data.value; // 获得被选中的值
        selectTask = {
            taskId: value,
            taskName: this.innerHTML
        }
        
    });

// 动态加载下拉选项
 $.get(prefix + '/list', function(result) {
            var list = result.data;

            let _html = '';
            _html += '<option  value="">--请选择--</option>';
            for(var item of list){
                _html += '<option  value="'+item.taskId+'" >' + item.taskName + '</option>';
            }
            console.log(_html)
            $('#taskSelect').append(_html)
            form.render()
        });

4.5、Layui radio 单选项加载

<div class="layui-form" >
	<div class="layui-form-item">
		<input type="radio" name="emotion" value="anger"   lay-filter="emotion-radio-filter" title="愤怒">
		<input type="radio" name="emotion" value="disgust"  lay-filter="emotion-radio-filter" title="恐惧">
		<input type="radio" name="emotion" value="hate"  lay-filter="emotion-radio-filter" title="害怕">
		<input type="radio" name="emotion" value="happy"  lay-filter="emotion-radio-filter" title="高兴">
		<input type="radio" name="emotion" value="neutral"  lay-filter="emotion-radio-filter" title="平静" checked>
		<input type="radio" name="emotion" value="sad"  lay-filter="emotion-radio-filter" title="悲伤">
		<input type="radio" name="emotion" value="surprised"  lay-filter="emotion-radio-filter" title="惊讶">
		<button class="layui-btn" lay-submit lay-filter="emotion-radio-submit" >添加</button>
	</div>
</div>

选中事件

// radio 事件
    form.on('radio(emotion-radio-filter)', function(data){
        console.log(data.value);
    });

动态切换选中

var myValue = 'sad';
if ($(item).val() == myValue) {
	//更改选中value值 
	$(item).prop('checked', true);
	//重新渲染
	layui.use('form', function () {
		var form = layui.form;
		form.render();
	});
}

4.6、Layui 日期选择加载

需要layui 2.8+以上版本

<div class="layui-inline" id="rangeDate">
	<div class="layui-input-inline">
		<input type="text" id="startLabelTime" name="startLabelTime" class="layui-input"  placeholder="开始日期">
	</div>
	<div class="layui-input-inline">
		<input type="text" id="endLabelTime" name="endLabelTime" class="layui-input"   placeholder="结束日期">
	</div>
</div>

通过 id 属性关联 

// 暂存 时间范围
dateRange = {}

layui.use(function() {
		var laydate = layui.laydate;

		// 日期范围 - 左右面板联动选择模式
		laydate.render({
			elem: '#rangeDate',
			range: ['#startLabelTime', '#endLabelTime'],
			rangeLinked: true,
			done: function(value, date, endDate){
				var start = value.split(' - ')[0];
				var end = value.split(' - ')[1];
				dateRange = {
					startTime: start,
					endTime:  end
				}
			}
		});
	})

 通过在<form>表单中,将子元素添加name 属性,在表单提交时,自动参数携带 

4.14、Jquery 设置 div 宽高

使用jQuery设置div的宽度和高度有以下几种实现方法:

1、使用css()方法:

允许设置百分比值,并且要求属性名 width、height,必须使用引号

$("#myDiv").css({

"width": "100%",

"height": "100px"

});

2、使用width()和height()方法:

这里只能设置整数值,用于具体的px

$("#myDiv").width(200).height(100);

3、使用attr()方法:

$("#myDiv").attr({

"width": "200px",

"height": "100px"

});

4、使用addClass()方法:

$("#myDiv").addClass("custom-class");

然后在CSS文件中定义.custom-class的样式:

.custom-class {

width: 200px;

height: 100px;

}

在layui、bootstrap中使用  栅栏预先定义class样式分割区域

$('#rightDiv').removeClass('layui-col-md10')
$('#rightDiv').addClass('layui-col-md12')

5、使用animate()方法(动画效果):

$("#myDiv").animate({

"width": "200px",

"height": "100px"

}, 500); // 可以设置动画效果的持续时间,单位为毫秒

4.15、Ajax Post请求

使用contentType + JSON.stringify 将传输 json格式的请求
如果不声明使用,则传入 form 表单数据
$.ajax({
  url: 'your-api-url',
  type: 'POST',
  dataType: 'json',
  contentType: 'application/json',
  data: JSON.stringify({ key1: 'value1', key2: 'value2' }),
  success: function(response) {
    console.log(response);
  },
  error: function(err) {
    console.error(err);
  }
});

参考文章:

前端手册 | RuoYi

Layui 文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2080243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32外部中断事件控制器-EXTI

EXTI简介&#xff1a; EXTI 是 External Interrupt 的缩写&#xff0c;表示外部中断事件控制器。EXTI 可以监测指定 GPIO 口的电平信号变化&#xff0c;并在检测到指定条件时&#xff0c;向内核的中断控制器 NVIC 发出中断申请。NVIC 在裁决后&#xff0c;如果满足条件&#xf…

峟思振弦式钢筋计在恶劣环境下的工作性能分析

在土木工程领域&#xff0c;尤其是建筑、桥梁、隧道等复杂结构的监测中&#xff0c;振弦式钢筋计作为一种高精度、高稳定性的测量仪器&#xff0c;扮演着至关重要的角色。尤其在恶劣环境下&#xff0c;其卓越的工作性能更是备受关注。本文将从耐久性、实时监控、安全性评估及适…

Vue 3 + GSAP:解锁高性能动画的神奇组合

在一个偶然的场景使用了 GSAP&#xff08;GreenSock Animation Platform&#xff09;&#xff0c;感觉挺好玩的&#xff0c;在此浅浅记录一下。 GSAP 是一个功能强大的 JS 动画库&#xff0c;常用于创建高性能、流畅的动画。它不仅支持基本的动画&#xff0c;还提供了时间轴控…

SpringBoot日常:集成代码覆盖率测试工具JaCoCo

文章目录 简介开始集成1、pom添加依赖2、pom添加插件3、业务代码4、单元测试代码5、开始测试6、查看结果 如何排除不需要的路径&#xff1f;设置覆盖率目标并验证JACOCO的不足JACOCO改进版super-Jacoco代码覆盖率的知识扩展 简介 JaCoCo&#xff08;Java Code Coverage&#x…

一把手告诉你联盟营销白帽电商广告借力NewsBreak头条优势

揭秘美国NewsBreak头条新闻推广联盟营销白帽电商广告优势 在当今数字化浪潮中&#xff0c;电商行业竞争日益激烈&#xff0c;各大平台纷纷寻求创新的推广方式以吸引更多商家入驻并提升用户购物体验。NewsBreak&#xff0c;作为美国一款领先的新闻聚合平台&#xff0c;凭借其庞…

静态代理与动态代理的区别与选择

在当今软件开发领域&#xff0c;代理模式作为一种重要的设计模式&#xff0c;广泛应用于增强现有对象功能、控制访问权限以及实现远程调用等场景。本文旨在深入探讨静态代理与动态代理之间的核心区别&#xff0c;帮助开发者理解两者在实现机制、灵活性、性能表现及适用场景上的…

HTML静态网页成品作业(HTML+CSS)——西点蛋糕介绍(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

MyBatis缓存机制 ▎特殊符号处理

前言: MyBatis 的缓存机制通过一级缓存和二级缓存显著提升系统性能。一级缓存在 SQL 会话中减少重复查询&#xff0c;二级缓存跨会话共享查询结果&#xff0c;但引入了数据一致性和内存管理的挑战。开发者需平衡性能与数据准确性。此外&#xff0c;MyBatis 还提供了多种方法来…

力扣经典题目之->二叉树的前序遍历

一&#xff1a;题目 解释&#xff1a; 1&#xff1a; 题目的要求就是我们return 一个数组&#xff0c;该数组里面的元素及其顺序就是 前序遍历二叉树 的元素及其顺序 比如&#xff1a;示例1的树&#xff0c;前序遍历的顺序应该是1 2 3&#xff0c;那么return 的数组里面的元素…

Java面试题--JVM大厂篇之JVM大厂面试题及答案解析(8)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而我的博…

Linux开发环境搭建,虚拟机安装

开发环境搭建 一、VMware Workstation Pro软件简介 VMware Workstation Pro 是 VMware &#xff08;威睿公司&#xff09;发布的一代虚拟机软件&#xff0c;中文名称一般称 为 "VMware 工作站 ". 它的主要功能是可以给用户在单一的桌面上同时运行不同的操作系统…

安装WMware和Ubuntu并使用xShell连接

0、我的电脑配置 设备名称 hello 处理器 Intel(R) Core(TM) i7-10700K CPU 3.80GHz 3.79 GHz 机带 RAM 16.0 GB (15.9 GB 可用) 设备 ID 541EC230-9910-418C-9043-5FBBF8ED320C 产品 ID 00330-80000-00000-AA846 系统类型 64 位操作系统, 基于 x64 的处理器 笔和触控 没有可…

秃姐学AI系列之:残差网络 ResNet

目录 残差网络——ResNet 残差块思想 ResNet块细节 ResNet架构 总结 代码实现 残差块 两种 ResNet 块的情况 ResNet 模型 QA 由上图发现&#xff0c;只有当较复杂的函数类包含较小的函数类时&#xff0c;才能确保提高它们的性能。 对于深度神经网络&#xff0c;如果…

QGIS制图流程

在之前我们推送了QGIS的软件安装、插件安装、数据导入等基础操作&#xff0c;今天我们介绍一下QGIS的制图功能。QGIS的制图与ArcGIS Pro存在一定的区别&#xff0c;但是思路上相似。我们教程内容主要是参考QGIS官方文档&#xff1a; https://docs.qgis.org/3.34/en/docs/user_…

Android 中ebpf 的集成和调试

1. BPF 简介 BPF&#xff0c;是Berkeley Packet Filter的简称&#xff0c;最初构想提出于 1992 年。是一种网络分流器和数据包过滤器&#xff0c;允许早操作系统级别捕获和过滤计算机网络数据包。它为数据链路层提供了一个原始接口&#xff0c;允许发送和接收原始链路层数据包…

安卓中回调函数的使用

在Android开发中&#xff0c;回调函数是一种常见的编程模式&#xff0c;用于在某个任务完成时异步接收通知或数据。它们通常用于处理用户界面事件、完成网络请求、数据库操作或其他长时间运行的任务。回调&#xff08;Callback&#xff09;是一种允许某段代码通知另一段代码执行…

机器人学——机械臂轨迹规划-2

直线轨迹 线段转折点速度不连续 加速度状态讨论 double dot 多段直线轨迹&#xff0c;转折点利用二次方程转为圆弧 关键步骤 第一个线段处理 Vt V0 at , 此处的V0 0 , 利用函数连续性&#xff0c;左右速度相等&#xff0c;联立求解 sgn(x):符号函数 最后一个线段…

dubbo:dubbo服务负载均衡、集群容错、服务降级、服务直连配置详解(五)

文章目录 0. 引言1. dubbo负载均衡1.1 负载均衡算法1.2. dubbo负载均衡使用1.3 自定义负载均衡策略 2. dubbo服务容错2.1 8种服务容错策略2.2 自定义容错策略 3. dubbo服务降级&#xff08;mock&#xff09;4. dubbo服务直连5. 总结 0. 引言 之前我们讲解了dubbo的基本使用&am…

内部类java

内部类就是定义在一个类里面的类&#xff0c;里面的类可以理解成&#xff08;寄生&#xff09;&#xff0c;外部类可以理解成&#xff08;寄主&#xff09;。 //外部类 public class people{//内部类public class heart{} } 内部类的使用场景、作用 1.当一个事物的内部&…

STM32学习笔记3---ADC,DMA

目录 ADC模拟数字转换器 规则组的四种转换模式 AD单通道 AD多通道 常用代码函数相关 DMA直接存储器 存取&#xff08;访问&#xff09; 两个应用 DMA存储器到存储器的转运 ADCDMA ADC模拟数字转换器 stm32数字电路&#xff0c;只有高低电平&#xff0c;无几V电压的概念…