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
    @Override
    public 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 {
    @Resource
    private 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;
        }));
        // 输出collect
        System.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 {
    // 一级分类id
    private String catalog1Id;
    // 三级分类信息的集合
    List<Category3Vo> catalog3List;
    // 二级分类的id和名称
    private String id;
    private String name;
    // 三级分类信息
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Category3Vo {
        // 二级分类id
        private String catalog2Id;
        // 三级分类id
        private 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 实现方法
    @Override
    public 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 实现方法
    @Override
    public Map<String, List<Catalog2Vo>> getCatalogJson() {
        // 首先查询所有分类
        List<CategoryEntity> categoryEntities = categoryDao.selectList(null);
        // 然后使用辅助方法获取一级分类
        List<CategoryEntity> parentCid = getParent_cid(categoryEntities, 0L);
        // 使用streamapi 将一级分类转换为Map
        Map<String, List<Catalog2Vo>> collect = parentCid.stream().collect(Collectors.toMap(
                // key 为一级分类的id
                item -> {
                    return item.getId().toString();
                },
                // value 为二级分类的集合
                item -> {
                    // 获取所有二级分类
                    List<CategoryEntity> catalog2 = getParent_cid(categoryEntities, item.getId());
                    // 将二级分类转换为 Catalog2Vo
                    List<Catalog2Vo> catalog2Vos = catalog2.stream().map(catalog2Item -> {
                        // 将二级分类转换为 Catalog2Vo
                        Catalog2Vo catalog2Vo = new Catalog2Vo();
                        // 一级分类id
                        catalog2Vo.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.Category3Vo
                            Catalog2Vo.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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenUI 可视化 AI:打造令人惊艳的前端设计!

https://openui.fly.dev/ai/new 可视化UI的新时代&#xff1a;通过人工智能生成前端代码 许久未更新, 前端时间在逛github&#xff0c;发现一个挺有的意思项目&#xff0c;通过口语化方式生成前端UI页面&#xff0c;能够直观的看到效果&#xff0c;下面来给大家演示下 在现代…

idea2023的git从dev分支合并到主分支master

1.本地项目切换到主分支master 右键项目-git-Branches 依次点击项目-Remote-Origin-master-CheckOut 现在你的idea中的这个项目就是远程master分支的代码了。 2.合并dev分支到master 右击项目-git-Merge 选择origin-dev 点击Merge按钮&#xff0c;此时只是合并到本地的maste…

Weblogic XML反序列化漏洞 [CVE-2017-10271]

漏洞环境搭建请参考 http://t.csdnimg.cn/i11e2 漏洞原理 Weblogic的wls security组件对外提供webservice服务&#xff0c;wls security组件使用了xmldecoder来解析用户传入的xml数据&#xff0c;如果用户进行xml恶意数据的构造&#xff0c;即可触发反序列化漏洞 漏洞版本 O…

【MySQL】聊聊count的相关操作

在平时的操作中&#xff0c;经常使用count进行操作&#xff0c;计算统计的数据。那么具体的原理是如何的&#xff1f;为什么有时候执行count很慢。 count的实现方式 select count(*) from student;对于MyISAM引擎来说&#xff0c;会把一个表的总行数存储在磁盘上&#xff0c;…

Dbs封装_连接池

1.Dbs封装 每一个数据库都对应着一个dao 每个dao势必存在公共部分 我们需要将公共部分抽取出来 封装成一个工具类 保留个性化代码即可 我们的工具类一般命名为xxxs 比如Strings 就是字符串相关的工具类 而工具类 我们将其放置于util包中我们以是否有<T>区分泛型方法和非泛…

pycharm连接阿里云服务器过程记录

因为不想用自己的电脑安装anaconda环境,所以去查了一下怎么用服务器跑代码,试着用pycharm连接阿里云服务器,参考了很多博客,自己简单配置了一下,记录一下目前完成的流程. 主要是:阿里云服务器的远程登录和安装anaconda,以及怎么用pycharm连接阿里云服务器上的解释器. 小白刚开始…

Java进阶学习笔记27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可变字符串对象&#xff0c;相当于一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a; StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;…

【FPGA】Verilog:奇校验位生成器的实现(Odd Parity bit generator)

解释奇数奇偶校验位生成器和检查器的仿真结果及过程。 真值表和卡洛图: Odd Parity Bit Generator A B C

利用element实现简单右键

利用element-plus中的el-menu实现简单右键 实现如下 <template><main class"mainClass" contextmenu"showMenu($event)"> </main><el-menu:default-active"1"class"el-menu-demo"mode"vertical":col…

GitHub怎么修改个人资料名称name和用户名username

文档 GitHub•GitHub文档•Get started•帐户和个人资料•配置文件•自定义个人资料•个性化设置https://docs.github.com/zh/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile GitHub•GitHub文档•G…

从XPS迁移到IP Integrator

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

【STM32】新建工程(江科大)

文章目录 STM32的开发方式库函数文件夹一、新建一个基于标准库的工程1.建立一个存放工程的文件夹2.打开Keil5 二、通过配置寄存器来完成点灯1.配置RCC寄存器2.配置PC13口&#xff08;1&#xff09;配置PC13口的模式&#xff08;2&#xff09;给PC13口输出数据 三、为寄存器添加…

5.26牛客循环结构

1002. 难点&#xff1a; 两层循环条件设置 思路 可以设置三个变量 代码 1003 思路&#xff1a; 与星号双塔差不多&#xff0c;在此基础上加大一点难度 每日练题5.23 &#xff08;EOF用法&#xff09;-CSDN博客 代码 1004 代码

微信小程序如何跳转微信公众号

1. 微信小程序如何跳转微信公众号 1.2. 微信公众号配置 登录微信公众号&#xff0c;点击【小程序管理】&#xff1a;   点击【添加】&#xff1a;   点击【关联小程序】&#xff1a;   输入小程序进行关联&#xff1a; 1.2. 微信小程序配置 登录微信小程序&#xf…

物联网应用开发--传感器数据上传新大陆云平台(STM32+SHT20温湿度+ESP8266+TCP)

实现目标 1、掌握新大陆云平台传感器的创建 2、熟悉STM32 HAL与ESP8266模块之间的通信 3、具体实现目标&#xff1a;&#xff08;1&#xff09;创建2个传感器&#xff1a;温度传感器&#xff0c;湿度传感器;&#xff08;2&#xff09;上传开发板上的SHT20温湿度传感器数据至…

游戏找不到d3dcompiler_43.dll怎么办,教你5种可靠的修复方法

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dcompiler43.dll”。这个问题通常出现在游戏或者图形处理软件中&#xff0c;它会导致程序无法正常运行。为了解决这个问题&#xff0c;我经过多次尝试和总结&#xff0c;找到了以下五…

消费者相关高效读写ZK作用

消费者分区分配策略 目录概述需求&#xff1a; 设计思路1.消费者分区分配策略2. 消费者offset的存储3. kafka消费者组案例4. kafka高效读写&Zk作用5. Ranger分区再分析 实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show …

python数据分析-基于数据挖掘对APP评分的预测

前言 当我们谈论关于APP用户分析与电子商务之间的联系时&#xff0c;机器学习在这两个领域的应用变得至关重要。App用户分析和电子商务之间存在着密切的关联&#xff0c;因为用户行为和偏好的深入理解对于提高用户体验、增加销售以及优化产品功能至关重要。故本文基于K-近邻模…

[JDK工具-5] jinfo jvm配置信息工具

文章目录 1. 介绍2. 打印所有的jvm标志信息 jinfo -flags pid3. 打印指定的jvm参数信息 jinfo -flag InitialHeapSize pid4. 启用或者禁用指定的jvm参数 jinfo -flags [|-]HeapDumpOnOutOfMemoryError pid5. 打印系统参数信息 jinfo -sysprops pid6. 打印以上所有配置信息 jinf…

蓝桥楼赛第30期-Python-第三天赛题 统计学习数据题解

楼赛 第30期 Python 模块大比拼 统计学习数据 介绍 JSON&#xff08;JavaScript Object Notation, /ˈdʒeɪsən/&#xff09;是一种轻量级的数据交换格式&#xff0c;最初是作为 JavaScript 的子集被发明的&#xff0c;但目前已独立于编程语言之外&#xff0c;成为了通用的…