商城学习02(踏坑)

重新跑一下第一阶段的Java后台代码

14号

任务目标:重点:浏览器的跨域问题(Spring注解@CrossOrigin第二:jsonP)

  1. 浏览器的跨域问题报错

    在这里插入图片描述

  2. 解决方案:

  • jsonP原理:通过

resp.setHeader("Access-Control-Allow-Origin", "*");
  • protal门户
  • rest服务层

过程步骤:

*wps文档(第五天)

  1. 前端接收形式,商品分类页

在这里插入图片描述

踏过的坑(KENG):

==*值得条条浏览!!!

  1. 首先就给我来个首页访问404(提示静态资源未配置)配大总管的时候少个“/”…

  2. (只要在同一个地址栏刷新就这样:应该是刷新的时候发起了什么请求(js里面的images也都填上了static))一堆什么鬼,死循环是浏览器一直在访问请求上次的,没关(为什么换了一个端口(8082)就好了)

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  3. resources: static-locations: classpath:/static/)放到webapp和放到resources目录下(springboot下默认就是)路径不同

    (classpath)放到webapp下不用带此路径前缀

    在这里插入图片描述

  4. 改了一个工程的包名,好几个模块全都给我改了。。。。应该是点到了重构包名

  5. (重新又搞了个工程(这里还有一个办法就是idea存在一个回退功能)。。。。终于好了。。。)

  6. 重新开始!!!!。。。。。

  7. 粘贴的时候yml文件的结构搞乱了(这种错误真刺激。。。)

  8. 明明在代码中已经删除1174,那一行,为什么浏览器中还有??

    • 现象如下:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

解决如下:这个是浏览器缓存的问题

第一种方案:给引用的这个地方随便加一个参数

在这里插入图片描述

第二种方案:重新打开一个窗口

  1. 查询调用方法的问题((application.yml)配置文件未扫描mapper文件低级错误太惨了。。。这个太伤了,主要还是错误信息没看懂)

    在这里插入图片描述

  2. test写完项目重新测试出错(好像@SpringbootTest只能有一个?(budui)还有一种情况加个注解(指定启动类))

    在这里插入图片描述

  3. 启动类和test类的位置在包下面(上有)

15号

任务目标:重点:Java后台网络请求库-httpClient、okhttp

  1. portal-rest-CMS (封装的httpClient工具类)
  2. 首页门户必要的展示(轮播图)(大广告位)
  3. 三者关系通过网络请求库联系(portal-(httpClient)-rest )
  4. CMS负责写数据portal和rest配合使用数据

过程步骤:

*wps文档(第六天)

  • 删除tree
//两种情况(子节点全都没有 父节点是否保留(保留,不保留))
    @Override
    public TaotaoResult deleteNodeByIdAndParentId(Long id, Long parentId) {

        TbContentCategoryExample condition = new TbContentCategoryExample();

        //这里:直接删父节点就全删了、删子节点就保留父节点并且is_parent修改为false
        //deleteByPrimaryKey()根据id删除\deleteByExample()根据条件删
        TbContentCategory tbContentCategory = tbContentCategoryMapper.selectByPrimaryKey(id);

        Boolean isParent = tbContentCategory.getIsParent();

        //第一
        if (isParent){
            //条件1
        condition.createCriteria().andParentIdEqualTo(tbContentCategory.getId());
            //是父节点,删全部子节点
            tbContentCategoryMapper.deleteByExample(condition);
            //父节点也要删除啊
            tbContentCategoryMapper.deleteByPrimaryKey(id);
        }else {
            //第二

            //条件2注意小细节
            condition.createCriteria().andParentIdEqualTo(tbContentCategory.getParentId());
            tbContentCategoryMapper.deleteByPrimaryKey(id);
            List<TbContentCategory> tbContentCategories = tbContentCategoryMapper.selectByExample(condition);
            if (tbContentCategories.size() > 0){
                return TaotaoResult.ok();
            }else {
            //第三
                //大于0(代表我删了之后它就没有子节点了)就把此父节点变成子节点
                TbContentCategory parentNode = new TbContentCategory();
                parentNode.setIsParent(false);
                parentNode.setId(parentId);
                tbContentCategoryMapper.updateByPrimaryKeySelective(parentNode);
                return TaotaoResult.ok();
            }
        }

        return TaotaoResult.ok();
    }
  • 数据库表结构

在这里插入图片描述

踏过的坑:(Interesting)

==*值得条条浏览!!!

  1. 手动修改逆向工程生成的代码步骤(这是一个遗留的问题)

    • https://xyzghio.xyz/simpleParameterInMyBatis/
    • https://www.kancloud.cn/wizardforcel/java-opensource-doc/153024
    • https://woodwhales.github.io/2018/10/29/015/
    • 逆向工程生成的代码mapper.xml文件详解

    在这里插入图片描述

  2. CMS添加tree的时候传的是parentId,重命名的时候传的是id,删除的时候两个参数都有,随便删(但是删除父节点的时候传的参数只有id。。。。。。太刺激了!!!)

    //第四还有一种情况就是父节点下面还有父节点页面虽然没了,但是数据库会有变成了垃圾数据(就像上图最后一条数据)(不搞了)

    在这里插入图片描述

  3. 后台管理的门户和rest写到了一起、而展示给用户的使用portal和rest两个工程实现

  4. 保存后的弹窗(细节问题)两个编辑保存提示弹出框对比

    在这里插入图片描述在这里插入图片描述

  5. 服务层发布服务????(wps啥意思)portal-rest-CMS应该是(搞定了:是通过httpClient后台网络请求库发起一个地址请求传到rest服务层。)

  6. 首页跳转(这个挺神奇的!!!!(默认是/))
    在这里插入图片描述

16号

任务目标:重点:Redis缓存:以及Java后台的应用

  • 添加缓存逻辑的原则:缓存逻辑不能影响正常的业务逻辑执行。

**细节:**alt + 7,查看源码目录

  1. SSH(远程连接工具)

  2. GG:跳到文件末尾| /加你要搜索的内容 +enter定位到查到的位置 |冒号:加行号137(直接跳)

    redis 后台启动(要修改redis.conf文件):redis-server /usr/local/bin/redis.conf

  3. ctrl + c:停止当前进程(优雅的停止:exit)

  4. 批量删除

     rm -f ./*/nodes-*.conf ./*/appendonly.aof ./*/dump.rdb
    
  5. 停止redis-server——:redis-cli -a pass shutdown

  6. 启动:redis-server /opt/redis-stable/redis.conf

    **关闭:**redis-cli shutdown 或者 kill redis进程的pid

  7. 客户端连接Redis

    ./redis-cli -c -h 127.0.0.1 -p 7001 -a cxp123456.
    
  8. redis集群:客户端–PING------PONG

    1. 给文件加权限 (厉害!!!)

    在这里插入图片描述

    chmod u=rwx,g=rx,o=rx start_redis_cluster.sh 
    

过程步骤:

*wps第七天和redis课堂笔记Markdown

踏过的坑:(amusing)

==*值得条条浏览!!!

开始一天的踏坑之路。。。!!!

  1. [ERR] Node 127.0.0.1:7001 NOAUTH Authentication required.(创建集群命令时:如果加了密码,那么创建集群时就需要加-a cxp123参数)

    第一次打错了某个单词会报错为:Unrecognized option or bad number of args for: ‘–cluster-relicas’

    redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 \
    127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 \
    --cluster-replicas 1
    
  2. Linux中ctrl + p提示、命令模式下Ctrl + y + p :复制一行到下一行

  3. 如果是用apt-get或者yum install安装的redis,可以直接通过下面的命令停止/启动/重启redis

    /etc/init.d/redis-server stop
    /etc/init.d/redis-server start
    /etc/init.d/redis-server restart

    如果是通过源码安装的redis,则可以通过redis的客户端程序redis-cli的shutdown命令来重启redis

    1.redis关闭
    redis-cli -h 127.0.0.1 -p 6379 shutdown

    2.redis启动
    redis-server

    如果上述方式都没有成功停止redis,则可以使用终极武器 kill -9

  4. Linux上修改Redis集群的IP地址(改了很多不知道是否有效!)

    错误日志:>> Creating cluster [ERR] Node 192.168.15.102:6000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

    处理办法:

    解决方法:

    1)、停止所有redis进程,将需要新增的节点下aof、rdb等本地备份文件删除;

    2)、同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文件,一般为nodes.conf;

    3)、再次添加新节点如果还是报错,则登录新Node,./redis-cli–h x –p对数据库进行清除:

    192.168.15.102:6000> flushdb #清空当前数据库

    redis 127.0.0.1:6379> FLUSHDB 
    

    启动redis进程重新执行集群新建命令

    ./redis-trib.rb create –replicas 1 192.168.15.102:6000 192.168.15.102:6001 192.168.15.102:6002 192.168.15.102:6003 192.168.15.102:6004 192.168.15.102:6005

  5. 客户端连接集群时还需要指定端口吗?

    终于更换成功:

    在这里插入图片描述

    第二张图片(令人激动的图片)

    在这里插入图片描述

  6. 客户端以集群方式登陆:

    在这里插入图片描述

然而,但是目录层级不一样:(哎!! 理解不深刻,啊!)

在这里插入图片描述

  1. 客户端连接上redis的集群后输入命令 cluster 时 需要身份验证:(?)

  2. 多模块项目上运行Junit5测试用例时,No tests were found : 测试的包问题(Junit4和Junit5)

  3. 一直报错,连不上我配的地址(虚拟机的防火墙未关闭彻底(redis课堂笔记))

  4. 又来个错误

  5. Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: MOVED 10648 10.10.13.105:7002(弹尽粮绝)(下方已搞定!)

  6. 在taotao-rest 清空redis缓存

17号

Ruby搭建Redis(新知识)(老版本搭建集群的时候用到的一个工具):现在已经不用此环境搭建了

在这里插入图片描述

18号

任务重点:完善redis

  1. 首页打广告页添加缓存(搞定)
  2. 同步缓存(CMS更改数据库成功的时候——告诉Rest工程去清理Redis缓存——Portal通过Redis的展示改变)

过程步骤:

*wps第七天

  1. StringRedisTemplate 和 RedisTemplate 区别、

    两者之间的区别主要在于他们使用的序列化类

  • RedisTemplate使用的是 JdkSerializationRedisSerializer
  • StringRedisTemplate使用的是 StringRedisSerializer
  • 当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可,
  • 但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是
    更好的选择。
  1. 课堂问题

    • 主动和被动模式(ftp):https://blog.csdn.net/zhaoshuliok/article/details/66972095
    • Linux中修改配置文件在默认安装的目录下修改(/usr/local/)
    • CMS内容管理对应的树管理实现方法,(递归查询)
    • 禁用redis的RDB或者AOF模式,修改配置文件(例:save “ ”其他的都注释掉(实现了RDB 的禁用))
    • js表单的input数据在前端可以提前拼成Object类型、然后通过ajax请求传到后台去!
    1. < 第一种方式:表单序列化
      $("#contentAddForm").serialize()
      <!--第二种:JSON格式-->
      JSON.stringify(users);
      <T
      document.getElementById("query").submit();//提交到后台
      
    
    
    
    

踏过的坑:(KENG)

==*值得条条浏览!!!

  1. CLUSTERDOWN Hash slot not served(重新清理下,搞了一下,好了)

  2. MOVED 5798 10.10.13.105:7002(换个服务端好了-从lettuce客户端(Springboot默认的客户端依赖)换成了jedis客户端(需要另加依赖))

    这俩问题搜了半天,还是从根上干掉了它们。。。。

  3. 使用mybatis但是配置文件里面又是没有配置(第二次犯了这个错误)

    在这里插入图片描述

  4. Spring boot会将对象先序列化再存入 Redis(这个问题)在类上 implements Serializable

  5. 细节:(kengnn )

    //list不能这样判断为空
       if (tbContentListFromCache == null){
       }
    //正确的
    	if (tbContentListFromCache.size() < 1){
       }
    
    
  6. redis的配置类(网上找的那个(有bug,不建议使用))

    @Configuration
    public class RedisConfiguration {
    
        /**
         * 设置序列化策略: Key用默认的String序列化,Value用Jackson序列化成JSON
         * @param
         * @return
         */
        @Bean
        public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer(){
            Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
            // 此项必须配置,否则会报java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX
            objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
            objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
            return jackson2JsonRedisSerializer;
        }
        
    }
    
    

    在这里插入图片描述

    君哥写的(有时间研究下,这是一个遗留的问题二:(用这个不会出错))

    @Configuration
    public class RedisConfiguration {
    
        /**
         * 设置序列化策略: Key用默认的String序列化,Value用Jackson序列化成JSON
         * @param redisConnectionFactory
         * @return
         */
        @Bean
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            redisTemplate.setKeySerializer(new StringRedisSerializer());
    
            // 修改Value的序列化策略:由默认的JdkSerializationRedisSerializer改成Jackson序列化
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.disableDefaultTyping();
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
    
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    }
    
    

  1. 缓存:(后台CMS更改数据后—(同样使用Java后台网络请求工具httpClient)—告诉rest层该清缓存了——portal层展示)

Author : 陈祥朋

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值