zoukankan      html  css  js  c++  java
  • 每周总结:2020年01月第1周

    2020-01-02

      1.''想要对Web资源进行保护,最好的办法莫过于Filter,想要对方法调用进行保护,最好的办法莫过于AOP" --出自某篇博客

        个人理解:

        FIlter 是系统级别的拦截过滤 粒度粗

        AOP是方法级别的拦截 细粒度

      2.跨域问题:

        目前前后端分离的项目,前端部署的服务器与后端项目部署的服务器的IP不同,难免会产生跨域问题,本质原因是浏览器的同源策略

        解决方式:

          1.JSONP(在代码中加入<Script>标签) 只支持Get请求

          2.使用代理,先访问前端的服务器,然后转发到后端

          3.CORS:W3C的协议, 将请求分为两类:简单请求和非简单请求,非简单请求会在请求头添加允许跨域同时发一个Optiona请求,确认是否发送成功

       3.Idea插件

        Idea 驼峰转换插件 CamelCase,将下划线转换为驼峰形式的代码,适合场景:数据库字段转换为Java对象的属性

        插件名

        

        快捷键:alt+shift+U

        备注:Idea自带的大小写转换的快捷键是Ctrl+Shift+U,并不能转换驼峰形式

    2020-01-04

        推荐几本相关的理财书籍:

          (财富) 穷爸爸富爸爸,财务自由之路;

          (实操) 聪明的投资者,指数基金定投指南

          (思想) 穷查理宝典

    2020-01-04

        Go语言基础学习

    2020-01-07

        Java8 CompletableFuture API学习

        简化异步调用的使用,支持函数式编程

        例如:

    public CustomerTargetTrendVO customerTargetTrend(TargetTrendDTO targetTrendDTO) throws Exception {
            //构造查询条件
            TrendQueryDTO queryDTO = buildTrendQueryDTO(targetTrendDTO);
            if (ObjectUtils.isEmpty(queryDTO)) {
                return new CustomerTargetTrendVO();
            }
            log.info("TrendQueryDTO : [{}]", queryDTO);
            //下单客户数趋势
            CompletableFuture<List<CustomerTargetTrendVO.OrdedCustomerItem>> ordedCustomerFuture =
                    CompletableFuture.supplyAsync(() -> dmRptWgysEnterpriseSumMapper.countOrdCustomerTrend(queryDTO))
                            .thenApply(x -> JSON.parseArray(JSON.toJSONString(x), CustomerTargetTrendVO.OrdedCustomerItem.class));
    
            //下单实际采购量趋势
            CompletableFuture<List<CustomerTargetTrendVO.PurchaseAreaItem>> purchaseAreaFuture =
                    CompletableFuture.supplyAsync(() -> dmRptWgysCustomerOrderDetailMapper.countPurchaseAreaTrend(queryDTO))
                            .thenApply(x -> JSON.parseArray(JSON.toJSONString(x), CustomerTargetTrendVO.PurchaseAreaItem.class));
    
            //等待子线程任务完成
            CompletableFuture.allOf(ordedCustomerFuture, purchaseAreaFuture).join();
    
            //数据组装
            List<CustomerTargetTrendVO.OrdedCustomerItem> dbOrdedCustomerList = ordedCustomerFuture.get();
            List<CustomerTargetTrendVO.PurchaseAreaItem> purchaseAreaList = purchaseAreaFuture.get();
    
            return CustomerTargetTrendVO.builder().ordedCustomerList(dbOrdedCustomerList).purchaseAreaList(purchaseAreaList).build();
        }

    2020-01-07

        插件:

        Idea插件 Ace Jump

        可以任意跳转至当前页面的任意位置 alt+K 或者alt+;

    2020-01-09

        项目中数据处理的问题

        Java后端返回给前端的数值太大(如Long类型或者BigDecimal类型),导致前端显示数据时精度丢失的问题,

        解决方式:

          后端将以上数据转换为字符串返回给前端,可以使用统一的序列化器

        

    @Configuration
    public class WebMvcConfig extends WebMvcConfigurerAdapter {
    
    
        /**
         * Date格式化字符串
         */
        private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        /**
         * DateTime格式化字符串
         */
        private static final DateTimeFormatter DATETIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        /**
         * Time格式化字符串
         */
        private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss");
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            super.configureMessageConverters(converters);
            final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
            ObjectMapper objectMapper = converter.getObjectMapper();
    
            // 反序列化失败
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
            // long 转换为字符串
            SimpleModule simpleModule = new SimpleModule();
            simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
            simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
            simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
    
            // 浮点型使用字符串
            simpleModule.addSerializer(Double.class, ToStringSerializer.instance);
            simpleModule.addSerializer(Double.TYPE, ToStringSerializer.instance);
            simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
    
            // java8 时间格式化
            simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DATETIME_FORMAT));
            simpleModule.addSerializer(LocalDate.class, new LocalDateSerializer(DATE_FORMAT));
            simpleModule.addSerializer(LocalTime.class, new LocalTimeSerializer(TIME_FORMAT));
    
            objectMapper.registerModule(simpleModule);
    
            // 为mapper注册一个带有SerializerModifier的Factory,处理null值
            objectMapper.setSerializerFactory(objectMapper.getSerializerFactory()
                    .withSerializerModifier(new CustomizeBeanSerializerModifier()));
    
            // 处理中文乱码问题
            converter.setSupportedMediaTypes(ImmutableList.of(MediaType.APPLICATION_JSON_UTF8));
    
            converter.setObjectMapper(objectMapper);
            converters.add(converter);
            converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
        }
    }

    2020-01-10

        1.Bug:

          今天在写mybatis XML文件时,在XML文件中注释了一段旧的SQL,然后打包部署以后,注释的字段#{xxx.属性} 报错 属性 is no getter .... ,

          但是实际这个属性不在项目中,当把注释删除掉以后再重新打包部署,代码正常运行,很奇怪

        2.BigDecimal数据处理问题

          两个Double类型的数字相除并且保留两位小数,然后通过BigDecimal的构造方法转成BigDecimal对象,然后返回给前端时仍然会出现精度丢失的情况

          解决办法:

          将最终要传递给前端的BigDecimal对象,转换成字符串 String.valueOf(BigDecimal对象)

  • 相关阅读:
    Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
    Django的ORM操作
    RabbitMQ
    CentOS忘记用户名或者密码解决办法
    VUE-es6
    vue基础之命令
    爬虫框架:scrapy
    爬虫高性能相关
    MongoDB
    Beautifulsoup模块
  • 原文地址:https://www.cnblogs.com/july-sunny/p/12178530.html
Copyright © 2011-2022 走看看