谷粒商城【成神路】-【9】——商城页面

目录

🧈1.项目服务部署架构

🥞2.Thymealf

🍿3.请求接口

🌭4.使用nginx转发

🥖5.nginx动静分离 

🫓6.优化 


1.项目服务部署架构

使用nginx动静分离,使图片、js等静态资源和服务器请求分开

2.Thymealf

1.导入依赖 

        <!--thymeleaf-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

 2.导入资源

3.关闭缓存

spring:
    thymeleaf:
        cache: false #关闭缓存
  •  静态资源全部放在static文件夹下就可以按照路径直接访问
  • 页面放在templates,直接访问
  • springboot访问项目时,默认找index

3.请求接口

根据页面请求数据编写controller

@Controller
public class IndexController {


    @Autowired
    CategoryService categoryService;

    @GetMapping({"/", "/index.html"})
    public String indexPage(Model model) {

        //TODO 查询所有的一级分类
        List<CategoryEntity> categoryEntities = categoryService.getLeve1Categorys();

        //视图解析器,加上前缀,加上后缀
        model.addAttribute("categorys",categoryEntities);
        return "index";
    }

    @ResponseBody
    @GetMapping("/index/catalog.json")
    public  Map<String, List<Catalog2Vo>> getCatalogJson(){
        Map<String, List<Catalog2Vo>> catalogJson=categoryService.getCatalogJson();
        return catalogJson;
    }

}

具体的业务逻辑实现 

/**
     * 查询所有一级分类
     *
     * @return
     */
    @Override
    public List<CategoryEntity> getLeve1Categorys() {
        List<CategoryEntity> categoryEntities = baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", 0));
        return categoryEntities;
    }

    /**
     * 查出所有分类
     *
     * @return
     */
    @Override
    public Map<String, List<Catalog2Vo>> getCatalogJson() {

        /**
         * 优化:将数据库查询的多次变为一次
         */

        List<CategoryEntity> selectList = baseMapper.selectList(null);

        //1.查出所有1级分类
        List<CategoryEntity> leve1Categorys = getParent_cid(selectList, 0L);

        //2.封装数据
        Map<String, List<Catalog2Vo>> parentCid = leve1Categorys.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
            //1.每一个一级分类
            List<CategoryEntity> categoryEntities = getParent_cid(selectList, v.getCatId());
            List<Catalog2Vo> catalog2Vos = null;
            if (categoryEntities != null) {
                catalog2Vos = categoryEntities.stream().map(l2 -> {
                    Catalog2Vo vo = new Catalog2Vo(v.getCatId().toString(), null, l2.getCatId().toString(), l2.getName());
                    //找二级分类的三级分类
                    List<CategoryEntity> categoryEntities3 = getParent_cid(selectList, l2.getCatId());
                    if (categoryEntities3 != null) {
                        List<Catalog2Vo.Catalog3Vo> collect = categoryEntities3.stream().map(l3 -> {
                            Catalog2Vo.Catalog3Vo catalog3Vo = new Catalog2Vo.Catalog3Vo(l2.getCatId().toString(), l3.getCatId().toString(), l3.getName());
                            return catalog3Vo;
                        }).collect(Collectors.toList());
                        vo.setCatalog3List(collect);
                    }
                    return vo;
                }).collect(Collectors.toList());
            }
            return catalog2Vos;
        }));

        return parentCid;
    }

4.使用nginx转发

  • 1.在nginx配置,路由到网关的负载均衡

 nginx代理给网关时,会丢失请求的host信息

  • 2.在网关中配置陆游规则 

域名路由,一定要放到最后!!

转发思路:

在host文件配置gulimall映射的虚拟机地址,虚拟机中安装了nginx,默认访问80端口,这个端口专门监听gulimall域名,然后nginx会代理到网关,(在代理到网关的过程中会丢失Host头),网关根据陆游规则,匹配到具体的服务

5.nginx动静分离 

1.所有的静态资源全都放到nginx下

2.所有:/static/**请求,都有nginx返回

5.1.文件上传到nginx 

在nginx的html目录下创建static目录,并将index文件全部上传到inginx的static目录下,并删除本地的index,并在前端页面都添加/static/

温馨提示:catalogLoader.js 文件中也要添加/static/不然 catalog.json渲染不上

5.2修改nginx配置 

6.优化 

在没有话之间我们每一次都要查数据库,导致性能不高,我们可以直接一次性查出所有,然后从缓存中获取指定的数据

/**
     * 查出所有分类
     *
     * @return
     */
    @Override
    public Map<String, List<Catalog2Vo>> getCatalogJson() {

        /**
         * 优化:将数据库查询的多次变为一次
         */

        List<CategoryEntity> selectList = baseMapper.selectList(null);

        //1.查出所有1级分类
        List<CategoryEntity> leve1Categorys = getParent_cid(selectList, 0L);

        //2.封装数据
        Map<String, List<Catalog2Vo>> parentCid = leve1Categorys.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
            //1.每一个一级分类
            List<CategoryEntity> categoryEntities = getParent_cid(selectList, v.getCatId());
            List<Catalog2Vo> catalog2Vos = null;
            if (categoryEntities != null) {
                catalog2Vos = categoryEntities.stream().map(l2 -> {
                    Catalog2Vo vo = new Catalog2Vo(v.getCatId().toString(), null, l2.getCatId().toString(), l2.getName());
                    //找二级分类的三级分类
                    List<CategoryEntity> categoryEntities3 = getParent_cid(selectList, l2.getCatId());
                    if (categoryEntities3 != null) {
                        List<Catalog2Vo.Catalog3Vo> collect = categoryEntities3.stream().map(l3 -> {
                            Catalog2Vo.Catalog3Vo catalog3Vo = new Catalog2Vo.Catalog3Vo(l2.getCatId().toString(), l3.getCatId().toString(), l3.getName());
                            return catalog3Vo;
                        }).collect(Collectors.toList());
                        vo.setCatalog3List(collect);
                    }
                    return vo;
                }).collect(Collectors.toList());
            }
            return catalog2Vos;
        }));

        return parentCid;
    }

这样就大大提高系统的吞吐量~ 

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

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

相关文章

基于51单片机的公交ic卡系统设计

目 录 摘 要 I Abstract II 引 言 1 1 总体方案设计 3 1.1 方案选择 3 1.2 硬件选择 3 1.3 系统工作原理 4 1.4 总体方案确定 5 2 系统硬件电路设计 6 2.1 主控模块电路设计 6 2.2 电源电路设计 8 2.3 显示电路模块设计 8 2.4 报警模块电路设计 10 2.5 RC522刷卡模块 10 2.6 独…

[网络安全] PKI

一、PKI 概述 名称; 公钥基础设施 (Public Key Facility) 作用: 通过加密技术和数字签名保证信息安全 组成: 公钥机密技术、数字证书、CA、RA 二、信息安全三要素 机密性&#xff1a;确保仅信息发收双方 能看懂信息 完整性&#xff1a; 确保信息发收完整&#xff0c;不被破坏 …

MUMU模拟器12连logcat的方法

大家好&#xff0c;我是阿赵。   在开发手机游戏的时候&#xff0c;在真机上会出现各种问题&#xff0c;在查询问题的时候&#xff0c;安卓手机需要用adb连接来连接手机看logcat输出分析问题。但由于连接手机比较麻烦&#xff0c;所以我都习惯在电脑用安卓模拟器来测试。   …

Chrome安装Axure插件

打开原型目录/resources/chrome&#xff0c;重命名axure-chrome-extension.crx&#xff0c;修改后缀为rar&#xff0c;axure-chrome-extension.rar 解压到axure-chrome-extension目录打开Chrome&#xff0c;更多工具->扩展程序&#xff0c;打开开发者模式&#xff0c;选择加…

Java 8

欢迎阅读这篇Java 8 教程。本教程旨在深入探讨Java 8的新特性&#xff0c;包括Lambda表达式、流API、新的日期时间API和更多内容。通过具体的示例和详细的解释&#xff0c;你将能够理解这些特性的用法&#xff0c;并将其应用到你的日常编程中。让我们开始吧。 一、默认方法和静…

KOA优化最近邻分类预测(matlab代码)

KOA-最近邻分类预测matlab代码 开普勒优化算法&#xff08;Kepler Optimization Algorithm&#xff0c;KOA&#xff09;是一种元启发式算法&#xff0c;灵感来源于开普勒的行星运动规律。该算法模拟行星在不同时间的位置和速度&#xff0c;每个行星代表一个候选解&#xff0c;…

【Python】新手入门(9):数值和序列

&#x1f40d;【Python】新手入门&#xff08;9&#xff09;&#xff1a;数值和序列 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…

今日份实验,剪了个头发,克隆了无数个自己,还是不断push

这个是今天用editor编辑器跑出来的数据&#xff0c;以下是用git跑出来的数据 下面是通过Xftp建立的会话。 用来跑一下以前的源代码 不过&#xff0c;noonxin.com, yuanjianchufang.com,网站好像不能访问&#xff0c;可能是域名出现问题&#xff0c;登录和注册也是存在问题的…

python爬虫(2)

继上节 查看数组维数 可以使用数组的ndim属性 代码示例如下&#xff1a; import numpy as np c np.random.randint(1,9,5) print(c.ndim) 结果如下&#xff1a; 当然这些也可以结合前面的各种用法来使用 1、选取数组元素 &#xff08;1&#xff09;一维数组的元素…

Ubuntu整系统迁移到另一个硬盘中

以ubuntu20.04为例&#xff0c;之前使用的是1T的移动硬盘&#xff0c;每次进入后性能不太稳定&#xff0c;所以最近买了块1T的固态硬盘给我的笔记本装上了&#xff0c;但是如果重新进行各种软件安装及环境配置就太麻烦了&#xff0c;所以采用了系统迁移 1.首先制作一个Ubuntu系…

基于springboot精品在线试题库系统论文

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的精品在线试题库系…

10、Linux项目部署-WAR包、JAR包

一、WAR包 第一步&#xff0c;把War包解压&#xff0c;再重新打包成Zip。 第二步&#xff0c;在Linux里创建一个项目文件夹&#xff0c;将Zip的内容解压在这个文件夹内。 例如&#xff0c;创建的项目文件夹是/usr/local/software/project1 第三步&#xff0c;修改Tomcat配置…

二百二十六、Linux——shell脚本查看今天日期、昨天日期、30天前日期、1月前日期

一、目的 由于磁盘资源有限&#xff0c;因为对原始数据的保存有事件限制&#xff0c;因为对于超过一定期限的数据文件则需要删除&#xff0c;要实现定期删除则第一步就是查看日期时间 二、在Linux中创建shell脚本 #! /bin/bash source /etc/profile nowdatedate --date0 da…

2024年腾讯云学生服务器活动详细说明、学生机购买流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

vite+vue3使用UEditorPlus ,后端PHP

vitevue3使用UEditorPlus 百度富文本编辑器是目前所有编辑器中功能最丰富的&#xff0c;但长时间不进行维护了。 之前写了一篇使用UEditor的教程&#xff0c;最近发现一个UEditorPlus&#xff0c;总结一下如何使用 什么是UEditorPlus 基于 UEditor 二次开发的富文本编辑器&…

JavaEE进阶(14)Linux基本使用和程序部署(博客系统部署)

接上次博客&#xff1a;JavaEE进阶&#xff08;13&#xff09;案例综合练习——博客系统-CSDN博客 目录 程序配置文件修改和打包 构建项目并打包 分平台配置 数据准备 上传jar包到云服务器并运行 开放端口号 验证程序 如何查看日志得到报错信息 常见问题 关于Linux基…

Polar 写shell

Polar 写shell 直接给了源码 还是没啥好说的&#xff0c;考点是die()死亡函数绕过之不同变量 **绕过原理&#xff1a; **通过base64解密或rot13解密使"<?php exit();"变为乱码&#xff0c;而传入的$content为base64编码&#xff0c;解码后为正常shell语句。通过…

Java数据结构-----List的介绍

目录 一、什么是List 二、List的常用方法 三、List的使用 一、什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection&#xff0c;其中&#xff0c;Iterable和Collection都是接口。 站在数据结构的角度来看&#xff0c;List就是一个线性表&#x…

Java定时调度:Timer类和TimerTask类

Java提供了多种方式来执行定时任务&#xff0c;其中使用Timer类和TimerTask类是一种简单而有效的方法。这篇教程将介绍如何使用Java的Timer类和TimerTask类来实现定时调度。 1. Timer类 Timer类用于安排指定的任务按指定的时间执行。它可以执行一次性任务&#xff0c;也可以按…

草稿111

peekmessage&#xff08;用于接受信息&#xff09; exmessage&#xff08;专门用于鼠标操作&#xff09; #include<graphics.h> #include<string> #include<vector> using namespace std; const int WINDOW_WIDTH 1280; const int WINDOW_HEIGHT 720;//封装…