Hutool:一行代码搞定数据脱敏

2023-11-04

1. 什么是数据脱敏

1.1 数据脱敏的定义

数据脱敏百度百科中是这样定义的:

数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。这样就可以在开发、测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。是数据库安全技术之一。

总的来说,数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。

在数据脱敏过程中,通常会采用不同的算法和技术,以根据不同的需求和场景对数据进行处理。例如,对于身份证号码,可以使用掩码算法(masking)将前几位数字保留,其他位用“X”或"*"代替;对于姓名,可以使用伪造(pseudonymization)算法,将真实姓名替换成随机生成的假名。

1.2 常用脱敏规则

替换、重排、加密、截断、掩码

2. Hutool工具介绍

2.1 引入Maven配置

在项目的pom.xml的dependencies中加入以下内容,这里以5.8.16版本为例。

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>


注意:Hutool 5.x支持JDK8+, 如果你的项目使用JDK7,请使用Hutool 4.x版本。本文使用的数据脱敏工具类只有在5.6+版本以上才提供。

2.2 Hutool包含的组件

一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:

模块 介绍
hutool-aop JDK动态代理封装,提供非IOC下的切面支持
hutool-bloomFilter 布隆过滤,提供一些Hash算法的布隆过滤
hutool-cache 简单缓存实现
hutool-core 核心,包括Bean操作、日期、各种Util等
hutool-cron 定时任务模块,提供类Crontab表达式的定时任务
hutool-crypto 加密解密模块,提供对称、非对称和摘要算法封装
hutool-db JDBC封装后的数据操作,基于ActiveRecord思想
hutool-dfa 基于DFA模型的多关键字查找
hutool-extra 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)
hutool-http 基于HttpUrlConnection的Http客户端封装
hutool-log 自动识别日志实现的日志门面
hutool-script 脚本执行封装,例如Javascript
hutool-setting 功能更强大的Setting配置文件和Properties封装
hutool-system 系统参数调用封装(JVM信息等)
hutool-json JSON实现
hutool-captcha 图片验证码实现
hutool-poi 针对POI中Excel和Word的封装
hutool-socket 基于Java的NIO和AIO的Socket封装
hutool-jwt JSON Web Token (JWT)封装实现

可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块,本文所使用的数据脱敏工具就是在hutool.core模块。

2.3 Hutool支持的脱敏数据类型

现阶段最新版本的Hutool支持的脱敏数据类型如下,基本覆盖了常见的敏感信息。

  1. 用户id

  2. 中文姓名

  3. 身份证号

  4. 座机号

  5. 手机号

  6. 地址

  7. 电子邮件

  8. 密码

  9. 中国大陆车牌,包含普通车辆、新能源车辆

  10. 银行卡

3. Hutool数据脱敏实操

3.1 使用Hutool工具类一行代码实现脱敏

Hutool提供的脱敏方法如下图所示:

注意:Hutool 脱敏是通过*来代替敏感信息的,具体实现是在StrUtil.hide方法中,如果我们想要自定义隐藏符号,则可以把Hutool的源码拷出来,重新实现即可。

这里以手机号、银行卡号、身份证号、密码信息的脱敏为例,下面是对应的测试代码。

import cn.hutool.core.util.DesensitizedUtil;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * 
 * @description: Hutool实现数据脱敏
 */
@SpringBootTest
public class HuToolDesensitizationTest {

    @Test
    public void testPhoneDesensitization(){
        String phone="13723231234";
        System.out.println(DesensitizedUtil.mobilePhone(phone)); //输出:137****1234
    }
    @Test
    public void testBankCardDesensitization(){
        String bankCard="6217000130008255666";
        System.out.println(DesensitizedUtil.bankCard(bankCard)); //输出:6217 **** **** *** 5666
    }

    @Test
    public void testIdCardNumDesensitization(){
        String idCardNum="411021199901102321";
        //只显示前4位和后2位
        System.out.println(DesensitizedUtil.idCardNum(idCardNum,4,2)); //输出:4110************21
    }
    @Test
    public void testPasswordDesensitization(){
        String password="www.jd.com_35711";
        System.out.println(DesensitizedUtil.password(password)); //输出:****************
    }
}




以上就是使用Hutool封装好的工具类实现数据脱敏。

3.2 配合JackSon通过注解方式实现脱敏

现在有了数据脱敏工具类,如果前端需要显示数据数据的地方比较多,我们不可能在每个地方都调用一个工具类,这样就显得代码太冗余了,那我们如何通过注解的方式优雅的完成数据脱敏呢?

如果项目是基于springboot的web项目,则可以利用springboot自带的jackson自定义序列化实现。它的实现原来其实就是在json进行序列化渲染给前端时,进行脱敏。

**第一步:**脱敏策略的枚举。


/**
 * @author
 * @description:脱敏策略枚举
 */
public enum DesensitizationTypeEnum {
    //自定义
    MY_RULE,
    //用户id
    USER_ID,
    //中文名
    CHINESE_NAME,
    //身份证号
    ID_CARD,
    //座机号
    FIXED_PHONE,
    //手机号
    MOBILE_PHONE,
    //地址
    ADDRESS,
    //电子邮件
    EMAIL,
    //密码
    PASSWORD,
    //中国大陆车牌,包含普通车辆、新能源车辆
    CAR_LICENSE,
    //银行卡
    BANK_CARD
}


上面表示支持的脱敏类型。

**第二步:**定义一个用于脱敏的 Desensitization 注解。

  • @Retention(RetentionPolicy.RUNTIME):运行时生效。
  • @Target(ElementType.FIELD):可用在字段上。
  • @JacksonAnnotationsInside:此注解可以点进去看一下是一个元注解,主要是用户打包其他注解一起使用。
  • @JsonSerialize:上面说到过,该注解的作用就是可自定义序列化,可以用在注解上,方法上,字段上,类上,运行时生效等等,根据提供的序列化类里面的重写方法实现自定义序列化。
/**
 * @author 
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizationSerialize.class)
public @interface Desensitization {
    /**
     * 脱敏数据类型,在MY_RULE的时候,startInclude和endExclude生效
     */
    DesensitizationTypeEnum type() default DesensitizationTypeEnum.MY_RULE;

    /**
     * 脱敏开始位置(包含)
     */
    int startInclude() default 0;

    /**
     * 脱敏结束位置(不包含)
     */
    int endExclude() default 0;
}


注:只有使用了自定义的脱敏枚举MY_RULE的时候,开始位置和结束位置才生效。

第三步:创建自定的序列化类

这一步是我们实现数据脱敏的关键。自定义序列化类继承 JsonSerializer,实现ContextualSerializer接口,并重写两个方法。


/**
 * @author 
 * @description: 自定义序列化类
 */
@AllArgsConstructor
@NoArgsConstructor
public class DesensitizationSerialize extends JsonSerializer<String> implements ContextualSerializer {
    private DesensitizationTypeEnum type;

    private Integer startInclude;

    private Integer endExclude;

    @Override
    public void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        switch (type) {
            // 自定义类型脱敏
            case MY_RULE:
                jsonGenerator.writeString(CharSequenceUtil.hide(str, startInclude, endExclude));
                break;
            // userId脱敏
            case USER_ID:
                jsonGenerator.writeString(String.valueOf(DesensitizedUtil.userId()));
                break;
            // 中文姓名脱敏
            case CHINESE_NAME:
                jsonGenerator.writeString(DesensitizedUtil.chineseName(String.valueOf(str)));
                break;
            // 身份证脱敏
            case ID_CARD:
                jsonGenerator.writeString(DesensitizedUtil.idCardNum(String.valueOf(str), 1, 2));
                break;
            // 固定电话脱敏
            case FIXED_PHONE:
                jsonGenerator.writeString(DesensitizedUtil.fixedPhone(String.valueOf(str)));
                break;
            // 手机号脱敏
            case MOBILE_PHONE:
                jsonGenerator.writeString(DesensitizedUtil.mobilePhone(String.valueOf(str)));
                break;
            // 地址脱敏
            case ADDRESS:
                jsonGenerator.writeString(DesensitizedUtil.address(String.valueOf(str), 8));
                break;
            // 邮箱脱敏
            case EMAIL:
                jsonGenerator.writeString(DesensitizedUtil.email(String.valueOf(str)));
                break;
            // 密码脱敏
            case PASSWORD:
                jsonGenerator.writeString(DesensitizedUtil.password(String.valueOf(str)));
                break;
            // 中国车牌脱敏
            case CAR_LICENSE:
                jsonGenerator.writeString(DesensitizedUtil.carLicense(String.valueOf(str)));
                break;
            // 银行卡脱敏
            case BANK_CARD:
                jsonGenerator.writeString(DesensitizedUtil.bankCard(String.valueOf(str)));
                break;
            default:
        }

    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        if (beanProperty != null) {
            // 判断数据类型是否为String类型
            if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
                // 获取定义的注解
                Desensitization desensitization = beanProperty.getAnnotation(Desensitization.class);
                // 为null
                if (desensitization == null) {
                    desensitization = beanProperty.getContextAnnotation(Desensitization.class);
                }
                // 不为null
                if (desensitization != null) {
                    // 创建定义的序列化类的实例并且返回,入参为注解定义的type,开始位置,结束位置。
                    return new DesensitizationSerialize(desensitization.type(), desensitization.startInclude(),
                            desensitization.endExclude());
                }
            }

            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
        }
        return serializerProvider.findNullValueSerializer(null);
    }
}


经过上述三步,已经完成了通过注解实现数据脱敏了,下面我们来测试一下。

首先定义一个要测试的pojo,对应的字段加入要脱敏的策略。

/**
 *
 * @description:
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestPojo {

    private String userName;

    @Desensitization(type = DesensitizationTypeEnum.MOBILE_PHONE)
    private String phone;

    @Desensitization(type = DesensitizationTypeEnum.PASSWORD)
    private String password;

    @Desensitization(type = DesensitizationTypeEnum.MY_RULE, startInclude = 0, endExclude = 2)
    private String address;
}




接下来写一个测试的controller

@RestController
public class TestController {

    @RequestMapping("/test")
    public TestPojo testDesensitization(){
        TestPojo testPojo = new TestPojo();
        testPojo.setUserName("我是用户名");
        testPojo.setAddress("地球中国-北京市通州区京东总部2号楼");
        testPojo.setPhone("13782946666");
        testPojo.setPassword("sunyangwei123123123.");
        System.out.println(testPojo);
        return testPojo;
    }

}


可以看到我们成功实现了数据脱敏。

4. 其他常见的数据脱敏工具推荐

除了本文介绍的Hutool工具之外,还有一些其他的数据脱敏工具,常见脱敏方法或工具如下所示:

4.1 Apache ShardingSphere

Apache ShardingSphere下面存在一个数据脱敏模块,此模块集成的常用的数据脱敏的功能。其基本原理是对用户输入的SQL进行解析拦截,并依靠用户的脱敏配置进行SQL的改写,从而实现对原文字段的加密及加密字段的解密。最终实现对用户无感的加解密存储、查询。

具体实现方式可参考下面文章: https://jaskey.github.io/blog/2020/03/18/sharding-sphere-data-desensitization/

4.2 FastJSON

平时开发Web项目的时候,除了默认的Spring自带的序列化工具,FastJson也是一个很常用的Spring web Restful接口序列化的工具。

FastJSON实现数据脱敏的方式主要有两种:

  • 基于注解@JSONField实现:需要自定义一个用于脱敏的序列化的类,然后在需要脱敏的字段上通过@JSONField中的serializeUsing 指定为我们自定义的序列化类型即可。
  • 基于序列化过滤器:需要实现ValueFilter接口,重写process方法完成自定义脱敏,然后在JSON转换时使用自定义的转换策略。具体实现可参考这篇文章: https://juejin.cn/post/7067916686141161479

4.3 Mybatis-mate

mybatisplus也提供了数据脱敏模块,mybatis-mate,不过在使用之前需要配置授权码。

配置内容如下所示:

# Mybatis Mate 配置
mybatis-mate:
  cert:
    grant: jxftsdfggggx
    license: GKXP9r4MCJhGID/DTGigcBcLmZjb1YZGjE4GXaAoxbtGsPC20sxpEtiUr2F7Nb1ANTUekvF6Syo6DzraA4M4oacwoLVTglzfvaEfadfsd232485eLJK1QsskrSJmreMnEaNh9lsV7Lpbxy9JeGCeM0HPEbRvq8Y+8dUt5bQYLklsa3ZIBexir+4XykZY15uqn1pYIp4pEK0+aINTa57xjJNoWuBIqm7BdFIb4l1TAcPYMTsMXhF5hfMmKD2h391HxWTshJ6jbt4YqdKD167AgeoM+B+DE1jxlLjcpskY+kFs9piOS7RCcmKBBUOgX2BD/JxhR2gQ==


具体实现可参考baomidou提供的如下代码: https://gitee.com/baomidou/mybatis-mate-examples

5. 总结

本文主要介绍了数据脱敏的相关内容,首先介绍了数据脱敏的概念,在此基础上介绍了常用的数据脱敏规则;随后介绍了本文的重点Hutool工具及其使用方法,在此基础上进行了实操,分别演示了使用DesensitizedUtil工具类、配合Jackson通过注解的方式完成数据脱敏;最后,介绍了一些常见的数据脱敏方法,并附上了对应的教程链接供大家参考,本文内容如有不当之处,还请大家批评指正。

6. 参考内容

Hutool工具官网: https://hutool.cn/docs/#/?id=%f0%9f%93%9a%e7%ae%80%e4%bb%8b

聊聊如何自定义数据脱敏: https://juejin.cn/post/7046567603971719204

FastJSON实现数据脱敏: https://juejin.cn/post/7067916686141161479

作者:京东科技 孙扬威

来源:京东云开发者社区

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hutool:一行代码搞定数据脱敏 的相关文章

  • 《数据安全法》今日实施,中国信通院联合百度等企业发起“数据安全推进计划”

    9月1日讯 数据安全法 今天正式实施 个人信息保护法 也将于11月1日实施 这标志着我国数据安全制度建设进入了新的阶段 发展数字经济 加快培育数据要素市场 必须把保障数据安全放在突出位置 为推动法律法规及监管要求的贯彻落实 促进数据安全技术
  • Charm-crypto搭建CP-ABE密码系统

    在做毕业设计 所以顺便把做的实验总结成文章 CP ABE原理 另一篇文章总结了 搭建CP ABE系统 注意必须先确保正确安装了Charm crypto环境 安装比较坑 可以根据我的文章安装 https blog csdn net qq 33
  • 烂怂if-else代码优化方案

    0 问题概述 代码可读性是衡量代码质量的重要标准 可读性也是可维护性 可扩展性的保证 因为代码是连接程序员和机器的中间桥梁 要对双边友好 Quora 上有一个帖子 What are some of the most basic things
  • 对话力码科技:保险科技应用有待深入,价值落地更重要

    保险行业的数字化时机已来 更加专业化的企业才能立于不败之地 数科星球原创 作者丨苑晶 编辑丨大兔 对于国内的大多数企业来说 2023年是个极为重要的年份 在软件行业 随着人工智能等新技术的日益成熟和普及 软件行业迎来黄金时代 在这种趋势下
  • 分布式服务高可用实现:复制

    1 为什么需要复制 我们可以考虑如下问题 当数据量 读取或写入负载已经超过了当前服务器的处理能力 如何实现负载均衡 希望在单台服务器出现故障时仍能继续工作 这该如何实现 当服务的用户遍布全球 并希望他们访问服务时不会有较大的延迟 怎么才能统
  • Xml外部实体注入漏洞(XXE)与防护

    Xml外部实体注入 XXE 除了json外 xml也是一种常用的数据传输格式 对xml的解析有以下几种常用的方式 DOM SAX JDOM DOM4J StAX等 然而这几种解析方式都可能会出现外部实体注入漏洞 如微信支付的回调就出现过 见
  • Python网络爬虫原理及实践

    作者 京东物流 田禹 1 网络爬虫 网络爬虫 是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 网络爬虫相关技术和框架繁多 针对场景的不同可以选择不同的网络爬虫技术 2 Scrapy框架 Python 2 1 Scrapy架构 2
  • JaCoCo助您毁灭线上僵尸代码

    一 现状 问题 随着需求不断迭代 业务系统的业务代码突飞猛进 在你自豪于自己的代码量产出很高时 有没有回头看看线上真正的客户使用量又有多少呢 费事费力耗费大量人力 成本上线的功能 可能一年没人使用 如果不进行适当的下线 就会增加系统维护成本
  • JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践

    前言 自 2014 年发布以来 JDK 8 一直都是相当热门的 JDK 版本 其原因就是对底层数据结构 JVM 性能以及开发体验做了重大升级 得到了开发人员的认可 但距离 JDK 8 发布已经过去了 9 年 那么这 9 年的时间 JDK 做
  • @ControllerAdvice注解使用及原理探究

    最近在新项目的开发过程中 遇到了个问题 需要将一些异常的业务流程返回给前端 需要提供给前端不同的响应码 前端再在次基础上做提示语言的国际化适配 这些异常流程涉及业务层和控制层的各个地方 如果每个地方都写一些重复代码显得很冗余 然后查询解决方
  • Windows BitLocker驱动器加密

    BitLocker驱动器加密 首先来说下什么是BitLocker吧 Windows BitLocker驱动器加密通过加密Windows操作系统卷上存储的所有数据可以更好地保护计算机中的数据 为什么要拿来说一说呢 因为这个问题 我两天没工作了
  • 常用语言的线程模型(Java、go、C++、python3)

    背景知识 软件是如何驱动硬件的 硬件是需要相关的驱动程序才能执行 而驱动程序是安装在操作系统内核中 如果写了一个程序A A程序想操作硬件工作 首先需要进行系统调用 由内核去找对应的驱动程序驱使硬件工作 而驱动程序怎么让硬件工作的呢 驱动程序
  • 京东云鼎服务器系统时间问题-时间戳参与与服务器时间差异大于设定值

    业务背景 目前业务对接了各大电商平台的订单 按照规定京东需要入鼎进行调用jos接口来拉取订单 相当于与订单API之间多一个应用中转 如图 该文章暂时不讨论对接的细节 后面打算出个专题文章细说各大电商平台的对接 目前好像比较少这个业务的分享
  • 聚焦Web前端安全:最新揭秘漏洞防御方法

    在 Web 安全中 服务端一直扮演着十分重要的角色 然而前端的问题也不容小觑 它也会导致信息泄露等诸如此类的问题 在这篇文章中 我们将向读者介绍如何防范Web前端中的各种漏洞 万字长文 请先收藏再阅读 首先 我们需要了解安全防御产品已经为我
  • AI+数据安全,探索数据安全防护新手段

    随着 4G 正式商用 带宽将不再是数据传输的瓶颈 人类社会真正意义的进入了以手持终端 各类传感器为代表的移动互联网 万物互联 人工智能时代 我们将不再受限于地理位置 可尽情享受着手机购物 电子支付 媒体社交 个性化推送 VR等各种便捷和个性
  • tracert命令返回的三个时间为什么有时会出现1个或2个星号?

    如图 三个时间里有1个或者2个显示星号 这是为什么呢 如果是配置了ACL丢弃了响应报文的话按理应该3个都显示星号呀 直接ping这个ip的话不会出现丢包 时延也很稳定 这个问题很诡异 演绎一下 仅供参考 首先traceroute 是利用 T
  • 最佳实践:基于vite3的monorepo前端工程搭建

    一 技术栈选择 1 代码库管理方式 Monorepo 将多个项目存放在同一个代码库中 选择理由1 多个应用 可以按业务线产品粒度划分 在同一个repo管理 便于统一管理代码规范 共享工作流 选择理由2 解决跨项目 应用之间物理层面的代码复用
  • JSONUtil.toJsonStr 时间变成了时间戳

    问题描述 我的接口是以Date来接收日期的 然后我在拿到这个对象参数后 通过hutool当中的JSONUtil toJsonStr将其序列化成json字符串 然后存储到数据库 然后存储到数据库当中发现这个字段是时间戳 DateTimeFor
  • (二十六)admin-boot项目之基于注解的数据字段脱敏

    项目地址 https gitee com springzb admin boot 如果觉得不错 给个 star 简介 这是一个基础的企业级基础后端脚手架项目 主要由springboot为基础搭建 后期整合一些基础插件例如 redis xxl
  • 从云到「链」,京东云成为中国第四朵云背后

    在产业加速到数实融合加速的今年 云计算不再是云厂商的唯一考校指标 作者 叶子 出品 产业家 京东云再次破圈 信号来自接连发布的几份报告 在国际权威研究机构Forrester发布的名为 The Forrester Wave Public Cl

随机推荐

  • 【毕设选题】基于stm32的智能扫地机器人设计与实现

    文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2 1 电机驱动 2 2 红外线传感器 2 3 超声波传感器 2 4 MPU6050 2 5 ATK ESP8266 WI FI 模块 2 6 电源管理模块 3 软件系统设计 3 1
  • Could not acquire change log lock. Currently locked by XXX

    Could not acquire change log lock Currently locked by XXX 在项目执行liquibase时 发现超过5分钟依然执行不完成 最后报错显示被被锁了 于是找公司的网络 结果被告知该ip不是公
  • 【RPA入门教程】数据抓取功能使用教学(一)

    UiBot 0 7 版新增加了 数据抓取 功能 这项功能可以方便获取网页中的相似元素 将相似元素的数据采集到数组中 比如各种电商网站 淘宝 京东 拼多多等 的商品分类 商品列表信息 商品名 价格等 或者网页中的各种列表 表格的数据 本期教学
  • 怎样入门嵌入式嵌入式未来的发展方向

    概述 很多工程师要往嵌入式方向发展 特别是ARM得到应用后 这个趋势更是有增无减 但你真的知道怎样入门嵌入式么 你知道嵌入式未来的发展方向么 怎样入门嵌入式嵌入式未来的发展方向 在很多学生或者初级工程师都关注嵌入式 尤其在ARM大红大紫以后
  • 用js写一个简单的定时器

  • STM32学习笔记 -系统时钟Systick

    文章目录 一 SysTick系统时钟滴答定时器的相关概念 1 SysTick的两大作用 1 1 可以产生精确延时 节省定时器 1 2 可以提供给操作系统一个单独的心跳 时钟 节拍 主要 2 SysTick的定义 3 SysTick运行机制
  • 重构,改善既有代码的设计--总结篇

    重构 改善既有代码的设计 第一章感悟 一 书中经典句子 1 重构之前 首先检查自己是否有一套可靠的测试机制 这些测试必须有自我检验能力 2 面对长长的函数 需要分解 代码块越小越好管理 二 自己总结的句子 1 修改长长的函数 找到变的参数和
  • Cesium 之加载倾斜摄影3d模型(解决倾斜漂移问题)

    以Cesium3DTileset方式加载服务发布的倾斜摄影静态资源Json文件 参考如下 item url 倾斜摄影的json地址 tileset json let tileset window viewer scene primitive
  • OpenAi[ChatGPT] 使用Python对接OpenAi APi 实现智能QQ机器人-学习详解篇

    文章大部分来自 https lucent blog 原文博客地址 https blog ideaopen cn 最近火热全文的ChatGPT 被很多人玩出了花 我们在Github上可以看到几个常见的逆向SDK包 这一篇我将以学习的方式来写这
  • 项目实用功能-全局loading动画

    1 为设么要使用全局loading 调用的每一个接口都要绑定一个loading真的很烦 2 实现这个需要考虑哪些要素 首先全局的loading需要一个调用任何接口都要执行的地方打开 那就肯定是axios的前置拦截函数了 loading有加载
  • mongodb导入数据库报错:command listCollections requires authentication

    今天迁移mongodb数据 需要将数据导入到一个新的mongodb中去 把环境搭建好之后 执行 mongorestore dir home backdata 想要导入数据 却报错了 错误信息如下 command listCollection
  • 第50步 深度学习图像识别:Data-efficient Image Transformers建模(Pytorch)

    基于WIN10的64位系统演示 一 写在前面 1 Data efficient Image Transformers Data efficient Image Transformers DeiT 是一种用于图像分类的新型模型 由Facebo
  • Minio(储桶bucket)上传和下载文件【Java】(图片转流、base64)

    此处先将图片下载到本地 再进行转换 MinIO是一个对象存储服务 非常轻量 Java Api 依赖
  • Springboot启动扩展点超详细总结,再也不怕面试官问了

    1 背景 Spring的核心思想就是容器 当容器refresh的时候 外部看上去风平浪静 其实内部则是一片惊涛骇浪 汪洋一片 Springboot更是封装了Spring 遵循约定大于配置 加上自动装配的机制 很多时候我们只要引用了一个依赖
  • NoSQL数据库概述

    简介 本文首先解释了NoSQL的出现的原因 介绍了NoSQL数据库所依据的理论和原则 然后分别介绍了四种NoSQL数据库的类型 以及其代表产品 并讨论了这四种类型的NoSQL的特点以及适用场景 需要NoSQL的理由 NoSQL数据库 看起来
  • Qt程序设置不重复打开该程序

    Qt程序设置不重复打开该程序 文章目录 Qt程序设置不重复打开该程序 对于已经打开的Qt桌面程序 我们希望用户再次双击桌面的快捷方式时 程序可以自动激活到其他所有程序的最前面 而不是重新打开一次程序 此时我们采用QSharedMemory方
  • 【图像处理】【去模糊】图像去模糊之初探--Single Image Motion Deblurring

    原文 原文地址 曾经很长一段时间 对图像去模糊都有一种偏见 认为这是一个灌水的领域 没有什么实用价值 要到这样的文章 不管是多高的档次 直接pass 最近在调研最近几年的关于Computational Photography的一些研究热点时
  • 莫言用 GPT 写颁奖辞,那如果他自己写会是什么效果呢?

    在 收获 杂志 65 周年庆典上 莫言在为余华颁奖时表示 余华是自己的好朋友 但给他的颁奖词写了好几天也想不出来 后来找了 ChatGPT 帮忙写 最后 莫言让 ChatGPT 写了一篇莎士比亚风格 1000 多字的颁奖词 输入了关键词 活
  • 数据仓库_缓慢渐变维_拉链表(全揭秘)

    这篇文章我们主要讲解下以下几个点 什么是拉链表 用于什么样的场景 拉链表的示例 如何获取某一天的历史状态 如何在使用维度拉链表并使用代理键的前提下 构建含维度代理键的事实表 1 什么是拉链表 用于什么样的场景 当维度数据发生变化时 将旧数据
  • Hutool:一行代码搞定数据脱敏

    1 什么是数据脱敏 1 1 数据脱敏的定义 数据脱敏百度百科中是这样定义的 数据脱敏 指对某些敏感信息通过脱敏规则进行数据的变形 实现敏感隐私数据的可靠保护 这样就可以在开发 测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集