IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Day410&411.商品系统首页 -谷粒商城 -> 正文阅读

[Java知识库]Day410&411.商品系统首页 -谷粒商城

二、商城系统首页

不使用前后端分离开发了,管理后台用vue nginx发给网关集群,网关再路由到微服务

静态资源放到nginx中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q6oWW2aH-1633360430231)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004141235769.png)]

  • 依赖

导入thymeleaf依赖、热部署依赖devtools使页面实时生效

achangmall-product/pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

html\首页资源\index放到achangmall-product下的static文件夹

把index.html放到templates中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DzhvIwVW-1633360430233)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004141636988.png)]

  • 关闭thymeleaf缓存,方便开发实时看到更新
  thymeleaf:
    cache: false
    suffix: .html
    prefix: classpath:/templates/
  • web开发放到web包下,原来的controller是前后分离对接手机等访问的,所以可以改成app,对接app应用

com.achang.achangmall.product.web【存放专门用于页面跳转的controller】

com.achang.achangmall.product.app【存放前后端奶粉里的rest风格接口controller】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tPsk2HYj-1633360430235)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004142800547.png)]

  • 渲染一级分类菜单 刚导入index.html时,里面的分类菜单都是写死的,我们要访问数据库拿到放到model中,然后在页面foreach填入
@Controller
public class IndexController {

    @Autowired
    private CategoryService categoryService;

    //进入商品首页
    @GetMapping({"/","/index.html"})
    public String indexPage(Model model){
        //查出一级分类
        List<CategoryEntity> categoryEntityList = categoryService.getLevel1Categorys();
		
        //放入域中
        model.addAttribute("categorys",categoryEntityList);
        return "index";
    }

}
@Override
public List<CategoryEntity> getLevel1Categorys() {
    //查询一级分类
    return baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("cat_level",1));
}
  • 页面引入thymeleft名称空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBQnhfHR-1633360430238)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004144731515.png)]

xmlns:th="http://www.thymeleaf.org"
  • 因为我们上面引用了热部署的pom

更新页面后,在当前页面按Ctrl+Shift+F9,进行刷新热部署页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XSOh43W6-1633360430242)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004145424575.png)]

  • 页面遍历菜单数据
<li th:each="category : ${categorys}">
    <a href="#" class="header_main_left_a" th:attr="ctg-data=${category.catId}"><b th:text="${category.name}">家用电器111</b></a>
</li>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05kYVe1v-1633360430244)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004150003768.png)]

  • 渲染三级分类菜单

com.achang.achangmall.product.vo.Catelog2Vo

//二级分类vo
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Catelog2Vo {
    private String catalog1Id; //一级父分类id
    private List<Catelog3Vo> catalog3List; //三级子分类
    private String id;//二级分类id
    private String name;

    //三级分类vo 静态内部类
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public static class Catelog3Vo{
        private String catalog2Id;//二级分类id
        private String id;//三级分类id
        private String name;
    }
}

com.achang.achangmall.product.web.IndexController

    //index/catalog.json
    @ResponseBody
    @GetMapping("/index/catalog.json")
    public Map<Long, List<Catelog2Vo>>  getCatalogJson(){
        Map<Long, List<Catelog2Vo>>  resultMap = categoryService.getCatelogJson();
        return resultMap;
    }

com.achang.achangmall.product.service.impl.CategoryServiceImpl

@Override
public Map<Long, List<Catelog2Vo>>  getCatelogJson() {
    //查出所有分类
    List<CategoryEntity> level1Categorys = getLevel1Categorys();
    //分装数据
    Map<Long, List<Catelog2Vo>> resultMap = level1Categorys.stream().collect(Collectors.toMap(CategoryEntity::getCatId, v -> {
        //每一个的一级分类,查到这个一级分类的二级分类
        List<CategoryEntity> list = baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", v.getCatId()));
        List<Catelog2Vo> catelog2VoList = null;
        if (!StringUtils.isEmpty(list)) {
            catelog2VoList = list.stream().map(item -> {
                Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(), null, item.getCatId().toString(), item.getName());
                //封装二级分类的三级分类
                List<CategoryEntity> entityList = baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", item.getCatId()));
                if (!StringUtils.isEmpty(entityList)){
                    List<Catelog2Vo.Catelog3Vo> catelog3Vos = entityList.stream().map(m -> {
                        Catelog2Vo.Catelog3Vo catelog3Vo = new Catelog2Vo.Catelog3Vo(item.getCatId().toString(),m.getCatId().toString(),m.getName());
                        return catelog3Vo;
                    }).collect(Collectors.toList());
                    catelog2Vo.setCatalog3List(catelog3Vos);
                }


                return catelog2Vo;
            }).collect(Collectors.toList());
            return catelog2VoList;
        }
        return catelog2VoList;
    }));

    return resultMap;

}

1、Nginx配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0qtVtoX-1633360430245)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004215328514.png)]

  • 新增本地DNS映射

C:\Windows\System32\drivers\etc\hosts

192.168.109.101 achangmall.com

测试访问之前的9200端口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3nxKHKGr-1633360430247)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004220252978.png)]

  • nginx配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42kIYxX1-1633360430249)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004222126644.png)]

	server {
    listen       80;
    server_name  achangmall.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        #又转回到本机
        proxy_pass http://192.168.153.1:10000;
    }

		#error_page  404              /404.html;

		# redirect server error pages to the static page /50x.html
		#
		error_page   500 502 503 504  /50x.html;
		location = /50x.html {
			root   /usr/share/nginx/html;
		}

		# proxy the PHP scripts to Apache listening on 127.0.0.1:80
		#
		#location ~ \.php$ {
		#    proxy_pass   http://127.0.0.1;
		#}

		# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
		#
		#location ~ \.php$ {
		#    root           html;
		#    fastcgi_pass   127.0.0.1:9000;
		#    fastcgi_index  index.php;
		#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
		#    include        fastcgi_params;
		#}

		# deny access to .htaccess files, if Apache's document root
		# concurs with nginx's one
		#
		#location ~ /\.ht {
		#    deny  all;
		#}
	}
  • 测试访问http://achangmall.com/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fDSzgkRR-1633360430251)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004222946343.png)]


2、Nginx+网关

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qHdTCuEE-1633360430252)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004223900250.png)]

  • nginx配置
upstream achangmall{
       server 192.168.153.1:88;
    }

location / {
        #又转回到本机
        # proxy_pass http://192.168.153.1:10000;
       proxy_pass http://achangmall;
    }
  • 但是我们测试访问http://achangmall.com/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfNPN1iB-1633360430254)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004224743696.png)]

nginx转发会丢失掉host中的信息

  • 设置nginx在转发的时候保留host信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CknwcXiQ-1633360430255)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004224955016.png)]

proxy_set_header Host $host;
  • 再次测试访问,http://achangmall.com,测试成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jS14NIga-1633360430257)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004225038215.png)]

  • 将nginx路由的网关配置放置在yaml配置最后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-163I3Utr-1633360430259)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004225334138.png)]

  • 最终转发流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cSAwEuiH-1633360430260)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211004231101010.png)]


3、 压力测试

  • Jmeter下载:https://jmeter.apache.org/download_jmeter.cgi

创建测试计划,添加线程组

线程数==用户

ramp-up 多长时间内发送完

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3Oa150X-1633427287147)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211005132510370.png)]

添加-取样器-HTTP请求

添加-监听器-查看结果树

添加-监听器-汇总报告

  • 优化

SQL耗时越小越好,一般情况下微秒级别

命中率越高越好,一般情况下不能低于95%

锁等待次数越低越好,等待时间越短越好

中间件越多,性能损失越大,大多都损失在网络交互

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ugk8WPO9-1633427287150)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211005132551401.png)]


4、Nginx动静分离

由于动态资源和静态资源目前都处于服务端,所以为了减轻服务器压力,我们将 js、css、img等静态资源放置在Nginx端,以减轻服务器压力

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6l3uixHC-1633427287153)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211005150759814.png)]

  • 项目静态资源搬家

静态文件上传到 mydata/nginx/html/static/index/css,这种格式

mkdir static

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AJAH9Krr-1633427287155)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211005151412797.png)]

修改index.html的静态资源路径,加上static前缀src="/static/index/img/img_09.png"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h4dibUij-1633427287157)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211005152809889.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PGPco1Qb-1633427287159)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211005152853535.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXktd7OB-1633427287162)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211005152936333.png)]

等等等,给index.html页面中的路径都加上/static/

修改/mydata/nginx/conf/conf.d/gulimall.conf

如果遇到有/static为前缀的请求,转发至html文件夹

 location /static/ {
     root   /usr/share/nginx/html;
 }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ogVzG5mE-1633427287164)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211005164343874.png)]

再次测试访问achangmall.com,成功将静态资源由nginx返回

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1Q45Hbb-1633427287166)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20211005164413288.png)]


5、优化三级分类查询

之前是循环查询数据库,导致有多少跟数据库进行io交互;

这里我们减少数据库的交互,一次性查询所有的数据,减少io资源消耗

com.achang.achangmall.product.service.impl.CategoryServiceImpl

@Override
public Map<Long, List<Catelog2Vo>>  getCatelogJson() {

    //将数据库的多次交互,转为一次,一次性查询所有数据
    List<CategoryEntity> allList = baseMapper.selectList(null);

    //查出所有分类
    List<CategoryEntity> level1Categorys = getParent_cid(allList,0L);
    //分装数据
    Map<Long, List<Catelog2Vo>> resultMap = level1Categorys.stream().collect(Collectors.toMap(CategoryEntity::getCatId, v -> {
        //每一个的一级分类,查到这个一级分类的二级分类
        List<CategoryEntity> list = getParent_cid(allList,v.getCatId());
        List<Catelog2Vo> catelog2VoList = null;
        if (!StringUtils.isEmpty(list)) {
            catelog2VoList = list.stream().map(item -> {
                Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(), null, item.getCatId().toString(), item.getName());
                //封装二级分类的三级分类
                List<CategoryEntity> entityList = getParent_cid(allList,item.getCatId());
                if (!StringUtils.isEmpty(entityList)){
                    List<Catelog2Vo.Catelog3Vo> catelog3Vos = entityList.stream().map(m -> {
                        Catelog2Vo.Catelog3Vo catelog3Vo = new Catelog2Vo.Catelog3Vo(item.getCatId().toString(),m.getCatId().toString(),m.getName());
                        return catelog3Vo;
                    }).collect(Collectors.toList());
                    catelog2Vo.setCatalog3List(catelog3Vos);
                }


                return catelog2Vo;
            }).collect(Collectors.toList());
            return catelog2VoList;
        }
        return catelog2VoList;
    }));

    return resultMap;

}

private List<CategoryEntity> getParent_cid(List<CategoryEntity> allList,Long parent_cid) {
    List<CategoryEntity> collect = allList.stream().filter(item -> {
        return item.getParentCid().equals(parent_cid);
    }).collect(Collectors.toList());
    return collect;
    //        return baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", v.getCatId()));
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:04:30  更:2021-10-06 12:04:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:57:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码