当前位置: 首页 > news >正文

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

目录

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 为什么帕金森病患者的症状有时会出现波动性?
  • Godot《躲避小兵》实战之为游戏添加音效
  • 【IoTDB 线上小课 06】列式写入=时序数据写入性能“利器”?
  • 智能ai写作哪个好用?这几款工具让你的写作更加高效
  • .NET 给NuGet包添加Readme
  • 个性化营销:数字化时代的致胜法宝
  • 【C语言】常见文件操作
  • RK3588开发笔记-pdm接口ES7201音频采集调试记录
  • 安科瑞AEW100电力改造智能电力仪表,体积小巧
  • 深度学习分类:交叉熵
  • 瑞吉外卖--登录退出功能的实现
  • vscode教程
  • 【BES2500x系列 -- RTX5操作系统】Battery模块 -- 邮箱线程诞生的第一视角 -- osThreadDef --(十三)
  • 阿里巴巴发布Q1财报:电商份额趋稳,市场不再悲观
  • IPC 摄像头通过什么技术实现远程查看
  • [Vue CLI 3] 配置解析之 css.extract
  • 【EOS】Cleos基础
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • go语言学习初探(一)
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java方法详解
  • Js基础知识(一) - 变量
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • python学习笔记-类对象的信息
  • Python中eval与exec的使用及区别
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue数据传递--我有特殊的实现技巧
  • yii2中session跨域名的问题
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 设计模式(12)迭代器模式(讲解+应用)
  • 算法-图和图算法
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 正则表达式小结
  • #QT 笔记一
  • $L^p$ 调和函数恒为零
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (函数)颠倒字符串顺序(C语言)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十六)一篇文章学会Java的常用API
  • (四)opengl函数加载和错误处理
  • (四)库存超卖案例实战——优化redis分布式锁
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转)ABI是什么
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • **PHP分步表单提交思路(分页表单提交)