![](https://img-blog.csdnimg.cn/20210315165823972.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
SpringBoot
文章平均质量分 94
SpringBoot整合相关的技术开发等
魅Lemon
hello, everybody
展开
-
缓存一致性几种解决方案
这是一副时序图,描述请求的先后调用顺序;橘黄色的线是请求 A,黑色的线是请求 B;橘黄色的文字,是 MySQL 和 Redis 最终不一致的数据;数据是从 10 更新为 11;请求 A、B 都是先写 MySQL,然后再写 Redis,在高并发情况下,如果请求 A 在写 Redis 时卡了一会,请求 B 已经依次完成数据的更新,就会出现图中的问题。不过这里有个前提,就是对于读请求,先去读 Redis,如果没有,再去读 DB,但是读请求不会再回写 Redis。原创 2023-12-13 14:42:03 · 1283 阅读 · 0 评论 -
MDC学习笔记
MDC是可以帮组我们 在多线程条件下记录追踪日志的功能,它支持 Log4J和LogBack 两种日志框架通常打印出的日志会有线程号等信息来标志当前日志属于哪个线程,然而由于线程是可以重复使用的,所以并不能很清晰的确认一个请求的日志范围。手动生成一个唯一序列号打印在日志中;使用日志控件提供的MDC功能,生成一个唯一序列标记一个线程的日志在现网出现故障时,我们经常需要获取一次请求流程里的所有日志进行定位。原创 2023-04-12 15:31:00 · 3686 阅读 · 0 评论 -
SpringSecurity实战解析
提供了两种认证方式:HttpBasic 认证和 HttpForm 表单认证。HttpBasic 认证不需要我们编写登录页面,当浏览器请求 URL 需要认证才能访问时,页面会自动弹出一个登录窗口,要求用户输入用户名和密码进行认证。大多数情况下,我们还是通过编写登录页面进行 HttpForm 表单认证(现在默认是这个模式)一般认证成功后的用户信息是通过 Session 在多个请求之间共享,实现将已认证的用户信息对象 Authentication 与 Session 绑定要开启Spring方法级安全,在添加了。原创 2023-04-07 19:27:08 · 986 阅读 · 0 评论 -
配置文件、API接口脱敏
核心隐私数据无论对于企业还是用户来说尤其重要,因此要想办法杜绝各种隐私数据的泄漏。对于工程中的敏感信息,与数据库打交道的的工程肯定是配置数据源,尤其是数据库的账号密码,我们不想把它们明文写在配置文件里,又想让工程能正确跑起来,那应该怎么做呢?**由于数据库的敏感性,所以不可能让每个人都知道su ****root的密码。且数据库中权限、视图这些机制也是为了保证安全性,所以要保证让尽可能少的人知道root**的密码。在工程的配置文件中写入加密好的密文。启动工程时让知道密钥的人,以启动参数的形式将密钥。原创 2023-02-18 16:18:12 · 2203 阅读 · 1 评论 -
SpringBoot2.0经典学习笔记
我们知道,从 2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE(Java Enterprise Edition)开发中真正意义上的标准,但是随着技术的发展,Java EE使用 Spring 逐渐变得笨重起来,大量的 XML 文件存在于项目之中。繁琐的配置,整合第三方框架的配置问题,导致了开发和部署效率的降低。2012 年 10 月,Mike Youngstrom 在 Spring jira 中创建了一个功能请求,要求在 Spring 框架中支持无容器 Web 应用程序体系结构转载 2023-01-31 22:51:48 · 973 阅读 · 1 评论 -
Spring之秒传、断点续传、分片上传和压缩
通俗的说,你把要上传的东西上传,服务器会先做MD5校验,如果服务器上有一样的东西,它就直接给你个新地址,其实你下载的都是服务器上的同一个文件,想要不秒传,其实只要让MD5改变,就是对文件本身做一下修改(改名字不行),例如一个文本文件,你多加几个字,MD5就变了,就不会秒传了分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。原创 2022-10-24 20:22:29 · 1537 阅读 · 0 评论 -
OAuth三方授权登录
OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方 应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他 们数据的所有内容。OAuth在全世界得到广泛应用,目前的版本是2.0版。协议特点简单:不管是OAuth服务提供者还是应用开发者,都很易于理解与使用;安全:没有涉及到用户密钥等信息,更安全更灵活;开放:任何服务提供商都可以实现OAuth,任何软件开发商都可以使用OAuth;原创 2022-10-24 20:20:57 · 2872 阅读 · 0 评论 -
SpringBoot重试策略Retry
重试机制在网络服务中非常的重要,由于网路可能存在延迟,网络抖动,网络不稳定的情况。同时在分布式服务中网络的请求的高度密集,有些服务不一定能在规定的时间内完成访问。应该请求服务需要重试几次。以保证服务请求成功。例如对接支付接口时,因为回调比较重要,当访问失败时会进行重试,不过此时的重试机制时间是逐步加大,例如30s/1m/10m/1h等,最终到达阈值不在重试对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。远程调用超时、网络突然中断可以重试。原创 2022-09-28 16:09:33 · 1836 阅读 · 0 评论 -
SpringBoot统一异常处理详解
Spring Boot后端接口规范Spring在3.2版本增加了一个注解,可以与、、等注解注解配套使用。不过跟异常处理相关的只有注解,从字面上看,就是异常处理器的意思**Assert(断言)**是Spring 家族的,在我们写测试用例的时候经常会用到,使用断言能让我们编码的时候有一种非一般丝滑的感觉Assert的部分源码,可以看到,Assert 其实就是帮我们把 if {…} 封装了一下,抛出的异常是} } }原创 2022-09-28 16:09:02 · 10786 阅读 · 0 评论 -
Redis接口限流、分布式锁与幂等
Redis6.0学习笔记分布式锁、限流、处理请求接口幂等性,本篇文章重点讲述SpringBoot通过注解和AOP的方式实现Redis的接口限流,Redis使用了Lua脚本实现原子操作;通过redis实现的分布式锁以及处理接口幂等等方案限流就是限制API访问频率,当访问频率超过某个阈值时进行拒绝访问等操作当然这是在代码层面进行的接口限流,现在分布式微服务接口限流基本是在网关处做接口限流/黑白名单等,例如Gateway/Nginx等,详情可以参考Nginx高级篇和SpringCloud Gateway 详解。原创 2022-09-28 16:07:35 · 1179 阅读 · 0 评论 -
SpringBoot生产监控
开发完成后,生产就绪需要做哪些工作呢?我认为,以下三方面的工作最重要。提供健康检测接口。传统采用 ping 的方式对应用进行探活检测并不准确。有的时候,应用的关键内部或外部依赖已经离线,导致其根本无法正常工作,但其对外的 Web 端口或管理端口是可以 ping 通的。我们应该提供一个专有的监控检测接口,并尽可能触达一些内部组件。暴露应用内部信息。原创 2022-09-28 15:13:40 · 1408 阅读 · 0 评论 -
Web消息推送之SSE
消息推送(push)通常是指网站的运营工作等人员,通过某种工具对用户当前网页或移动设备APP进行的主动消息推送。推送的场景比较多,比如有人关注我的公众号,这时我就会收到一条推送消息,以此来吸引我点击打开应用,消息推送一般又分为web端消息推送和移动端消息推送。另外注意主流浏览器只支持6个连接我有7种实现web实时消息推送的方案,7种短轮询客户端定期向服务器发送请求。如果服务器有更新,它会向客户端发送响应并关闭连接。如果服务器没有更新,它也会向客户端发送一个响应并关闭连接。长轮询客户端向服务器发送请求。...原创 2022-07-29 20:24:36 · 10810 阅读 · 5 评论 -
Redis键通知相关小记(EVENT NOTIFICATION)
从Redis 2.8.0开始,Redis加入了发布/订阅模式以及键空间消息提醒(keyspace notification)功能。键空间消息提醒提供了允许客户端通过订阅指定信道获取Redis数据变化的能力。需要注意的是,键空间消息提醒并非可靠的,它不会对订阅端是否接收到消息进行确认。例如某个订阅的客户端暂时断开连接,在其直到恢复连接期间发生的事件将无法再次获得。可以通过对redis的文件中配置参数可以指定服务器发送哪种类型的通知。下面对于一些参数的描述。默认情况下此功能是关闭的。在上述示例中将配置为,代表原创 2022-07-11 19:57:57 · 809 阅读 · 0 评论 -
SpringBoot接口加密与解密
对称加密只有一个秘钥,加密和解密都是用同一个秘钥,所以叫做对称加密。非对称加密有两个秘钥,一个是公钥,一个是私钥。非对称的特点在于,公钥加密的私钥可以解密,但私钥加密的,公钥解不出来,只能验证是否由私钥进行加密目前常见的加密方式是有两种,一种是对称加密(AES为代表),一种是非对称加密(RSA为代表)特点:只需交换公钥;公/秘钥机制,公钥加密,私钥解密(或者私钥加密,公钥解密);公钥负责加密,私钥负责解密;私钥负责签名,公钥负责验证缺点:加解密速度慢,特别是解密特点:加解密用同一秘钥优点:速度快,效率高;缺原创 2022-07-11 19:57:04 · 8199 阅读 · 1 评论 -
SpringBoot整合office转换与预览
有时候我们需要在程序中使用到office的转换和预览功能,本文就针对这个需求记录了两种较为简单的office转换和功能:aspose和jodconverter。当然还有其他开源第三方(kkfileview)Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,主要提供.net跟java两个开发语言的控件套包,通过它,可以有计划地操纵一些商业中最流行的文件格式:Word, Excel, PowerPoint, Project,等office文档以及PDF文档。但是不足的是aspo原创 2022-07-11 19:55:43 · 1790 阅读 · 0 评论 -
SpringBoot 热搜与不雅文字过滤
这里主要讲springboot整合redis的个人搜索记录与热搜、敏感词过滤与替换两个功能,下面进行环境准备,引入相关maven依赖配置为最后敏感词文本文件放在目录下,取名为,敏感词文本网上很多,这里就随便贴一个:github敏感词简单原理如下图所示,使用了DFA算法,创建结点类,里面包含是否是敏感词结束符,以及一个HashMap,哈希里key值存储的是敏感词的一个词,value指向下一个结点(即指向下一个词),一个哈希表中可以存放多个值,比如赌博、赌黄这两个都是敏感词。敏感词库的初始化,这里主要工作是原创 2022-07-11 19:53:45 · 1527 阅读 · 5 评论 -
SpringBoot实现扫码登录
文章目录一、概述1、扫码登录介绍2、扫码登录原理二、扫码登录实战(轮询版)1、环境准备2、RedisTemplate序列化3、Token工具类4、定义扫码状态5、定义返回类6、定义二维码工具类7、编写相应方法三、扫码登录(长连接版)一、概述1、扫码登录介绍二维码扫描登录原理二维码登录本质上也是一种登录认证方式。既然是登录认证,要做的也就两件事情:告诉系统我是谁,以及向系统证明我是谁。比如账号密码登录,账号就是告诉系统我是谁, 密码就是向系统证明我是谁; 比如手机验证码登录,手机号就是告诉系统我原创 2022-05-25 20:57:31 · 3885 阅读 · 14 评论 -
MinIO分布式文件服务器搭建与入门
文章目录一、介绍1、对象存储和分布式文件简介2、MinIO简介3、MinIO特点二、MinIO安装入门1、介绍2、快速安装2.1 Windows2.2 Linux2.3 MacOS2.4 Docker(推荐)3、UI界面界面简单使用3.1 新建存储桶3.2 添加访问规则3.3 上传文件3.4 访问文件三、SpringBoot整合MinIO1、引入项目依赖2、配置文件设置3、配置类设置4、工具类整合4.1 简单整合MinIO上传工具4.2 MinIO工具类一、介绍1、对象存储和分布式文件简介阿里云OS原创 2022-05-09 21:24:17 · 3336 阅读 · 0 评论 -
Spring Security学习笔记
文章目录一、Security简介1、简介2、security框架快速搭建二、Spring Security认证1、登录校验流程2、SpringSecurity原理初探2.1 过滤器介绍2.2 认证流程详解3、SpringBoot整合前期准备3.1 思路分析3.2 数据库与框架搭建3.3 相应工具类创建4、自定义UserDetailsService5、自定义登录接口6、认证过滤器7、退出登录8、自定义认证(可选)三、Spring Security授权1、 权限系统初步介绍1.1 介绍1.2 授权基本流程1.3原创 2022-05-09 21:17:50 · 2313 阅读 · 4 评论 -
Spring Boot Admin服务监控
Spring Boot Admin服务监控一、介绍1、SBA简介官网参考文档Spring Boot Admin(SBA)是一个开源的社区项目,用于管理和监控 Spring Boot 应用程序。应用程序可以通过 http 的方式,或 Spring Cloud 服务发现机制注册到 SBA 中,然后就可以实现对 Spring Boot 项目的可视化管理和查看了。 Spring Boot Admin 可以监控 Spring Boot 单机或集群项目,它提供详细的健康 (Health)信息、内存信息、原创 2022-05-09 21:12:45 · 1079 阅读 · 0 评论 -
Java版微信/支付宝支付
文章目录一、微信支付接入与介绍1、微信支付产品介绍2、接入指引二、支付安全基础(证书/**秘钥**/**签名)**1、安全基础2、**对称加密和非对称加密**3、摘要算法4、数字签名与证书4.1 数字签名4.2 数字证书4.3 **https协议中的数字证书**三、基础支付API V31、支付配置准备1.1 引入支付参数1.2 加载商户私钥1.3 **获取签名验证器和HttpClient**1.4 **API字典和相关工具**1.5 设置全局返回类2、签名和验签解析2.1 签名2.2 验签3、Native支原创 2022-04-14 15:31:03 · 7659 阅读 · 4 评论 -
SpringBoot项目整合WebSocket几种方式
SpringBoot项目整合WebSocket几种方式一、WebSocket相关介绍在线测试websocket网站:http://www.easyswoole.com/wstool.html1、WebSocket基本概念1.1 基本概念基本概念原理这里就不细讲了,一查一大把,推荐大佬的这篇博客(偏代码实践一些)以及知乎的这篇高赞回答(偏寓教于乐一些)。需要重点说明的几点Websocket作为标准的通信协议在Web C/S使用时,需要浏览器和Web服务容器的支持Websocket依靠Http来原创 2022-04-14 15:21:40 · 6433 阅读 · 0 评论 -
40 个 常用的 SpringBoot 注解
40 个 常用的 SpringBoot 注解一、Spring Web MVC注解@RequestMapping@RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射。Spring MVC和Spring WebFlux都通过RquestMappingHandlerMapping和RequestMappingHndlerAdapter两个类来提供对@RequestMapping注解的支持。@RequestMapping注解对请求处理类中的请求处理方法进行标注;@Reque原创 2022-04-14 15:21:06 · 766 阅读 · 0 评论 -
SpringBoot2定时任务
文章目录一、介绍二、Schedule组件1、介绍2、Schedule定时任务实现2.1 配置线程池2.2 新建具体任务2.3 开启Schedule三、quartz组件1、介绍2、重要概念3、quartz内存配置实战3.1 引入依赖3.2 创建job3.3 调度器Scheduler绑定3.4 yml配置4、Quartz持久化配置四、cron表达式1、简介2、字段含义3、常用表达式实例一、介绍SpringBoot可以有两种方式实现定时任务,schedule和schedule,这两种组件都可以和Spring进原创 2022-02-13 08:17:44 · 1031 阅读 · 0 评论 -
Java8本地缓存Caffeine
文章目录一、Caffeine介绍1、缓存介绍2、Caffeine介绍二、Caffeine基础1、缓存加载策略1.1 Cache手动创建1.2 Loading Cache自动创建1.3 Async Cache异步获取2、驱逐策略3、刷新机制4、统计5、总结三、SpringBoot整合Caffeine1、@Cacheable相关注解1.1 相关依赖1.2 常用注解1.3 常用注解属性1.4 缓存同步模式2、实战2.1 引入依赖2.2 缓存常量CacheConstants2.3 缓存配置类CacheConfig2原创 2022-02-13 08:14:37 · 9304 阅读 · 0 评论 -
SpringBoot @Async异步多线程
文章目录一、简介1、概念2、异步多线程概述3、Spring已实现线程池4、异步方法二、@Async默认线程池1、默认@Async异步调用例子1.1 开启异步任务1.2 在方法上标记异步调用2、默认线程池弊端2.1 Executors弊端2.2 @Async弊端三、@Async自定义线程池1、介绍2、Spring自定义异步线程池几种方式2.1 配置application.yml2.2 实现接口AsyncConfigurer2.3 **继承AsyncConfigurerSupport**2.4 **配置自定义的原创 2022-02-13 08:00:23 · 3960 阅读 · 0 评论 -
Spring开发社交模块小记
文章目录一、引言二、数据库设计三、动态发表模块设计1、介绍2、Redis结构选择四、评论模块设计1、介绍2、对象类型转换工具3、多级评论树型拼接4、评论简单过滤五、点赞模块设计1、问题描述2、Redis数据结构选择1. Set结构存储2. Hash结构存储3、编码实现1. 配置redis2. Redis工具类编写3. 使用Set结构存储点赞4. 使用Hash结构存储点赞5. Quartz定时任务持久化一、引言社交模块作为热点数据来说,可能会频繁改动字段,因此用Mysql是肯定不现实的,一般使用Redis原创 2021-12-28 16:39:06 · 700 阅读 · 3 评论 -
SpringBoot文件上传与校验
文章目录一、简介1、概述2、环境与技术介绍3、简单的文件上传二、文件校验与上传实战1、 前提准备2、 文件枚举类3、 自定义文件校验注解4、 文件校验切面5、 文件上传工具类6、 控制类7、 配置文件8、 文件的前端显示三、阿里云OSS文件上传1、 阿里云oss配置2、 Java整合oss3、 注意事项一、简介1、概述文件上传是Web项目的一个基本功能,一般是通过上传文件的后缀名进行格式校验,但是由于文件的后缀是可以手动更改的,黑客可以通过修改后缀名入侵文件服务器,因此后缀名校验不是一种严格有效的文件原创 2021-12-02 22:49:26 · 6534 阅读 · 2 评论 -
SpringBoot聚合项目创建、打包与多环境
一、创建父工程新建工程,选择Spring initializer填写好项目名称等不勾选任何依赖,最后选择好项目存储位置,点击创建删除不必要的文件保留父工程项目必要的文件相关文件介绍.gitignore:分布式版本控制系统git的配置文件,意思为忽略提交mvnw:全名是maven wrapper的文件,作用是在maven-wrapper.properties文件中记录你要使用的maven版本,当用户执行mvnw clean 命令时,发现当前用户的maven版本和期望的版本不一致,那么就原创 2021-08-12 21:34:04 · 2621 阅读 · 4 评论 -
SpringBoot日志总结
在开发中,我们经常使用 System.out.println() 来打印一些信息,但是这样不好,因为大量的使用 System.out 会增加资源的消耗,而且部署在Linux上时只能通过日志来查看输出。我们实际项目中使用的是 slf4j 的 logback 来输出日志,slf4j+logback也是springboot的默认日志框架,当然logback也可以换成性能更好的log4j2框架。1. slf4j 介绍SLF4J,即简单日志门面(Simple Logging Facade for Java),不原创 2021-03-15 19:13:52 · 869 阅读 · 0 评论 -
SpringBoot异步、邮件、定时任务
一、异步任务首先在service服务类上添加注解@Async,然后在Application启动类上添加@EnableAsync注解即可二、邮件任务1、引入maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId></dependency>2、原创 2021-03-15 19:09:54 · 758 阅读 · 0 评论 -
Spring整合Excel与Pdf
1、POI与EasyExcel介绍Apache POI官网: https://poi.apache.org/Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。基本功能(原生)HSSF – 提供读写Microsoft Excel各式档案的功能。(03版本)XSSF – 提供读写Microsoft Exce原创 2021-03-15 19:04:53 · 556 阅读 · 0 评论 -
SpringBoot自定义starter
一、starter简介1、SpringBoot starter机制SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研原创 2021-01-28 18:55:55 · 479 阅读 · 1 评论 -
springboot2整合WebSocket入门实战
一、问题描述最近刚好有一个需要,就是需要服务端推送消息到客户端,解决方案第一个想到的便是前端轮询服务器,查询服务器是否有请求。对于这种方法,优点是简单,但缺点也十分明显,那就是十分耗费服务器资源。因此在这里介绍了第二种方法,使用webSocket。二、websocket与http 区别http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能发送信息。http链接分为短链接,长链接,短链接是每次请求都要三次握手才能发送自己的信息。即每一个request对应一个re原创 2021-01-27 18:49:26 · 2155 阅读 · 1 评论 -
SpringBoot整合JWT实现前后端Token验证
一、JWT介绍1、JWT简介Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。官网:https://jwt.io/introduction/2原创 2021-01-27 18:34:49 · 806 阅读 · 0 评论 -
springboot集成RabbitMQ简单入门实践
一、RabbitMQ核心概念RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现。所有 MQ 产品从模型抽象上来说都是一样的过程:消费者(consumer)订阅某个队列。生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者。1、Message消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由原创 2020-10-24 09:29:15 · 398 阅读 · 1 评论 -
springboot集群体系架构入门
https://zaomianbao.com/blog/2018/08/22/10原创 2020-10-21 09:54:23 · 257 阅读 · 0 评论 -
Spring Boot后端接口规范
文章目录一、前言二、环境说明三、参数校验Validator + 自动抛出异常(使用)四、全局异常处理基本使用自定义异常五、数据统一响应六、全局处理响应数据(可选择)七、总结一、前言 一个后端接口大致分为四个部分组成:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response)。虽然说后端接口的编写并没有统一规范要求,而且如何构建这几个部分每个公司要求都不同,没有什么“一定是最好的”标准,但其中最重要的关键点就是看是否规范。二、环境说明 因为讲解原创 2020-08-30 21:51:07 · 5215 阅读 · 4 评论 -
Spring Boot整合knife4j实现Api文档
一、简介 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍! knife4j的前身是swagger-bootstrap-ui,为了契合微服务的架构发展,由于原来swagger-bootstrap-ui采用的是后端Java代码+前端Ui混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为knife4jknife4j官方文档码云仓库地址二、项目原创 2020-08-23 21:49:47 · 3277 阅读 · 1 评论