自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(388)
  • 资源 (8)
  • 收藏
  • 关注

原创 智能电话本项目

1 项目介绍1.1 项目描述该项目是用于日常生活中记录联系人信息的一款智能小工具。实现了对联系人的姓名、年龄、性别、电话号码、住址的添加及修改、查找、删 除、排序等功能。该项目是以 Windows 控制台为运行平台,所有的操作都应在控制台 上进行。1.2 编写目的进一步理解什么是面相对象设计(OOD:Object Oriented Design)。充分理解面向对 象设计的精髓。2 项目演示双击 start.bat 可启动电话本项目,如图所示:3 技术说明3.1 业务流程结构图3.2

2022-03-08 16:16:11 461

原创 Java的数据结构

1 数据结构简介1.1 什么是数据结构简单地说,数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了 数据结构对于某些操作是高效的,而对于其他操作则是低效的。所以我们需要理解各种数据 结构,才能在处理实际问题时选取最合适的数据结构。数据结构=逻辑结构+物理结构(顺序、链式、索引、散列) 。逻辑结构:数据元素间抽象化的相互关系 。物理结构:(存储结构),在计算机存储器中的存储形式。2 数据结构逻辑分类数据结构从逻辑上划分为三种基本类型:2.1 线性结构数据结构中的元素存在一

2022-03-07 16:16:10 14715 2

原创 Java的容器

1 容器简介容器,是用来容纳物体、管理物体。生活中,我们会用到各种各样的容器。如锅碗瓢盆、 箱子和包等。如图所示:程序中的“容器”也有类似的功能,用来容纳和管理数据。比如,如下新闻网站的新闻 列表、教育网站的课程列表就是用“容器”来管理:视频课程信息也是使用“容器”来管理:开发和学习中需要时刻和数据打交道,如何组织这些数据是我们编程中重要的内容。我 们一般通过“容器”来容纳和管理数据。事实上,我们前面所学的数组就是一种容器,可以 在其中放置对象或基本类型数据。数组的优势:是一种简单的线性序列

2022-03-04 10:38:06 4642 2

原创 泛型(Generics)

1 泛型1.1 泛型基本概念泛型是 JDK1.5 以后增加的,它可以帮助我们建立类型安全的集合。泛型的本质就是“数据类型的参数化”,处理的数据类型不是固定的,而是可以作为参 数传入。 我们可以把“泛型”理解为数据类型的一个占位符(类似:形式参数),即告诉编 译器,在调用泛型时必须传入实际类型。这种参数类型可以用在类、接口和方法中,分别被 称为泛型类、泛型接口、泛型方法。参数化类型,白话说就是: 1.把类型当作是参数一样传递。2.<数据类型> 只能是引用类型。1.2 泛型的好处

2022-02-28 10:49:32 640

原创 飞机大战的项目

1 简介和项目目标通过游戏项目学习整个 Java 基础知识体系,我们做了精心的设计,让每一章知识都能 获得应用。 比如:多线程用来实现动画效果、容器实现对于多发炮弹的存取和处理、常用类等等的应用。寓教于乐,让大家迅速入门,更希望通过喜闻乐见的小游戏,让大家爱上编程,爱上“程 序员”。建议:很多朋友会疑惑:“游戏项目,又不能拿到企业面试中,为什么要讲?” 这是一种太过 于功利的想法。就像,我们说:“今天吃个馒头,又不是长高,为什么要吃呢?” 游戏项目 的训练,只是为了锻炼大家的基本功,并不是直接用来企

2022-02-25 09:44:53 1663

原创 异常与错误

1 异常机制1.1 导引问题在实际工作中,我们遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输 入不一定符合你的要求;你的程序要打开某个文件,这个文件可能不存在或者文件格式不对; 你要读取数据库的数据,数据可能是空的;我们的程序再运行着,但是内存或硬盘可能满了 等等。软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是: Exception,意思是例外。遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理 的处理,安全的退出,而不至于程序崩溃呢?我们本章就要讲解这

2022-02-24 14:08:07 958

原创 原因是秒杀场次没有关联商品导致以下报错

原因是秒杀场次没有关联商品导致以下报错误的日志如下:2022-02-14 17:05:30.017 ERROR [gulimall-seckill,,,] 16008 --- [pool-4-thread-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled taskjava.lang.IllegalArgumentException: Values must not be 'null'

2022-02-23 15:04:21 871

原创 Java的常用类

1 基本数据类型的包装类我们前面学习的八种基本数据类型并不是对象,为了将基本类型数据和对象之间实现互 相转化,JDK 为每一个基本数据类型提供了相应的包装类。1.1 包装类基本知识Java 是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据 类型就不是对象。但是我们在实际应用中经常需要将基本数据转化成对象,以便于操作。 比如:将基本数据类型存储到 Object[ ]数组或集合中的操作等等。为了解决这个不足,Java 在设计类时为每个基本数据类型设计了一个对应的类进行代 表,这样八

2022-02-23 13:24:14 3198

原创 数组 (Array)

1 数组的概念1.1 数组的定义数组的定义数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先 后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标) 来访问它们。数组的四个基本特点:1.长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2.其元素的类型必须是相同类型,不允许出现混合类型。3.数组类型可以是任何数据类型,包括基本类型和引用类型。4.数组变量属于引用类型,数组也是对象。建议:数组变量属于引用类型,数组也是对象,数组中的

2022-02-21 11:09:27 3681

原创 面向对象 4

1 抽象类和接口

2022-02-18 10:42:05 414

原创 面向对象 3

本章重点针对面向对象编程的三大特征:继承、封装、多态进行详细的讲解。另外还包 括抽象类、接口、内部类等概念。很多概念对于初学者来说,更多的是先进行语法性质的了 解。不要期望,通过本章学习就“搞透面向对象编程”。本章只是面向对象编程的起点,后 面所有的章节说白了都是对面向对象这一章的应用。1 继承继承是面向对象编程的三大特征之一,它让我们更加容易实现对于已有类的扩展、更加 容易实现对于现实世界的建模。 继承有两个主要作用:1.代码复用,更加容易实现类的扩展 。2.方便建模。1.1 继承的实现继承让

2022-02-17 11:10:06 458

原创 面向对象2

1 面向对象的内存分析为了让大家对于面向对象编程有更深入的了解,我们要对程序的执行过程中,内存到底 发生了什么变化进行剖析,让大家做到“心中有数”,通过更加形象方式理解程序的执行方式。JAVA 虚拟机内存模型概念,如图所示:从属于线程的内存区域(栈、计数器)JVM 的内存划分中,有部分区域是线程私有的,有部分是属于整个 JVM 进程;我们将 这部分归为一类。1.程序计数器(Program Counter Register),在 JVM 规范中,每个线程都有自己的 程序计数器。这是一块比较小的内存

2022-02-16 11:35:32 636

原创 Java的面向对象1

1 神速熟悉面向对象1.1 表格结构和类结构我们在现实生活中,思考问题、发现问题、处理问题,往往都会用“表格”作为工具。实际上,“表格思维”就是一种典型的面向对象思维。 实际上,互联网上所有的数据本质上都是“表格”。我们在这里通过从表格表示数据开 始,引入对象和类。大家就会神奇的发现,原来“表格就是对象”。我们也经常将表中的“列”,叫做“字段”,英文中统一叫做“field”。显然,field 定义了表的结构。我们可以通过增加新的 field(列),让表中所有的行增加数据:面向对象编程中,类对应表

2022-02-15 09:51:43 430

原创 thymeleaf报session.loginUser==null

错误日志如下:2021-12-24 13:54:15.568 ERROR [gulimall-product,fb7a8bdbc299fd69,522ed9b4ef0b1965,false] 5008 --- [ool-3-thread-10] org.thymeleaf.TemplateEngine : [THYMELEAF][pool-3-thread-10] Exception processing template "item": An error happened dur

2022-02-11 11:18:13 768

原创 Java的控制语句

流程控制语句是用来控制程序中各语句执行顺序 的语句,可以把语句组合成能完成一定功能的小逻辑模块。控制语句分为三类:顺序、选择 和循环。“顺序结构”代表“先执行 a,再执行 b”的逻辑。比如,先找个女朋友,再给女朋友 打电话;先订婚,再结婚; “条件判断结构”代表“如果…,则…”的逻辑。比如,如果女朋友来电,则迅速接电 话;如果看到红灯,则停车; “循环结构”代表“如果…,则重复执行…”的逻辑。比如,如果没打通女朋友电话, 则再继续打一次; 如果没找到喜欢的人,则再继续找。 顺序结构即按照书写顺序执行

2022-01-13 14:00:28 459

原创 桌球小游戏

1 项目需求:桌球在球桌中按照一定线路和角度移动,遇到边框会自动弹回。要求:即使看不太懂,也要照着敲如下游戏代码,至少 5 遍。要求所有字符和源文件一致。 如果报异常,请细心看所在行和老师代码有何区别。现阶段不需要理解代码的语法功能,只 要按照代码结构输入代码,能够经过调试实现代码的正常运行即可。 下面我们将分以下四个步骤来实现桌球游戏:第一步:创建项目和窗口。第二步:加载两个图片。第三步:实现动画,小球沿着水平方向移动并做边界检测。第四步:实现小球沿着任意角度飞行(会用到初中学习的三角函数,

2022-01-10 14:54:45 3091

原创 贪吃蛇的小程序

1 创建项目1.打开微信开发者工具如图所示的界面,点击“+2.填写项目以后,点击确定即可。如图所示:2 编程1.编写index.wxml的代码如下:<view class="container"> <canvas style="width:100%;height:100%;" canvas-id="firstCanvas" bindtouchstart="canvasStart" bindtouchmove="canvasMove" bindtouchend="canvasE

2022-01-06 13:06:46 6203 2

原创 地图、canvas-动画

1 地图1.编写module.wxml的代码如下:<map longitude="25.762914" markers="{{markers}}" style="width: 375px; height: 200px;"></map><button bindtap="getPos">获取我的位置</button> 如图所示:2.编写module.js的代码如下:Page({ data:{ markers: [{

2022-01-06 09:57:04 714

原创 wxml中的引用、wxss、view组件-flex布局、swiper组件、基础内容组件、表单组件、 操作反馈、媒体组件

1 wxml中的引用1.编写item.wxml的代码如下:<view>我是item.wxml</view><import src="c.wxml"/><template name="item"> <text>我是item.wxml里的{{name}}</text></template>如图所示:2.编写c.wxml的代码如下:<template name="c"> <tex

2022-01-05 16:14:23 1525

原创 微信小程序入门、目录结构配置、逻辑层注册程序和注册页面、作用范围及模块化、视图层、数据绑定、for循环、事件处理

1 小程序入门1.app.js的代码如下:// app.jsApp({ onLaunch() { // 展示本地存储能力 const logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorageSync('logs', logs) // 登录 wx.login({ success: res => { // 发送 res.c

2022-01-04 16:22:51 499

原创 微信小程序开发工具与Node.js的安装

1 安装1.1 下载与安装微信开发工具1.下载的链接如下:https://developers.weixin.qq.com/miniprogram/dev/devtools/devtools.html如图所示:说明下载成功!2.选中,点击右键“以管理员算法运行”,如图所示:3.进入欢迎界面点击下一步,即可!4.点击我接受,如图所示:5.修改路径,点击安装。如图所示:6.点击完成即可,如图所示:7.使用自己微信扫描登录,如图所示:8.登录之后会进入到如图所示的界面:1.2

2022-01-01 14:02:24 5201

原创 NSudo-关闭win10系统更新

NSudo-关闭win10系统更新前言:当win10更新过一次后,windows update就会以另一个用户创建计划任务和服务,导致你这个用户无权限修改它创建的计划任务和服务,会出现下面这种情况:解决办法:使用Nsudo打开计划任务和服务便可 以最高权限修改计划任务或服务教程:运行对应版本文件夹里的NSudo.exe程序(一般x64)在下面框里填入下面命令点运行:计划任务:C:\Windows\System32\taskschd.msc服务:C:\Windows\Syste

2021-12-31 14:21:00 2362

原创 熔断,降级,限流,网关流控,服务链路追踪

1 熔断/降级/限流1.1 简介1.1.1 熔断A服务调用B服务某个功能,由于网络不稳定问题,或者B服务卡机,导致功能时间超长。如果这样的次数太多,我们就可以直接将B服务断路(A不再请求B接口),凡是调用B服务就直接返回降级数据,不必等待B服务的超长执行,这样B服务的故障问题,就不会级联影响到A。1.1.2 降级整个网站处于流量高峰期,服务器压力剧增,根据当前业务情况及流量,对一些服务和页面进行有策略的降级(停止服务,所有调用直接返回降级数据),以此缓解服务器资源的压力,以保证核心业务的正常运行,

2021-12-24 13:48:55 499

原创 秒杀服务,秒杀系统设计与实现

1 秒杀设计1.1 秒杀业务秒杀具有瞬间高并发特点,针对这一特点,必须要做限流+异步+缓存(页面静态化)+独立部署。限流方式:前端限流,一些高并发的网站直接在前端页面开始限流,例如:小米的验证码设计。Nginx限流,直接负载部分请求到错误的静态页面:令牌算法,漏斗算法。网关限流,限流过滤器。代码中使用分布式信号量。RabbitMQ限流,chanel.basicQos(1),保证发挥所有服务器的性能。1.2 秒杀流程 1.3 秒杀系统设计1.3.1 秒杀(高并发)系统关注的问题服务单一

2021-12-23 15:22:15 1048

原创 支付宝沙箱,支付加密,内网穿透,支付宝新版SDK,支付回调,支付收单

1 支付宝支付1.1 蚂蚁金服开放平台https://open.alipay.com/platform/home.htm1.2 沙箱环境https://openhome.alipay.com/platform/appDaily.htm如图所示:1.2.1 密钥设置采用RSA2非对称加密方式,如图所示:支付宝密钥生成工具下载:https://opendocs.alipay.com/open/291/105971生成密钥,如图所示:支付宝沙箱 -> 设置公钥:商户公钥,如图所示

2021-12-21 17:29:10 1473

原创 订单服务,订单确认、订单接口幂等、订单验价、锁定库存

1 Docker安装RabbitMQdocker run -d --name rabbitmq \-p 5672:5672 -p 25672:25672 -p 15672:15672 \-e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin \--restart=always \rabbitmq:management如图所示,说明安装成功!通过浏览器访问:http://192.168.56.10:15672/,访问成功!5

2021-12-20 16:17:21 196

原创 购物车实现,用户身份鉴别,购物车操作

1.创建购物车服务1.1.创建购物车服务模块1.选中gulimall右键点击New–>Module,如图所示:2.选择Spring Initializr和JDK版本,点击Next。如图所示:3.填写项目信息,点击Next。如图所示:4.选择如图所示的依赖即可!5.点击Finish,如图所示:6.在微服务聚合添加的代码如下:<!--购物车服务--><module>gulimall-cart</module>如图所示:7.gulimall-ca

2021-12-15 13:00:56 267

原创 单点登录SSO,JWT实现无状态登录,自定义网关过滤器处理登录验证

1 单点登录(SSO)SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。1.1 Cookie问题电商平台通常由多个微服务组成,每个微服务都有独立的域名,而cookie是有作用域的。查看浏览器控制台:domain:作用域名,domain参数gulimall.comsearch.gulimall.comitem.gulimall.comgulimall.com√√√search.g

2021-12-13 12:40:48 470

原创 账号登录,社交登录,分布式Session

1 账号密码登录1.1 后台接口实现1.编写LoginController的代码如下: /** * 用户登录:账号密码登录 * @param vo * @return */ @PostMapping("/login") public String login(UserLoginVO vo, RedirectAttributes redirectAttributes, HttpSession session) { // 调用远程接

2021-12-10 10:31:08 878

原创 认证服务,短信验证码,MD5加密,用户注册细节

1 认证中心服务搭建1.1 创建认证中心微服务模块1.选中gulimall,右键点击New–>Module,如图所示:2.选择Spring Initializr和JDK版本,点击Next。如图所示:3.修改子项目的内容,并点击Next。如图所示:4…选择相应的依赖,点击Next。如图所示:5.点击Finish即可,如图所示:6.在gulimall中pom.xml,聚合服务代码如下: <!--认证服务--> <module>gulimall-auth&lt

2021-12-09 13:55:54 200

原创 商品详情页,线程与异步编排,页面静态化改造

1 商品详情1.1 搭建域名环境1.域名映射的代码如下:192.168.56.10 item.gulimall.com如图所示:2.网关配置的代码如下:在这里插入代码片配置为如图所示:3.Nginx静态资源,如图所示:4.模板页面item.html放入到gulimall-product商品服务的templates目录下,静态资源路径加前置 /static/item/,如图所示:1.2 商品详情VO模型抽取1.编写SkuItemVO的代码如下:在这里插入代码片如图所示:2.编

2021-12-08 10:27:57 2266

原创 商城业务-商品检索服务,基于Elastic Search完成商品检索

1 构建商品检索页面1.1 引入依赖<!--thymeleaf模板引擎--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--热更新--><dependency>

2021-12-03 10:23:31 1316

原创 整合Redis缓存改造三级分类,并解决缓存击穿、穿透、雪崩、一致性问题

1 缓存1.1 缓存使用为了系统性能的提升,一般都会将部分数据放入缓存中,达到快速响应的目的。而数据库承担数据落盘工作。哪些数据适合放入缓存?即时性、数据一致性要求不高的访问量大且更新频率不高的数据(读多,写少)举例:电商类应用,商品分类,商品列表等适合缓存并加一个失效时间(根据数据更新频率来定),后台如果发布一个商品,买家需要5分钟才能看到新的商品,一般还是可以接受的。1.2 Cache-Aside模式边缘缓存模式(Cache-Aside Pattern),即按需将数据从数据存储加载到缓存中

2021-12-01 09:57:38 1351

原创 性能压测:压力测试,性能监控,优化QPS,Nginx动静分离

1 性能监控1.1 JVM架构运行时数据区:方法区:最重要的内存区域,多线程共享,保存了类的信息(名称、成员、接口、父类),制是重要的组成部分,动态进行类操作的实现;堆内存(Heap):保存对象的真实信息,该内存牵扯到释放问题(GC);栈内存(Stack):线程的私有空间,在每一次进行方法调用的时候都会存在有栈帧,采用先进后出的设计原则;本地变量表;局部参数或形参,允许保存有32位的插槽(Solt),如果超过了32位的长度就需要开辟两个连续性的插槽(long、double)—— volatil

2021-11-30 10:52:39 1218

原创 商城系统架构,首页渲染三级分类及搭建域名访问商城

1 商城系统介绍1.1 技术方案前后端分离服务端模板渲染(选择)商品详情页面静态化改造(优化)1.2 动静分离架构2 模板引擎Thymeleaf2.1 Thymeleaf介绍官方文档:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html2.2 引入依赖gulimall-product商城服务中引入Thymeleaf相关依赖的代码如下:<!--thymeleaf模板引擎--><depende

2021-11-29 10:02:17 122

原创 构建检索服务及商品上架到ES库

1 创建检索服务模块1.1 ElasticSearch-Rest-Client1)9300:TCPspring-data-elasticsearch:transport-api.jarSpring Boot 版本不同,transport-api.jar不同,不能适配 elasticsearch 版本官方7.x已经不建议使用,8以后就要废弃9200:HTTPJestClient:非官方,更新慢RestTemplate:模拟发HTTP请求,ES很多操作需要自己封装,很麻烦HttpClient/

2021-11-26 10:19:19 1217

原创 ElasticSearch环境配置

1 ElasticSearch概念 官网介绍:https://www.elastic.co/cn/what-is/elasticsearch/官网学习文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html1.1 ElasticSearch与MySQL的比较MySQL有事务性,而ElasticSearch没有事务性,所以你删了的数据是无法恢复的。ElasticSearch没有物理外键这个特性,如果你

2021-11-25 11:35:02 1041

原创 仓储服务 - 仓库管理,采购管理 ,SPU规格维护

1 仓储服务开发配置1.1 加入到Nacos注册中心spring: application: name: gulimall-ware #应用名 cloud: nacos: discovery: server-addr: 192.168.56.10:8848 #nacos注册地址 namespace: 7e792cf1-5967-482a-89f1-d12c806b16bf #命名空间 group: dev #分组

2021-11-24 12:31:49 209

原创 商品维护-发布商品、商品管理、SPU管理

1 发布商品流程 发布商品分为5个步骤:1.基本信息。2.规格参数。3.销售属性。4.SKU信息。5.保存完成。2 发布商品-基本信息 2.1 会员等级-会员服务2.1.1 会员服务-网关配置1.在网关增加会员服务的路由配置的代码如下:server: port: 90spring: application: name: gulimall-gateway cloud: nacos: discovery: server-addr:

2021-11-23 16:09:13 467

原创 商品服务 - 销售属性维护,属性分组与属性关联

1 销售属性-CRUD1.1 数据表结构说明销售属性和规格参数(基本属性)共用同一张表pms_attr通过attr_type来区分:0:销售属性。1:基本属性。2:既是销售属性又是基本属性。2 属性分组与属性关联-查询2.1 功能描述1.在属性分组页面 ,点击 关联 ,弹出 属性分组与属性关联列表对话框。如图所示:2.2 APIGET /product/attrgroup/{attrgroupId}/attr/relation2.3 后台接口实现1.编写AttrGroupCont

2021-11-22 14:46:12 515

Nacos动态配置原理分析

客户端是通过一个定时任务来检查自己监听的配置项的数据的,一旦服务端的数据发生变化时,客户端 将会获取到最新的数据,并将最新的数据保存在一个 CacheData 对象中,然后会重新计算 CacheData 的 md5 属性的值,此时就会对该 CacheData 所绑定的 Listener 触发 receiveConfigInfo 回调。

2020-11-23

MyBatis-Plus入门.pdf

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

2020-07-08

IDEA、方法.docx

IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写。所以,需要有JRE运行环境并配置好环境变量。 它可以极大地提升我们的开发效率。可以自动编译,检查错误。在公司中,使用的就是IDEA进行开发。

2020-05-07

流程控制语句以及判断和循环语句.docx

在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果。有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现 我们要完成的功能。

2020-05-06

数据类型转换、运算符、方法入门.docx

在char类型和int类型计算的过程中,char类型的字符先查询编码表,得到97,再和1求和,结果为98。char类型提升

2020-05-05

人们案例、常量、变量 .docx

第一个Java入门程序,主要是讲解Java入门以及main方法等作用,常量的种类分配,变量的4类八种,如何定义,使用及其注意事项等!

2020-05-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除