每周总结:2020年01月第1周

Posted gabriel-y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每周总结: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对象)

以上是关于每周总结:2020年01月第1周的主要内容,如果未能解决你的问题,请参考以下文章

周总结-2019年7月第一周

12月第1周业务风控关注 | 工信部将开展移动恶意程序专项治理工作

计数排序再思考——从2020年1月第16题谈起

2019年12月第一周前端问题汇总

2018年5月第一二周下载中心资源下载TOP榜

3月第3周业务风控关注 | 去哪儿员工利用漏洞,薅美团羊毛 45 万