第15天-商城系统架构,首页渲染三级分类及搭建域名访问商城

news2025/1/12 21:02:45

1.商城系统介绍

在这里插入图片描述



1.1.技术方案

  • 前后端分离
  • 服务端模板渲染(选择)
  • 商品详情页面静态化改造(优化)


1.2.动静分离架构

在这里插入图片描述



2.模板引擎Thymeleaf



2.1.Thymeleaf介绍

官方文档:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html



2.2.引入依赖

gmall-product 商城服务中引入 Thymeleaf 相关依赖

<!--  thymeleaf模板引擎   -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--   热更新     -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>


2.3.Thymeleaf设置

  • 关闭缓存, spring.thymeleaf.cache=false

  • 静态资源都放在static文件夹下就可以按照路径直接访问

  • HTML页面放在 templates 下,可以直接访问,spring boot启动时,默认会找 index

  • 页面修改不重启服务器实时更新

    1、引入 spring-boot-devtools
    2、修改完页面, Ctrl+Shift+F9 重新自动编译页面,代码配置修改,建议还是重启服务



3.首页渲染一级分类



3.1.静态资源

  • index 文件夹:放入到 \resoureces\static\
  • index.html:放入到 templates



3.2.后台接口实现

IndexController

package com.atguigu.gmall.product.web;

import com.atguigu.gmall.product.entity.CategoryEntity;
import com.atguigu.gmall.product.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;
import java.util.Map;

/**
 * 商城首页 {@link IndexController}
 *
 * @author zhangwen
 * @email: 1466787185@qq.com
 */
@Controller
public class IndexController {

    @Autowired
    private CategoryService categoryService;

    /**
     * 商城首页一级分类
     * @return
     */
    @GetMapping({"/", "/index.html"})
    public String index(Model model) {
        // 查询所有的一级分类
        List<CategoryEntity> categories = categoryService.getLevel1Categories();
        model.addAttribute("categories", categories);
        return "index";
    }
}

CategoryServiceImpl

 /**
  * 查询一级分类
  * @return 一级分类集合
  */
 @Override
 public List<CategoryEntity> getLevel1Categories() {
     List<CategoryEntity> categoryEntities= this.list(
             new QueryWrapper<CategoryEntity>().eq("parent_cid", 0));
     return categoryEntities;
 }


3.3.模板数据渲染

index.html

<ul>
	<li th:each="category: ${categories}">
		<a href="#" class="header_main_left_a" th:attr="ctg-data=${category.catId}">
			<b th:text="${category.name}"></b>
		</a>
	</li>
</ul>


4.首页渲染二级和三级分类

IndexController

/**
 * 一次性组装分类数据
 * @return
 */
@ResponseBody
@GetMapping("/index/catalog.json")
public Map<String, List<Catalog2VO>> getCatalogJson() {
    Map<String, List<Catalog2VO>> catalogJson = categoryService.getCatalogJson();
    return catalogJson;
}

CategoryServiceImpl

/**
 * 查询首页展示分类列表
 * @return
 */
@Override
public Map<String, List<Catalog2VO>> getCatalogJson() {
    // 查询所有一级分类
    List<CategoryEntity> level1Categories = getLevel1Categories();
    //封装数据
    Map<String, List<Catalog2VO>> map = level1Categories.stream().collect(
            Collectors.toMap(k -> k.getCatId().toString(), v -> {
        //查询当前一级分类的所有二级分类,封装成vo
        List<CategoryEntity> level2Categories = list(
                new QueryWrapper<CategoryEntity>().eq("parent_cid", v.getCatId()));
        List<Catalog2VO> catalog2VOS = null;
        if (level2Categories != null) {
            catalog2VOS = level2Categories.stream().map(category2 -> {
                Catalog2VO catalog2VO = new Catalog2VO(
                        v.getCatId().toString(),
                        null,
                        category2.getCatId().toString(),
                        category2.getName());

                // 查询当前二级分类的所有三级分类,封装为vo
                List<CategoryEntity> level3Categories = list(new
                        QueryWrapper<CategoryEntity>()
                        .eq("parent_cid", category2.getCatId()));
                if (level3Categories != null) {
                    List<Catalog2VO.Catalog3VO> catalog3VOS =
                            level3Categories.stream().map(catalog3 -> {
                        Catalog2VO.Catalog3VO catalog3VO = new Catalog2VO.Catalog3VO(
                                category2.getCatId().toString(),
                                catalog3.getCatId().toString(),
                                catalog3.getName());
                        return catalog3VO;
                    }).collect(Collectors.toList());
                    catalog2VO.setCatalog3List(catalog3VOS);
                }
                return catalog2VO;
            }).collect(Collectors.toList());
        }
        return catalog2VOS;
    }));
    return map;
}


5.Nginx搭建域名访问



5.1.配置hosts映射

在windows的 hosts 文件里面配置映射规则

#虚拟机IP
192.168.139.10 gmall.com



5.2.Nginx配置

nginx.conf

http {
	upstream gmall {
		server 192.168.139.10:90; #网关
	}
}

cd /mydata/nginx/conf/conf.d
cp default.conf gmall.conf

gmall.conf

server {
	listen 80;
	server_name gmall.com; #域名
	location / {
		proxy_pass http://gmall;
		proxy_set_header Host $host; #Nginx代理给网关时,会丢失请求的Host信息
	}
}


5.3.网关路由配置

- id: gmall_host_route
  uri: lb://gmall-product
  predicates:
  - Host= **.gmall.com, gmall.com

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

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

相关文章

今天,小灰37岁了!

人们常常说&#xff0c;35岁是互联网人的中年危机。现在&#xff0c;小灰已经跨过了中年危机&#xff0c;倒不是因为小灰财务自由了&#xff0c;而是因为今天是小灰37岁的生日。年轻时候&#xff0c;小灰总觉得30岁是一个很遥远的年龄&#xff0c;而现在&#xff0c;小灰距离40…

KingbaseES V8R6 运维系列 --单机小版本升级

​ 案例说明&#xff1a; 在KingbaseES V8R6版本提供了sys_upgrade的升级工具&#xff0c; 本案例描述了KingbaseES V8R6单机环境下数据库的小版本升级操作&#xff0c;案例涉及的版本从‘(Kingbase) V008R006C005B0041’通过sys_upgrade升级到‘ (Kingbase) V008R006C005B0054…

【Java】Java进阶学习笔记(四)—— 抽象类与接口

【Java】Java进阶学习笔记&#xff08;四&#xff09;—— 抽象类与接口一、抽象类1、抽象类的概念抽象类的定义格式2、抽象类的注意点抽象方法的介绍3、抽象类的具体作用4、抽象类实例二、接口&#xff08;一&#xff09;、接口的概念1、接口与类的区别2、接口特性3、抽象类和…

MyBatis 查出数据不一致 MyBatis返回数据和数据库查询不一致

MyBatis 查出数据不一致 MyBatis返回数据和数据库查询不一致 --- MyBatis查询到的数据 和 Sql 查询到的数据不一致 一、背景 近期工作中&#xff0c;遇到一个MyBatis查询数据不一致的问题&#xff0c;表现是&#xff1a; sql在数据库中查询出10条数据&#xff0c;mybatis 返回的…

【服务器数据恢复】VSAN数据迁移中断导致容量盘故障的数据恢复案例

VSAN简介&#xff1a; VSAN是以vSphere内核为基础开发&#xff0c;可以扩展使用的分布式存储架构。该架构在vSphere集群主机中安硬盘及闪存构建VSAN存储层&#xff0c;通过存储进行管理与控制&#xff0c;最终形成一个共享存储层。 VSAN数据存储是一个对象存储&#xff0c;以文…

MySQL事务的12连问

事务的12连问&#xff0c;相信大家看完肯定会有帮助的。 1. 什么是数据库事务&#xff1f; 事务&#xff0c;由一个有限的数据库操作序列构成&#xff0c;这些操作要么全部执行,要么全部不执行&#xff0c;是一个不可分割的工作单位。 假如A转账给B 100 元&#xff0c;先从A的…

windows@系统环境变量备份@注册表操作@reg命令行操作注册表

文章目录备份注册表&#x1f388;备份环境变量powershell函数从注册表文件还原命令行操作注册表更新某个key备份注册表&#x1f388; 完整的注册表备份可能达到500MB打开register editor 命令行里可以输入regedit.exe打开 可以局部备份 备份环境变量powershell函数 function …

JavaEE进阶第五课:SpringBoot的创建和使用

上篇文章介绍了Bean 作用域和生命周期&#xff0c;这篇文章我们将会介绍SpringBoot的创建和使用 目录1.为什么要学习StringBoot1.1什么是SpringBoot1.2SpringBoot的优点2.如何用Idea创建SpringBoot项目3.项目目录介绍和运行3.1输入Helloworld结尾1.为什么要学习StringBoot 在前…

Python 算法交易实验49 Step1 DataETL

说明 万丈高楼平地起 按照前面的规划&#xff0c;开始有序推进我的【15% 资金加速器】计划。这一步是通过某个源&#xff0c;获取分钟级数据&#xff0c;然后送到第一个ADBS。 Sniffer : 读取数据并发送到入队列。一开始我会把文件以离线形式上传到某个folder&#xff0c;所以…

VMware16安装MacOS【详细教程】

安装VMware workstation 双击安装包&#xff0c;然后一直下一步就行了。 进行VMware安装&#xff0c;一直 下一步 在输入产品密钥这一步&#xff0c;如果有查找到可用密钥就填进去&#xff0c;没有就跳过&#xff0c;进入软件后也能输入密钥的。 输入密钥。 最后一步&#xff…

MyBatis——进阶操作

resultMap xml中可以通过returnType来指定返回的对象&#xff0c;只需要一个对象名就可以返回所有的属性 但是&#xff0c;如果sql中的属性名和对象的名称不一致&#xff0c;那么就需要resultMap来指定返回的数据了 当数据库中是username&#xff0c;而对象是name时&#xf…

zabbix主机发现、zabbix下的API、服务的监控部署

文章目录前言一、zabbix主机发现1.手动添加2.自动发现3.自动注册二、zabbix api1.获取token2.使用api检索主机3.通过api删除主机4.使用api添加主机5.纯代码过程三、服务监控1.nginx监控2.mysql监控&#xff08;1&#xff09;zabbix自带mysql模板&#xff08;2&#xff09;perco…

大数据技术之Maxwell基础知识

大数据技术之Maxwell基础知识 文章目录大数据技术之Maxwell基础知识0、写在前面1、Maxwell 概述1.1 Maxwell 定义1.2 Maxwell 工作原理1.2.1 MySQL 主从复制过程1.2.2 Maxwell 的工作原理1.2.3 MySQL 的 binlog1.3 Maxwell与Cannal对比2. Maxwell 使用2.1 Maxwell 安装部署2.1.…

Semaphore类原理剖析

1.什么是Semaphore Semaphore也是Java中的同步器&#xff0c;与CountDownLatch和CyclicBarrier不同的是&#xff0c;他的内部计数器是递增的。在一开始我们不需要知道有多少个需要同步的线程&#xff0c;只需要在需要同步的地方调用acquire方法指定需要同步的线程个数。 2.Se…

【C语言】结构体进阶

一、结构体 1. 结构体的声明 &#xff08;1&#xff09; 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。&#xff08;2&#xff09;结构的声明 struct tag {member-list; }variable-list;例如描述一个学生&#x…

「需求分析」业务架构师需求分析技术权威指南

需求分析&#xff0c;也称为需求工程&#xff0c;是定义用户对正在构建或修改的新软件的期望的过程。在软件工程中&#xff0c;它有时被一些松散的名称所引用&#xff0c;例如需求收集或需求捕获。需求分析包括那些为一个新的或改变的产品或项目确定需要或满足的条件的任务&…

进程内存空间

我们直接用linux演示 我们将这个代码编译成目标文件&#xff0c;然后查看内容 #include <stdlib.h> #include <pthread.h> int sum(int x,int y) {return xy; }int main(){sum(2,3);return 0; }编译 我们反汇编这个目标文件 我们发现这些汇编代码不好阅读&#…

有趣的HTML实例(十五) 注册登录界面(css+js)

我并不是每次吃完饭就看电视&#xff0c;有时我边吃边看电视&#xff0c;生活中有些改变会增加乐趣。 ——《加菲猫》 目录 一、前言 二、往期作品回顾 三、作品介绍 四、本期代码介绍 五、效果显示 六、编码实现 index.html style.css script.js 七、获取源码 公众…

何为数据分析?数据分析流程是啥?

一、什么是数据分析 指用专业的统计分析方法对大量数据进行分析&#xff0c;并加以详细研究和概括总结&#xff0c;提取有价值的信息&#xff0c;形成有效的分析结论&#xff0c;从而影响业务决策 二、数据分析的重要性 一切事物&#xff0c;如果不能量化它&#xff0c;我们…

Allegro如何手动让静态铜皮避让过孔操作指导

Allegro如何手动让静态铜皮避让过孔操作指导 在用Allegro做PCB设计的时候,如果铺的是静态铜皮,铜皮铺在过孔上会造成短路,需要手动避让下,如下图 下面介绍如何手动避让,具体操作如下 点击Shape点击Manual Void/Cavity