自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Flying_Fish_roe的博客

我是Java开发者,热爱编程,追求技术的深度和广度。在我的博客中,分享关于Java编程语言、开发技巧、最佳实践以及行业动态的内容。欢迎来到我的博客,和我一起探讨Java世界的无限可能!

  • 博客(1910)
  • 收藏
  • 关注

原创 vue.js组件开发

在 Vue.js 中,组件是构建 UI 界面的基本单位,通常由模板、逻辑和样式组成。每个组件封装了一块独立的功能,并可以通过属性(Props)和事件(Events)与其他组件进行交互。独立性:每个组件封装了自己的数据、方法和生命周期钩子,不依赖于其他组件的实现。复用性:组件可以在多个地方使用,达到代码复用的目的。组合性:可以将多个组件嵌套组合成一个更复杂的界面。高效的代码管理:组件封装了相关的 HTML、CSS 和 JavaScript,使得代码结构更清晰,易于维护。复用性强。

2024-12-10 15:33:15 519

原创 ecmascript标准

ECMAScript 是一种脚本语言的标准,由 ECMA 国际(前身为欧洲计算机制造商协会,ECMA)组织于 1997 年首次发布。ECMAScript 为 JavaScript 提供了统一的语言规范,定义了语言的基本结构和行为。这包括如何处理变量、数据类型、控制结构、函数等基本元素。ECMAScript 不直接定义实际的编程语言,而是定义了语言的核心规范。具体的实现方式则由各个浏览器或引擎(如 V8、SpiderMonkey、Chakra)负责。

2024-12-10 15:25:32 497

原创 react框架

React 中的组件可以通过函数或类来定义。函数组件是较为简洁的方式,通常用于没有内部状态的场景。而类组件则用于需要管理组件生命周期和状态的场景。React 是一个强大且灵活的库,它通过组件化开发、虚拟 DOM 和高效的更新机制,使得构建现代网页应用变得更加高效和便捷。无论是小型项目还是大型应用,React 都能够提供出色的性能和可维护性。随着 React 生态系统的不断发展,它已经不仅仅是一个前端库,它正在成为构建整个 Web 应用的基础。

2024-12-10 15:22:25 657

原创 javascript网页设计案例

JavaScript 是一种高级的编程语言,广泛应用于网页开发中。它最初的设计目的是为了在网页中实现动态效果和交互功能。随着互联网技术的发展,JavaScript 不再仅仅局限于客户端脚本语言,它已经成为了完整的应用开发框架的核心语言。JavaScript 运行在浏览器中,通过 DOM(文档对象模型)与 HTML 和 CSS 紧密交互,从而实现网页的动态效果和用户交互。DOM(文档对象模型)是浏览器用来表示网页结构的编程接口。

2024-12-10 15:19:44 715

原创 vue.js

在众多的前端框架中,Vue.js作为一个渐进式JavaScript框架,凭借其简单易学、灵活高效的特点,吸引了大量开发者的关注和使用。Vue.js是由尤雨溪(Evan You)于2014年开发的,它的出现不仅改善了前端开发的效率,也为开发者提供了更多的创新空间。组件是Vue.js的基本构建块,开发者可以将UI分解成多个组件,每个组件管理自己的状态和行为。通过Vue Router,开发者可以很容易地实现页面间的动态切换,并且通过Vuex集中管理应用的状态,保证了单页面应用的高效和流畅性。

2024-12-10 15:09:39 346

原创 Vue3 生命周期钩子顺序混乱

创建(Creation):组件实例被创建,数据观测和事件配置完成。挂载(Mounting):组件模板被渲染并插入到DOM中。更新(Updating):组件的数据变化导致视图的重新渲染。销毁(Unmounting):组件被移除,相关的资源和事件监听器被清理。在Vue 3中,生命周期钩子与Vue 2类似,但在组合式 API下,钩子的使用方式有所不同。createdmountedupdated(替代Vue 2的unmounted(替代Vue 2的destroyed。

2024-12-10 13:13:37 642

原创 Vue3 响应式数据未更新

Vue 3 引入了全新的响应式系统,基于 ES6 的Proxy实现,取代了 Vue 2 中的。这一改进带来了更高的性能和更强的功能,解决了 Vue 2 响应式系统中的一些局限性。reactive:用于将一个对象转化为响应式对象,适用于复杂数据结构。ref:用于创建一个包含单一值的响应式引用,适用于基本数据类型。computed:用于创建计算属性,根据响应式数据自动更新。watch:用于监听响应式数据的变化,执行副作用操作。${

2024-12-10 13:12:40 835

原创 Vue3 组件注册失败

在 Vue 3 中,组件是构建用户界面的基本单元。组件可以是全局注册的,也可以是局部注册的,根据不同的需求选择合适的注册方式至关重要。Header.vue:网站头部Footer.vue:网站底部:文章列表:单篇文章在开发过程中,开发者发现组件无法正确渲染,浏览器控制台报错。接下来,我们将分析和解决这一问题。组件注册是 Vue 3 应用开发中的基础环节,正确的组件注册不仅确保组件的正常渲染和功能实现,还提升了代码的可读性和可维护性。

2024-12-10 13:11:16 1072

原创 Vue3 路由配置错误

Vue Router是Vue.js官方提供的路由管理器,用于构建单页面应用(SPA)的前端路由。它允许开发者在不同的URL路径之间导航,并根据路径动态加载和显示相应的组件。通过Vue Router,开发者可以轻松地实现页面间的跳转、嵌套路由、动态路由参数、导航守卫等功能,提升应用的可维护性和用户体验。Vue 3的Vue Router是构建单页面应用的核心工具之一,提供了丰富的功能和灵活的配置选项。

2024-12-10 13:07:36 951

原创 Vue3 状态管理问题(Vuex / Pinia)

状态管理是指在应用中集中管理和维护数据状态的过程。在单页面应用(SPA)中,组件之间的数据共享和通信变得尤为重要。随着应用规模的扩大,手动管理组件间的状态交互变得复杂且容易出错。状态管理工具应运而生,旨在解决这些问题,提供一个集中、可预测和易于维护的方式来管理应用状态。Vuex是 Vue 官方提供的状态管理库,旨在为 Vue 应用提供集中式的状态管理方案。Vuex 的核心理念是单一状态树(Single Source of Truth),即所有的状态集中存储在一个对象中,组件通过读取和修改这个对象来共享数据。

2024-12-09 21:55:35 545

原创 Vue3 序列化与反序列化问题

序列化是将数据结构或对象转换为可存储或传输的格式的过程。常见的序列化格式包括JSON、XML、二进制等。序列化后的数据可以被存储在文件中、发送到服务器,或在不同系统之间传输。反序列化则是将序列化后的数据重新转换回原始的数据结构或对象的过程。这使得序列化和反序列化成为数据持久化和跨系统通信的基础。在某些复杂场景下,可能需要根据具体需求编写自定义的序列化与反序列化逻辑,以确保数据的完整性和正确性。示例:自定义序列化函数== null) {// 处理特殊类型});});

2024-12-09 21:54:50 603

原创 Vue3 TypeScript集成问题

Vue 3 完全支持 TypeScript,并且官方提供了详细的文档指导。Vue 3 采用了新的 Composition API,这一 API 天生适合与 TypeScript 一起使用,能够通过类型推导和类型检查来提高代码的可靠性和开发效率。Vue 3 为全局定义了一些类型,使得我们在编写 Vue 组件时能获得更好的类型推导支持。这是 Vue 3 中用于定义组件的一个 API,它会自动提供组件的类型推导,使得 TypeScript 能够更好地进行类型检查。ref和reactive。

2024-12-09 21:54:06 484

原创 Vue3 测试覆盖不足

测试覆盖率不足是许多Vue 3项目中的常见问题,它直接影响到应用的稳定性和开发效率。通过理解测试的价值和重要性,选择合适的测试工具,制定合理的测试策略,并结合自动化测试和持续集成,开发者可以有效提升测试覆盖率,确保代码质量和应用稳定性。要提高测试覆盖率,开发者不仅需要关注数量,还要关注质量,确保关键功能和业务逻辑都经过充分的验证。同时,避免过度测试和冗余测试,保持测试代码的可维护性,才能真正提升项目的质量和可持续发展能力。

2024-12-09 21:53:28 472

原创 Vue3 性能瓶颈

Vue 3 提供了丰富的性能优化机制,但要充分利用这些优化,我们需要首先理解 Vue 3 的性能机制,特别是虚拟DOM和响应式系统。模块化组件设计:将组件拆分成更小的部分,减少单个组件的计算量。减少响应式数据:只将必要的状态数据声明为响应式,减少不必要的性能开销。使用虚拟列表和分页:对于数据量大的列表,使用虚拟列表或分页技术减少渲染的DOM节点数量。懒加载与代码分割:按需加载路由、组件和资源,避免一次性加载过多数据。动画与过渡优化:使用轻量级的动画,避免复杂的JavaScript动画。事件优化。

2024-12-08 19:31:39 1066

原创 Vue3 AOT编译错误

AOT(Ahead-of-Time)编译是指在应用构建阶段提前编译模板和其他代码,而不是在浏览器中运行时进行编译。在传统的 JIT(Just-in-Time)编译中,模板会在浏览器运行时被编译成 JavaScript 代码,这会增加应用的启动时间。AOT 编译则是在构建时进行编译,从而将模板转化为 JavaScript 代码,这样可以避免在运行时的编译过程,提升性能。Vue 3 和 AOT 编译结合使用,能够显著提升应用的启动性能和运行效率。

2024-12-08 19:30:36 669

原创 Vue3 可访问性问题

Vue 3 是一个强大的框架,能够帮助开发者快速构建现代化的 Web 应用。然而,在实际开发过程中,忽视可访问性会导致一些用户无法顺利使用应用,特别是对于残障人士来说,可访问性是基础需求。通过本文的讨论,我们了解了 Vue 3 中常见的可访问性问题,并提供了相应的解决方案和最佳实践。为了打造更加友好、无障碍的 Web 应用,开发者应时刻关注可访问性问题,确保应用对所有用户都友好。

2024-12-07 14:27:24 894

原创 Vue3 国际化实现错误

国际化(Internationalization,简称 i18n)是指在开发应用程序时,使其能够支持多种语言和地区的能力。它包括文本翻译、时间和日期格式的适配、货币格式的转换等内容。国际化使得开发者可以在应用中为不同地区的用户提供个性化的体验。在 Vue 3 中实现国际化的过程中,开发者常常会遇到诸如翻译资源加载失败、语言切换不生效、翻译内容未更新等问题。通过本文的探讨,我们可以看到这些问题的根本原因和解决方法。

2024-12-07 14:26:28 1129

原创 Vue3 持久化问题

数据持久化指的是将应用中的状态或数据存储到浏览器的本地存储中,以便在页面刷新、关闭浏览器或跨会话时保持其状态不变。常见的持久化存储方式包括IndexedDB和Cookie。在Vue 3应用中,持久化通常用于保存用户的个性化设置、登录状态、购物车信息等。通过数据持久化,应用能够提供更流畅的用户体验,避免用户每次访问时都需要重新设置或输入。如果现有的持久化方式无法满足需求,开发者可以编写自定义的持久化逻辑,通过使用原生的或indexedDB来管理数据的存储和清理。

2024-12-06 20:06:07 977

原创 Vue3 部署配置错误

开发阶段:开发者使用 Vue 3 构建应用,使用vue-cli或Vite等工具进行开发,调试和构建。构建阶段:应用完成后,开发者执行构建命令(例如或vite build)来生成用于生产环境的优化代码,通常会生成一个dist文件夹。部署阶段:将构建后的应用部署到生产服务器,通常会使用云服务平台(如 Vercel、Netlify、AWS、阿里云等)或传统的 Web 服务器(如 Nginx、Apache)。合理配置环境变量:确保开发、测试和生产环境使用不同的配置文件,避免错误配置影响部署。

2024-12-06 20:04:43 752

原创 java 的反射是如何实现

换句话说,反射提供了动态获取类的构造方法、字段、方法等信息的能力,并能动态调用这些成员。:使用这些反射对象,可以在运行时调用类的方法、访问类的字段、创建类的实例。对象是由类加载器在加载类时通过解析类文件的字节码信息创建的,它在 JVM 的方法区中维护,描述了类的所有信息。它封装了方法的名称、返回类型、参数类型、修饰符等信息,并提供方法用于调用对象实例或类上的方法。:当 Java 程序首次使用某个类时,类加载器(ClassLoader)会加载这个类的字节码,并创建相应的。反射可以在运行时动态调用类的方法。

2024-12-06 20:03:24 761

原创 java 的反射是如何实现

Java 的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。可以说反射机制就是在运行状态中,对于任意一个类,可以知道这个类的所有属性和方法。下面是Java反射的实现步骤总结:获取类的 Class 对象:可以通过调用类的静态属性 class 来获取类的 Class 对象,例如:Class clazz = MyClass.class;

2024-12-05 15:23:08 754

原创 Override 和 Overload 的区别

Override(重写)是指子类提供了一个与父类在名称、参数列表、返回类型完全相同的方法。它是面向对象编程中实现多态性的一种方式。通过方法重写,子类可以提供父类方法的具体实现,从而在运行时动态地调用相应的方法。Overload(重载)是指在同一个类中定义了多个具有相同方法名但参数列表(参数类型或数量)不同的方法。方法的重载与返回类型无关。重载的核心在于编译时的静态多态性(静态绑定),即根据传入的参数类型和数量来决定调用哪个版本的方法。Override(重写):用于子类修改或替换父类中的方法实现。

2024-12-05 15:22:21 1074

原创 类序列化时类的版本号的用途,如果没有指定一个版本号,系统是怎么处理的?如果加了字段会怎么样?

序列化(Serialization):将对象的状态转换为字节流的过程,以便将其保存到文件中、传输到网络上或者存储在数据库中。反序列化(Deserialization):将字节流恢复成对象的过程,恢复对象的状态。Java 提供了接口来支持序列化和反序列化。当一个类实现了接口,Java 就能够对该类的对象进行序列化。是 Java 序列化机制中一个非常重要的概念,它是一个与序列化类相关联的版本控制标识符,用于验证在反序列化时,序列化对象和当前类的版本是否一致。是一个long用途。

2024-12-04 15:36:37 418

原创 LinkedHashmap 的底层实现

是 Java 中java.util包的一部分,继承自HashMap,并实现了Map接口。它的显著特点是提供了按插入顺序或访问顺序遍历元素的能力。按插入顺序遍历:元素按它们被插入的顺序进行遍历。按访问顺序遍历:在访问(调用get方法)一个元素后,该元素会被移动到最后,因此遍历时按照最近访问的顺序排列。是一种结合了HashMap和双向链表特性的 Java 集合,它在提供快速数据存取的同时,维护了数据的插入顺序或访问顺序。

2024-12-04 15:35:56 419

原创 4 亿个 int 数,如何找出重复的数(用 hash 方法,建一个 2 的 32 次方个 bit 的 hash 数组,每取一个 int 数,可 hash 下 2 的 32 次方找到它在 hash

在处理 4 亿个整数并找出其中重复项的问题中,使用位数组(Bit Array)是一种高效且节省内存的解决方案。通过利用BitSet类,Java 能够有效地表示和管理大量布尔值,避免了使用传统数据结构所带来的高内存开销。同时,结合哈希算法、文件 I/O 操作和内存管理等技术,可以进一步优化大规模数据的处理。中心思想:在 Java 中处理大规模数据时,合理选择和使用数据结构(如BitSet)和算法(如哈希算法、外部排序等)可以大幅提高效率和性能。

2024-12-04 15:34:50 430

原创 4 亿个 url,找出其中重复的(考虑内存不够,通过 hash 算法,将 url分配到 1000 个文件中,不同的文件间肯定就不会重复了,再分别找出重复的)有 1 万个数组,每个数组有 1000

这篇文章详细讨论了如何在 Java 中处理两个大数据问题:找出 4 亿个 URL 中的重复项,以及从 1 万个降序数组中找出最大的 N 个数。通过结合使用哈希算法、外部排序、最小堆、二分查找等技术,我们可以有效地在有限内存下处理大规模数据。中心思想:处理大数据时,单纯依赖内存是不切实际的。我们需要结合使用多种数据结构(如哈希表、堆)和算法(如哈希算法、二分查找)来优化性能,并借助文件 I/O 操作分布数据存储和处理,以在有限的资源下高效解决问题。

2024-12-04 15:34:13 287

原创 .原子类,线程安全的对象,异常的处理方式

原子类(Atomic Classes)是 Java 提供的一组线程安全的类,它们主要位于包中。这些类通过底层的硬件指令(如 CAS 操作,即 Compare-And-Swap)来实现原子操作,以保证在多线程环境下的正确性。线程安全对象是指在多线程环境下,多个线程同时访问和修改该对象时,不会导致数据不一致或程序异常。同步(Synchronized):通过使用关键字来控制方法或代码块的访问,从而保证同一时刻只有一个线程能够执行它。使用线程安全类:如等。不可变对象。

2024-12-04 15:33:42 301

原创 对表做统计时可直接看 schema info 信息,即查看表的系统信息

Schema 信息是指数据库的结构定义或组织,包括表、视图、索引、约束、触发器、存储过程、函数等的定义。Schema 信息不仅仅描述了数据库的物理结构,还描述了其逻辑关系。在数据库系统中,schema 信息通常存储在特定的系统表(如)或数据字典中。表的列信息:列名、数据类型、默认值、是否允许NULL、主键、外键等。索引信息:索引名、唯一性、索引的列等。统计信息:表的行数、占用空间大小、索引分布等。约束信息:主键、外键、唯一约束等。在 Java 中,对。

2024-12-04 15:33:09 264

原创 用 awk 统计一个 ip 文件中 top10

awk在 Java 中,有两种方法可以统计一个 IP 文件中的 Top 10:使用外部命令(如awk)和纯 Java 实现。前者利用了系统工具的强大文本处理能力,而后者提供了更高的可移植性和灵活性。选择哪种方法取决于具体的应用场景、性能要求和开发环境。中心思想:本文介绍了如何在 Java 中使用awk进行数据统计,并讨论了如何通过纯 Java 实现相同的功能。了解这两种方法的优劣势,可以帮助开发者在实际项目中根据需求选择合适的解决方案,从而有效地处理大规模文本数据。

2024-12-04 15:32:35 654

原创 mysql定位慢查询

慢查询的定义MySQL中,慢查询是指超过设定阈值()的SQL语句。默认情况下,该时间为10秒,超过此时间的查询会记录到慢查询日志中。慢查询的影响数据库响应时间变长,影响用户体验。系统资源占用增大,可能导致其他请求受阻。定位和优化MySQL慢查询是提升系统性能的关键步骤。从开启慢查询日志到使用Java代码监控与优化,都需要从多个层面进行深入分析。通过索引优化、查询重写、缓存引入等方式,可以有效减少慢查询的发生。希望本文能为您在实际项目中解决慢查询问题提供实用参考。

2024-12-04 15:32:15 303

原创 mysql索引概念以及索引底层数据结构

索引是数据库管理系统中一种用于提高数据检索效率的数据结构。通过在表的一个或多个列上创建索引,可以显著加快数据查询的速度,但会增加插入、删除和更新操作的开销。MySQL 中索引的核心作用是快速定位数据位置,减少磁盘 I/O 操作,从而提高查询效率。主键索引 (Primary Key Index)唯一标识表中的一条记录,不允许为 NULL。唯一索引 (Unique Index)保证索引列中的值唯一,但允许存在 NULL。普通索引 (Index)用于加速查询,但无唯一性约束。

2024-12-04 15:31:44 600

原创 sql语句执行的很慢如何去分析

SQL执行慢的问题可能由多种因素引起,必须从索引、表设计、SQL语句本身及数据库配置等多个层面进行排查与优化。通过合理设计索引、分库分表、优化SQL语句及结合缓存技术,能够显著提升查询效率。结合Java代码示例,我们可以将优化落到实处,从而实现高性能的数据库访问。

2024-12-04 15:31:06 529

原创 mysql聚集索引和非聚聚集索

聚集索引是指数据表中数据的物理存储顺序与索引顺序一致。它是一种将数据和索引绑定在一起的存储方式,每个表只能有一个聚集索引,因为数据的物理存储顺序只能有一种。在InnoDB中,主键默认就是聚集索引。如果没有定义主键,InnoDB会选择一个唯一非空索引作为聚集索引;如果没有这样的索引,InnoDB会隐式创建一个聚集索引。非聚集索引是指索引和数据分开存储,索引中只包含指向数据的指针(如主键值或行ID)。查询时需要通过索引找到指针,再访问实际数据。

2024-12-04 15:30:19 655

原创 回表查询详细解释

回表查询是指当MySQL在使用二级索引(非聚簇索引)查询数据时,因索引中不包含所需的全部字段,需通过索引定位到对应的数据行,然后回到主表(或聚簇索引)中读取完整数据。查询条件匹配索引(扫描索引树)。获取主键值。根据主键值回到主表查询所需字段。出现在使用二级索引的查询中。当索引无法覆盖查询时(即索引中不包含所有查询字段),触发回表。回表查询是MySQL中影响性能的一个重要因素,但通过合理设计覆盖索引、减少不必要字段查询、优化排序与分组等方式,可以有效降低回表查询的频率。

2024-12-04 15:29:41 567

原创 mysql索引创建的原则

索引是存储引擎用于快速定位数据的一种数据结构。它可以加速查询,但同时会增加写操作的成本和存储开销。利用EXPLAIN分析查询使用EXPLAIN查看查询执行计划,判断是否使用了索引。覆盖索引优化覆盖索引避免回表操作,可以通过增加查询字段到索引中实现。索引合并在某些情况下,MySQL会自动合并多个单列索引,减少回表次数。避免索引失效使用函数或运算符时可能导致索引失效。-- 索引失效定期维护索引对于频繁变动的表,索引碎片可能影响性能,建议定期优化。

2024-12-04 15:29:06 806

原创 覆盖索引详细解释

覆盖索引是指一个索引包含了查询所需要的所有列的数据,不需要回表(访问聚簇索引或表数据)即可直接满足查询需求。覆盖索引是一种非常高效的优化手段,特别适用于高频查询和只涉及部分字段的场景。通过创建覆盖索引,可以显著减少查询过程中的磁盘IO操作,从而提升性能。本文结合Java代码示例,详细说明了覆盖索引的实现方法和优化效果,为实际开发提供了实用参考。

2024-12-04 15:28:18 721

原创 mysql超大分页优化

在 MySQL 中处理超大分页时,传统的方法并不适合大数据量场景,优化方式需根据实际需求选择。本文介绍的索引优化、覆盖索引、延迟关联等方法均可以有效提升查询性能。此外,结合 Java 实现的分页代码展示了具体的应用场景。对于需要极深分页的场景,建议结合缓存或限制分页范围的方式进行合理设计,以平衡性能与用户体验。

2024-12-04 15:26:59 645

原创 mysql索引失效的原因以及场景

MySQL索引失效是查询性能优化中的重要问题,通过合理设计索引、优化查询语句以及利用Java代码动态规避索引失效,可以显著提升数据库性能。在实际开发中,务必定期检查EXPLAIN执行计划和查询性能,确保索引的正确使用。

2024-12-03 19:28:20 446

原创 mysql事务

事务(Transaction)是一组操作的集合,这些操作要么全部执行成功,要么全部回滚以保持数据一致性。事务在数据库中是用于管理和保护数据完整性的重要机制。MySQL 事务是保障数据一致性和完整性的核心机制。通过 ACID 特性,事务可以解决多操作的一致性问题。本文结合 MySQL 事务的理论与 Java 实现,展示了事务的应用场景和优化方式。在实际开发中,需要根据业务需求选择合适的事务隔离级别,同时关注并发性能问题,合理设计事务逻辑。

2024-12-03 19:27:50 869

原创 mysql中的sql优化

MySQL中的SQL优化是一项系统性工作,需要从索引设计、查询优化、表设计和分区分表等多个层面进行考虑。通过合理使用索引、优化查询语句、缓存高频数据和分页处理等方法,可以显著提升查询性能。

2024-12-03 19:27:09 690

Redis的介绍以及简单使用

redis压缩包

2023-09-20

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

TA关注的人

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