一:项目微服务
文章图片
部署项目要做到动静分离
静:静态资源,统一让nginx返回。
动:动态请求,所有要经过服务器动态处理的请求,称之为动态资源。
好处:分担微服务的压力,图片,js,等静态资源统一作为静态资源。防止高并发造成服务器的压力。
二:商城首页的搭建
1.商品系统前台页面搭建 thymeleaf优点:自然化语言,其编写的页面前端直接使用,方便前后人员的分工合作。
thymeleaf缺点:性能低于其他模板引擎
1)在gulimail-product的pom文件中导入thymeleaf模板
org.springframework.boot
spring-boot-starter-thymeleaf
2)导入前端页面
文章图片
3)关闭thymeleaf缓存
spring:
thymeleaf:
cache: false
4)静态资源放在static文件夹下就可以按照路径直接访问
5)页面放在templates下,直接访问
6)springboot访问项目的时候,会默认访问index
文章图片
2.页面跳转,路径映射 1)新建IndexController
2)@GetMapping({“/”,“/index.html”})进行分组访问
3)视图解析器进行拼串
4)classpath:/templates/+返回值+.html
5)IndexController
package com.sysg.gulimail.product.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class IndexController {
@GetMapping({"/","/index.html"})
public String indexPage(){
//视图解析器进行拼串
//classpath:/templates/+返回值+.html
return "index";
}
}
三:整合dev-tools渲染一级分类数据 1.查出所有一级分类
@Autowired
private CategoryService categoryService;
@GetMapping({"/","/index.html"})
public String indexPage(Model model){
//1.查出所有一级分类
List categoryEntities =categoryService.getLevel1Categorys();
//通过model对象,将返回的数据传递给前端页面
model.addAttribute("categorys",categoryEntities);
//视图解析器进行拼串
//classpath:/templates/+返回值+.html
return "index";
}
- themeleaf模板引擎可以通过Model 对象传递参数
- model.addAttribute(“categorys”,categoryEntities); 可以将查出来的数据返回给前端页面
xmlns:th="http://www.thymeleaf.org"
3.前端页面实时刷新功能 1)引入dev-tools的pom文件
org.springframework.boot
spring-boot-devtools
true
2)ctrl + shift + F9自动编译页面
4.前端页面获取一级分类数据
家用电器
th:each="category : ${categorys}"
中${categorys}是后台model传递过来的数据,category 是遍历后的数据th:text="${category.name}"
获取分类的名称
package com.sysg.gulimail.product.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 二级分类的封装对象
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Catelog2Vo {
/**
* 一级父分类id
*/
private String catelog1Id;
/**
* 三级子分类
*/
private List
2.编辑IndexController
//index/catalog.json
@ResponseBody
@GetMapping("index/catalog.json")
public Map> getCatelogJson(){
Map> catelogJson = categoryService.getCatelogJson();
return catelogJson;
}
3.编辑CategoryServiceImpl
/**
* 查出所有分类,按照要求返回
* @return
*/
@Override
public Map> getCatelogJson() {
//1.查出所有一级分类
List level1Categorys = getLevel1Categorys();
//2.封装数据
Map> entity = level1Categorys.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
//1.每一个的一级分类,查到一级分类的二级分类
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("parent_cid", v.getCatId());
List categoryEntities = baseMapper.selectList(wrapper);
//2.封装结果
List catelog2Vos = null;
if (categoryEntities != null) {
catelog2Vos = categoryEntities.stream().map(l2 -> {
Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(), null, l2.getCatId().toString(), l2.getName());
//1.找当前二级分类的三级分类分装成vo
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_cid", l2.getCatId());
List level3Catelog = baseMapper.selectList(queryWrapper);
if(level3Catelog!=null){
//2.封装成指定格式
List catelog3VoList = level3Catelog.stream().map(l3 -> {
//3.封装成指定格式
Catelog2Vo.Catelog3Vo catelog3Vo = new Catelog2Vo.Catelog3Vo();
catelog3Vo.setCatelog2Id(l2.getCatId().toString());
catelog3Vo.setId(l3.getCatId().toString());
catelog3Vo.setName(l3.getName());
return catelog3Vo;
}).collect(Collectors.toList());
catelog2Vo.setCatelog3List(catelog3VoList);
}
return catelog2Vo;
}).collect(Collectors.toList());
}
return catelog2Vos;
}));
return entity;
}
4.访问http://localhost:10000/测试 【thymeleaf|【大型电商项目开发】商城业务-首页搭建-thymeleaf模板引擎-36】
文章图片
推荐阅读
- javascript|客观评价 增长趋势比 vite 还猛的 TailwindCSS
- 前端|新提案,初识CSS的object-view-box属性
- 前端|注意避坑,Vue Router 4: 路由参数在 created/setup 时不可用
- 前端|停止像这样使用 “async/await“,改用原版
- java|Mybatis源码简析——实用框架必看
- #|Mybatis源码分析——插件详解
- Spring源码|Spring源码之整合Mybatis底层实现
- mybatis源码学习|Mybatis 源码学习(十二) —— binding 包
- 源码系列|Mybatis源码初探——优雅精良的骨架