商城业务 首页

整合thymeleaf 渲染首页
在这里插入图片描述

在这里插入图片描述

模板引擎:

  1. thymeleaf-starter: 关键缓存
  2. 静态资源都放在static 文件夹下就可以按照路径直接访问
  3. 页面都放在templates 下,直接访问
    SpringBoot 访问项目时默认会找Index

关闭缓存
在这里插入图片描述

把html 页面放到product 的templates 中,然后访问product 的端口号
在这里插入图片描述

编写功能:
1.当访问http://localhost:10001/ 和http://localhost:10001/index.html 时都能访问到首页
2.当鼠标指向商品列表时,能根据鼠标指向的根菜单,查出该根菜单对应的二级菜单和三级菜单,并进行显示。

约定:页面的跳转功能(处理页面的Controller 放在web 中),app 是专门负责处理后端数据传输的Controller
在这里插入图片描述

因为前端是由thymeleaf 进行生成的,那么就要按照它的语言规则来(把它当成是一个独立语言就可以了,它有自己的语法)。要使用它就先引用它的名称空间
在这里插入图片描述
接下来就能使用它的语法。

想要修改html 数据然后不重启项目进行数据更新:
在这里插入图片描述
此时一定要关闭themyleaf 的缓存功能
在这里插入图片描述

然后修改完页面以后,按下Ctrl + Shift + F9(对当前页面重新编译) 或者Ctrl + F9 对整个项目进行重新编译。
然后刷新页面就可以了。

IndexController:处理首页的Controller
在这里插入图片描述
CategoryServiceImpl:
在这里插入图片描述

在这里插入图片描述

编写功能:当鼠标指到一级菜单,显示出它的二级和三级菜单
在这里插入图片描述

那么这动态生成的菜单一定会有JS 参与的,所以去到JS 的包中去找触发该效果的函数。
可以看到这段函数是从json包下的catalog.json 中获取的数据
在这里插入图片描述

这里的数据是写死的,而我们的数据是动态生成的。
在这里插入图片描述

这些数据的结构是这样的,根据这些结构构造出一个vo 对象。
在这里插入图片描述

Controller:
在这里插入图片描述
ServiceImpl:

  @Override
    public Map<String, List<Catelog2Vo>> getCatalogJson() {
        //1.查出所有1级分类
        List<CategoryEntity> level1Categories = getLevel1Categories();

        //2.封装数据
        Map<String, List<Catelog2Vo>> parent_cid = level1Categories.stream().collect(Collectors.toMap(k -> {
            return k.getCatId().toString();
        }, v -> {
            //1. 每一个的一级分类,查到属于这个一级分类的二级分类
            List<CategoryEntity> categoryEntities = baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", v.getCatId()));

            List<Catelog2Vo> catelog2Vos = null;
            //要把categoryEntities 这个对象封装成我们编写的VO 对象:Catelog2Vo
            if (categoryEntities != null) {
                catelog2Vos = categoryEntities.stream().map(l2 -> {
                    Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(), null, l2.getCatId().toString(), l2.getName());

                    //根据2 级分类查找3 级分类数据
                    List<CategoryEntity> level3Catelog = baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", l2.getCatId()));

                    if (level3Catelog != null){
                        //将level3Catelog 封装成Catelog3Vo
                        List<Catelog2Vo.Cateloa3Vo> cateloa3Vos = level3Catelog.stream().map(l3 -> {
                            Catelog2Vo.Cateloa3Vo cateloa3Vo = new Catelog2Vo.Cateloa3Vo(l2.getCatId().toString(), l3.getCatId().toString(), l3.getName());

                            return cateloa3Vo;
                        }).collect(Collectors.toList());
                        catelog2Vo.setCatalog3List(cateloa3Vos);
                    }


                    return catelog2Vo;
                }).collect(Collectors.toList());
            }
            return catelog2Vos;
        }));
        return parent_cid;
    }

搭建域名访问环境:就是访问首页时不是通过http://localhost:10001/ 来访问的,而是通过gulimall.com 进行访问。
在这里插入图片描述

正向与反向是对于自己的电脑来说的。
正向代理:比如我想访问谷歌访问不上,可以通过搭建一台服务器代理进行访问。我们通过请求该代理服务器来请求谷歌,然后返回谷歌访问页面。(即该我们搭建的该服务器是帮我们电脑进行上网的,是正向代理。)
反向代理:在搭建集群环境的时候非常需要。比如某人想访问谷粒商城,谷粒商城有后台集群,后台集群的服务器都在内网部署(不可能把服务器的外网ip 暴露给外界,这样容易引起攻击)。而为了找到这些内网的集群服务器,可以在他们前面前置一个服务器,这个服务器就叫反向代理。(Nginx 是拥有公网ip,即大家都可以进行访问的。),外界访问谷粒商城,就要通过nginx 来将请求转给内网的集群服务器,这个nginx 服务器也是搭建在整个服务集群中。
正向代理,是所访问的地址(比如谷歌)是没有被屏蔽的,只是我们访问不了而已。
反向代理,使我们的服务集群是屏蔽的,只能通过nginx 来发送请求转交给服务后台集群。
在这里插入图片描述

我们虽然没有买域名,但可以通过Windiows 的host 文件中配置上域名对应哪个ip 地址。

nginx 中nginx.conf 的文件结构
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值