每周总结: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对象)

原文地址:https://www.cnblogs.com/gabriel-y/p/12178530.html

时间: 2024-10-31 09:31:15

每周总结:2020年01月第1周的相关文章

云锵投资 2020 年 01 月简报

2020 年 1 月云锵投资团队月报: 云锵基金投资 云锵投基使用自动化程序进行量化选基.其中包含了多个策略.本集合投资目标是通过选择优质基金,来获取更高的 Alpha.一般情况下会保持满仓,较少情况下会通过主动管理资金仓位来提高 Alpha 及 绝对收益.市场极度高估情况下,会降低一部分仓位,持有现金类资产. 概况: 本月底仓位 99.98%,持有 20 只基金,本月涨幅:+7.27%. 同期上证指数:-2.41%:本月战胜大盘9.68%.由于过春节,数据更新较慢,所以全国排名数据本月不好统计

2020年01月30日

#include<stdio.h> /* 这一句话是必须要的格式 stdio 表示系统文件库, 也可以声明其它的 .h 表示头文件,因为这些文件都是放在程序各文件的开头 #include 告诉预处理器将指定头文件的内容插入到预处理器命令的相应位 导入头文件的预编译指令 <> 表示系统自带的库 也可以写成" " 表示用户自定义的库 如果写成" "并且自定义的库里面没有这个文件系统会自动查找自带的库,如果还是没有报错 */ int main()

.NET编程周记第3期-2020年1月19日

整理了2020年1月19日这周阅读的几篇有趣的和.NET开发相关的文章.在这里和大家分享. 0x00 Introducing Nullable Reference Types in C# 如标题所示,本文介绍了在C# 8之后引入的可空引用类型. 在本文的开头,介绍了空引用的起源以及Tony Hoare的“十亿美元的错误”,这是一段有趣的历史背景介绍. 介绍了在处理空引用时存在的问题,以及如何在C#8中解决这些问题的方法,即他们添加了可空引用类型来表达引用可能为空的意图. https://devb

2020年1月我主要的业力对应关系

本文记录2020年1月我的业力因果,并增加"镜像投射"等记录,分享给大家,愿协助世界意识更加地提升-感谢- 镜像投射 我按摩时遇到的美女,她一直单身,什么关系都无,非常自由 跟我有点像啊 我在重庆见到的创始人,对我非常诚恳,对我技术也认可 这是因为我对人非常诚恳,我认可我自己! 建议我去上海的网友,目前有点迷茫,跟我的经济情况有点像,需要我的帮助 这难道是高我给我一个机会,通过我帮助他,来帮助我自己?哈哈,谢谢高我! 梦境记录 梦到飞碟??漂浮在街道上,心情激动 心灵感应 过年回家期间

第一金早评 - 2015年01月07日-晨早快訊

每日金市速遞 (2015年01月07日) 谢权东 先生 上日9999 金粒賣出價每両 HKD 12590 金粒賣出價資料參考周生生,周大福 即日投資策略: 黃金日線圖上分析,日線收3連陽,K線沿布林帶中軌和上軌之間運行,金價日內大漲,布林帶有向上開口跡象,布林中軌向上翹頭,短週期均線指標金叉向上,MACD快慢線死叉於0軸下方金叉,有上穿0軸趨勢,紅柱放量. 從4小時來看,布林帶向上開口,金價處於布林上軌1220與MA5-1215之間震盪往上,短週期均線指標金叉向上,MACD快慢線於0軸附近形成金

2015年01月09日_安装archlinux中一些注意事项

一直以来是用win或ubuntu办公.新手不懂高手怎么那么喜欢linux,做完一个大项目后才发觉一个快速运行的系统多么重要.ubuntu办公虽然快一些,但是在办公方面感觉还是略差一节,现决定使用archlinux及轻量级桌面,把所有能用得起的物理资源全部用在工作软件方面.2015年01月09日在安装时出现了一些小问题,现记录如下,供以后自己及有心人查阅. 1. arch wiki文档中可切换到中文查看.确保顺序没错 2. vi中搜索关键字:  /vi vi中的剪切一行:dd vi中的复制一行:y

Java 获取各时区时间,获取当前时间到格林威治时间1970年01月01日00时00分00秒的秒数

格林威治时间即UTC/GMT时间,1970年01月01日00时00分00秒(即UTC+8的北京时间1970年01月01日08时00分00秒)计算代码如下: 1 /** 2 * 获取指定时间到格林威治时间的秒数 3 * UTC:格林威治时间1970年01月01日00时00分00秒(UTC+8北京时间1970年01月01日08时00分00秒) 4 * @param time 5 * @return 6 */ 7 public static long diffSeconds(String time){

2016年01月MVP开始申请了~[截止时间:10月23日]

51CTO与微软中国合作长期为用户提供申请"微软最有价值专家"的平台希望有兴趣.资历的朋友以及正在朝这个方向努力的朋友能够积极参与只要您想参与我们将为您向微软推荐 微软最有价值专家MVP一年评选4次分别为每年的1月.4月.7月.10月.2016年1月的MVP申请截止时间是2015年10月23日. 申请MVP的午饭请下载2016年1月MVP申请表填好后发送到[email protected].我们会在每次MVP申请开始时把用户提交的申请表格推荐到微软中国相关部门 [调整说明]目前的奖励类

01月24日【Python3 基础知识】

01月24日[Python3 基础知识] 3.4 统计字符串 3.5 乘法口诀 3.4 统计字符串 # 统计字符串给类型符号个数 s = n = f = 0 st = input("随意输入字符:") for i in st: if i.isalpha(): s += 1 elif i.isdigit(): n += 1 else: f += 1 print("字母有:{0}个,数字有:{1}个,其他符号有:{2}个.".format(s, n, f)) print