Thymeleaf 搭建家居网首页

文章目录

    • 1.引入Thymeleaf sunliving-commodity模块
        • 1.在resources目录下引入Thymeleaf 所需资源
        • 2.pom.xml引入Thymeleaf依赖
        • 3.application.yml 关闭缓存,使页面实时刷新
        • 4.在application-prod.yml开启缓存
        • 5.编写com/sun/sunliving/commodity/web/IndexController.java响应templates/index.html
        • 6.index.html和list.html引入thymeleaf的命名空间
        • 7.效果展示
    • 2.首页显示分类
        • 1.显示一级分类
          • 1.后端 sunliving-commodity模块
            • 1.CategoryService.java 获取一级分类
            • 2.CategoryServiceImpl.java
            • 3.IndexController.java 首先测试是否得到一级分类
            • 4.完整 IndexController.java
          • 2.index.html 展示一级菜单
          • 3.结果演示
        • 2.流式计算将集合转为Map
          • 1.实例代码
          • 2.结果
          • 3.解析
        • 3.显示二级和三级分类
          • 1.前端要求的数据格式
          • 2.vo设计Catalog2Vo.java
          • 3.CategoryService.java 根据父id获取节点
          • 4.CategoryServiceImpl.java 实现方法
          • 5.CategoryService.java 获取二级和三级分类,按照前端需要的格式返回
          • 6.CategoryServiceImpl.java 实现方法
          • 7.分析前端请求 static/index/js/catalogLoader.js
            • 1.前端发送请求的代码片段
            • 2.解析
            • 3.为了部署,将这个请求进行多环境的区分,使用环境变量 + 资源路径的方式,上线的时候要手动修改env的值,必须走网关,否则会跨域
          • 8.编写后端的接口
          • 9.测试
            • 1.可以获取数据,但是没有正确展示
            • 2.在index.html加一句话
            • 3.重启访问,成功显示!

1.引入Thymeleaf sunliving-commodity模块

1.在resources目录下引入Thymeleaf 所需资源

image-20240425172628917

2.pom.xml引入Thymeleaf依赖
        <!-- 引入thymeleaf --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
3.application.yml 关闭缓存,使页面实时刷新

image-20240425174410743

4.在application-prod.yml开启缓存

image-20240425174432594

5.编写com/sun/sunliving/commodity/web/IndexController.java响应templates/index.html
package com.sun.sunliving.commodity.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;/*** Description:** @Author sun* @Create 2024/4/25 17:50* @Version 1.0*/
@Controller
public class IndexController {// 响应templates/index.html// 当请求路径为http://localhost:8080/ 或 http://localhost:8080/index时,返回index.html页面@GetMapping({"/", "/index.html"})public String index() {return "index";}}
6.index.html和list.html引入thymeleaf的命名空间

image-20240425180109440

<html lang="en" xmlns:th="http://www.thymeleaf.org">
7.效果展示

image-20240425195100771

2.首页显示分类

1.显示一级分类
1.后端 sunliving-commodity模块
1.CategoryService.java 获取一级分类
    /*** 获取一级分类* @return*/List<CategoryEntity> getLevel1Category();
2.CategoryServiceImpl.java
    @Overridepublic List<CategoryEntity> getLevel1Category() {// 查询一级分类List<CategoryEntity> categoryEntities = categoryDao.selectList(new QueryWrapper<CategoryEntity>().eq("parent_id", 0));return categoryEntities;}
3.IndexController.java 首先测试是否得到一级分类

image-20240426085808273

4.完整 IndexController.java
@Controller
public class IndexController {@Resourceprivate CategoryService categoryService;// 响应templates/index.html// 当请求路径为http://localhost:8080/ 或 http://localhost:8080/index时,返回index.html页面@GetMapping({"/", "/index.html"})public String index(Model model) {// 获取一级分类List<CategoryEntity> categoryEntities = categoryService.getLevel1Category();// 将一级分类放到model中model.addAttribute("categotries", categoryEntities);return "index";}}
2.index.html 展示一级菜单

image-20240426091110112

3.结果演示

image-20240426091134830

2.流式计算将集合转为Map
1.实例代码
import lombok.Data;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** Description:** @Author sun* @Create 2024/4/26 9:59* @Version 1.0*/
public class Test {public static void main(String[] args) {List<Stu> stus = new ArrayList<>();// 添加元素stus.add(new Stu(1, "张三", "北京", "篮球"));stus.add(new Stu(2, "李四", "上海", "足球"));stus.add(new Stu(3, "王五", "广州", "乒乓球"));// 将List转为Map,key为name,value为Stu2对象的列表Map<String, ArrayList<Stu2>> collect = stus.stream().collect(Collectors.toMap(k -> {// 这个k代表每一个Stu对象return k.getName();}, v -> {// 这个v代表Stu2对象的列表Stu2 stu2 = new Stu2();stu2.setHobby(v.getHobby());stu2.setName(v.getName());Stu2 stu21 = new Stu2();stu21.setHobby(v.getHobby());stu21.setName(v.getName() + "克隆");ArrayList<Stu2> stu2s = new ArrayList<>();stu2s.addAll(Arrays.asList(stu2, stu21));return stu2s;}));// 输出collectSystem.out.println(collect);}
}@Data
class Stu {private Integer id;private String name;private String address;private String hobby;// 全参构造public Stu(Integer id, String name, String address, String hobby) {this.id = id;this.name = name;this.address = address;this.hobby = hobby;}
}@Data
class Stu2 {private String name;private String hobby;
}
2.结果

image-20240426101928297

3.解析
  • 流式计算就是对每一个遍历的List对象进行操作,在这里就是将其转化为Map
  • 其中的k,v指的都是List中的每一个对象
  • 用语言描述就是,将List化为流,收集每一个元素作为Map
3.显示二级和三级分类
1.前端要求的数据格式

image-20240426092244393

2.vo设计Catalog2Vo.java
package com.sun.sunliving.commodity.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;/*** Description:** @Author sun* @Create 2024/4/26 9:33* @Version 1.0*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Catalog2Vo {// 一级分类idprivate String catalog1Id;// 三级分类信息的集合List<Category3Vo> catalog3List;// 二级分类的id和名称private String id;private String name;// 三级分类信息@Data@NoArgsConstructor@AllArgsConstructorpublic static class Category3Vo {// 二级分类idprivate String catalog2Id;// 三级分类idprivate String id;// 三级分类名称private String name;}
}
3.CategoryService.java 根据父id获取节点
    /*** 根据父id获取所有节点** @param selectList* @param parentCId* @return*/List<CategoryEntity> getParent_cid(List<CategoryEntity> selectList, Long parentCId);
4.CategoryServiceImpl.java 实现方法
    @Overridepublic List<CategoryEntity> getParent_cid(List<CategoryEntity> selectList, Long parentCId) {List<CategoryEntity> collect = selectList.stream().filter(item -> {return item.getParentId().equals(parentCId);}).collect(Collectors.toList());return collect;}
5.CategoryService.java 获取二级和三级分类,按照前端需要的格式返回
    /*** 获取二级和三级分类,按照前端需要的格式返回* @return*/Map<String, List<Catalog2Vo>> getCatalogJson();
6.CategoryServiceImpl.java 实现方法
    @Overridepublic Map<String, List<Catalog2Vo>> getCatalogJson() {// 首先查询所有分类List<CategoryEntity> categoryEntities = categoryDao.selectList(null);// 然后使用辅助方法获取一级分类List<CategoryEntity> parentCid = getParent_cid(categoryEntities, 0L);// 使用streamapi 将一级分类转换为MapMap<String, List<Catalog2Vo>> collect = parentCid.stream().collect(Collectors.toMap(// key 为一级分类的iditem -> {return item.getId().toString();},// value 为二级分类的集合item -> {// 获取所有二级分类List<CategoryEntity> catalog2 = getParent_cid(categoryEntities, item.getId());// 将二级分类转换为 Catalog2VoList<Catalog2Vo> catalog2Vos = catalog2.stream().map(catalog2Item -> {// 将二级分类转换为 Catalog2VoCatalog2Vo catalog2Vo = new Catalog2Vo();// 一级分类idcatalog2Vo.setCatalog1Id(item.getId().toString());// 二级分类id和名称catalog2Vo.setId(catalog2Item.getId().toString());catalog2Vo.setName(catalog2Item.getName());// 获取三级分类List<CategoryEntity> catalog3 = getParent_cid(categoryEntities, catalog2Item.getId());List<Catalog2Vo.Category3Vo> category3Vos = catalog3.stream().map(catalog3Item -> {// 将三级分类转换为 Catalog2Vo.Category3VoCatalog2Vo.Category3Vo category3Vo = new Catalog2Vo.Category3Vo();category3Vo.setId(catalog3Item.getId().toString());category3Vo.setName(catalog3Item.getName());category3Vo.setCatalog2Id(catalog3Item.getParentId().toString());return category3Vo;}).collect(Collectors.toList());catalog2Vo.setCatalog3List(category3Vos);return catalog2Vo;}).collect(Collectors.toList());return catalog2Vos;}));return collect;}
7.分析前端请求 static/index/js/catalogLoader.js
1.前端发送请求的代码片段

image-20240426135548224

2.解析
  • 可以看出使用的是相对当前页面的路径
  • 查看当前页面的路径 http://localhost:5050/api/sunliving-commodity/index.html#
  • 这样,这个请求就会向http://localhost:5050/api/sunliving-commodity/index/catalog.json
3.为了部署,将这个请求进行多环境的区分,使用环境变量 + 资源路径的方式,上线的时候要手动修改env的值,必须走网关,否则会跨域

image-20240426143738747

8.编写后端的接口
    // static/index/catalog.json@ResponseBody@GetMapping("/index/catalog.json")public Map<String, List<Catalog2Vo>> getCatalogJson() {Map<String, List<Catalog2Vo>> catalogJson = categoryService.getCatalogJson();return catalogJson;}
9.测试
1.可以获取数据,但是没有正确展示

image-20240426144001747

image-20240426144021495

2.在index.html加一句话

image-20240426144221095

3.重启访问,成功显示!

image-20240426144433714

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心智能体大赛:百度文心智能体平台初体验

写在前面 博文内容涉及&#xff1a;文心智能体大赛:文心智能体初体验理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我徒然忘记了热闹&#xff0c;却来不及悟透真正的清冷(《四喜忧国》) 前言 徒然忘记了热闹&#xff0c;却来不及悟透真正的清冷(《四喜忧国》)&#xff0c;在…

LiveGBS流媒体平台GB/T28181用户手册-版本信息:查看机器码、切换查看流媒体服务

LiveGBS流媒体平台GB/T28181用户手册--版本信息:查看机器码、切换查看流媒体服务 1、版本信息1.1、查看机器码1.2、多个流媒体服务1.3、提交激活 2、搭建GB28181视频直播平台 1、版本信息 版本信息页面&#xff0c;可以查看到信令服务 流媒体服务相关信息&#xff0c;包含硬件…

从XPS迁移到IP Integrator

从XPS迁移到IP Integrator 概述 AMD Vivado™设计套件IP集成器可让您将包含AMD的设计缝合在一起 IP或您的自定义IP在相对较短的时间内&#xff0c;在GUI环境中工作。 就像在Xilinx Platform Studio中一样&#xff0c;您可以快速创建嵌入式处理器设计&#xff08;使用&#xff0…

[C++]debug介绍+debug时如何查看指针指向内存处的值

一、简介 预备工具和知识&#xff1a;使用使用VSCode使用Debug。 本文简介&#xff1a;本文将简要介绍debug中Continue&#xff0c;Step Over&#xff0c;Step Into和Restart的功能。并介绍如何在debug时查看动态内存地址&#xff08;指针&#xff09;的值&#xff1b; 二、D…

基于信号分解方法的机械故障诊断方法存在的问题

一方面&#xff0c;由于结构共振、测试噪声的干扰&#xff0c;为了确保分解精度&#xff0c;需要给定准确的参数初值(例如&#xff0c;瞬时频率)。研究人员通常认为零部件特征频率与通过传动比和驱动转速计算的理论值基本吻合&#xff0c;并基于理论值设置参数初值。事实上&…

upload-labs 21关解析

目录 一、代码审计 二、实践 三、总结 一、代码审计 $is_upload false; $msg null; if(!empty($_FILES[upload_file])){//检查MIME$allow_type array(image/jpeg,image/png,image/gif);if(!in_array($_FILES[upload_file][type],$allow_type)){$msg "禁止上传该类型…

【Docker学习】深入研究命令docker exec

使用docker的过程中&#xff0c;我们会有多重情况需要访问容器。比如希望直接进入MySql容器执行命令&#xff0c;或是希望查看容器环境&#xff0c;进行某些操作或访问。这时就会用到这个命令&#xff1a;docker exec。 命令&#xff1a; docker container exec 描述&#x…

【网络技术】【Kali Linux】Wireshark嗅探(十五)SSDP(简单服务发现协议)报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

什么是聚簇索引和非聚簇索引,如何理解回表、索引下推

聚簇索引&#xff08;Clustered Index&#xff09;和非聚簇索引&#xff08;Non-clustered Index&#xff09;是数据库中的两种索引类型&#xff0c;它们在组织和存储数据时有不同的方式。 聚簇索引 聚簇索引简单理解就是将数据与索引放在一起&#xff0c;找到索引即找到了数…

第十三节:带你梳理Vue2 : watch侦听器

官方解释:> 观察 Vue 实例变化的一个表达式或计算属性函数。回调函数得到的参数为新值和旧值。表达式只接受监督的键路径。对于更复杂的表达式&#xff0c;用一个函数取代<br/>## 1. 侦听器的基本使用侦听器可以监听data对象属性或者计算属性的变化watch是观察属性的…

反弹shell详细易懂讲解,看这一篇就够了

文章目录 反弹shell详细易懂讲解&#xff0c;看这一篇就够了一: 基础shell知识什么是shell&#xff0c;bash与shell的区别?通俗解释类型功能常见命令 二: 什么是反弹shell三: 反弹shell类型bash反弹shellNetcat 一句话反弹curl反弹shell正确姿势 wget方式反弹awk反弹 Shellsoc…

[6] CUDA之线程同步

CUDA之线程同步 共享内存&#xff1a;线程时间需要互相交换数据才能完成任务的情况并不少见&#xff0c;因此&#xff0c;必须存在某种能让线程彼此交流的机制当很多线程并行工作并且访问相同的数据或者存储器位置的时候&#xff0c;线程间必须正确的同步线程之间交换数据并不…

前端:音频可视化(H5+js版本)

一、效果展示 HTML5JS实现一个简单的音频可视化 二、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>音频可视化</title><style></style></head><body><divs…

构建高效的在线培训机构CRM应用架构实践

在当今数字化时代&#xff0c;在线培训已成为教育行业的重要趋势之一。为了提供更好的学习体验和管理服务&#xff0c;在线培训机构需要构建高效的CRM&#xff08;Customer Relationship Management&#xff09;应用架构。本文将探讨在线培训机构CRM应用架构的设计与实践。 一、…

golang创建式设计模式---工厂模式

创建式设计模式—工厂模式 目录导航 创建式设计模式---工厂模式1)什么是工厂模式2)使用场景3)实现方式4)实践案例5)优缺点分析 1)什么是工厂模式 工厂模式(Factory Method Pattern)是一种设计模式&#xff0c;旨在创建对象时&#xff0c;将对象的创建与使用进行分离。通过定义…

每日一题23:统计文本中单词出现的次数

一、每日一题 解答&#xff1a; import pandas as pd def count_occurrences(files: pd.DataFrame) -> pd.DataFrame:bull_cnt len(files[files[content].str.contains(r\sbull\s)])bear_cnt len(files[files[content].str.contains(r\sbear\s)])res_df pd.DataFrame({…

MySql基础(一)--最详细基础入门,看完就懂啦(辛苦整理,想要宝宝的赞和关注嘻嘻)

前言 希望你向太阳一样&#xff0c;有起有落&#xff0c;不失光彩~ 一、数据库概述 1. 什么是数据库 数据库就是存储数据的仓库&#xff0c;其本质是一个文件系统&#xff0c;数据按照特定的格式将数据存储起来&#xff0c;用户可以对数据库中的数据进行增加&#xff0c;修改&…

Python 小游戏——贪吃蛇

Python 小游戏——贪吃蛇 文章目录 Python 小游戏——贪吃蛇项目介绍环境配置代码设计思路1. 初始化和变量定义2. 创建游戏窗口和FPS控制器3. 初始化贪吃蛇和食物的位置4. 控制贪吃蛇的方向和分数5. 主游戏循环 难点分析源代码呈现代码结果 项目介绍 贪吃蛇游戏是一款通过上下…

Java核心:注解处理器

Java提供了一个javac -processor命令支持处理标注有特定注解的类&#xff0c;来生成新的源文件&#xff0c;并对新生成的源文件重复执行。执行的命令大概是这样的: javac -XprintRounds -processor com.keyniu.anno.processor.ToStringProcessor com.keyniu.anno.processor.Po…

【C++】二分查找算法:x的平方根

1.题目 2.算法思路 看到题目可能不容易想到二分查找。 这题考察我们对算法的熟练程度。 二分查找的特点&#xff1a;数组具有二段性(不一定有序)。 题目中没有数组&#xff0c;我们可以造一个从0到x的数组&#xff0c;然后利用二分查找找到对应的值即可。 3.代码 class S…