自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(251)
  • 收藏
  • 关注

原创 在日本工作的外国工程师的利弊

除了女性工程师和资深工程师的利用也在进展中,正如上文所述,由于日本的人口减少无法避免,仅在国内增加IT工程师的供给是有限的。选择在日本工作,以便在自己喜欢的国家生活的外国工程师也不在少数。IT工程师的需求正在增加,但新入职者正在减少,预计未来劳动力将进一步减少,IT工程师的短缺问题将变得更加严重。由于不同国家的工程师工资水平不同,不能一概而论,但如果与母国相比,日本的工资水平更高,则在日本企业工作是一个不错的选择。近年来,随着所谓的“第四次工业革命”的到来,作为应对商务的承担者,IT工程师的需求正在扩大。

2024-06-10 13:57:52 546

原创 # JavaScript动态的为元素添加事件

在上面的例子中,我们首先通过getElementById方法获取了id为myButton的按钮元素,然后定义了一个名为handleClick的函数作为点击事件的处理函数。在上面的例子中,我们将点击事件绑定到id为parentElement的父级元素上,然后在事件处理函数中判断事件的目标元素是否为button,如果是,则触发相应的处理逻辑。在上面的例子中,我们获取了id为myButton的按钮元素,然后直接为其onclick属性赋予了一个匿名函数,当按钮被点击时,会触发这个匿名函数。

2024-06-10 13:43:26 314

原创 区分JS中的undefined,null,““,0和false

在JavaScript中,我们经常会遇到undefined、null、""、0和false这几个值,这些值看起来很相似,但实际上它们之间有着很大的区别。综上所述,undefined、null、""、0和false之间的区别非常明显。undefined表示一个未定义的值,通常用于表示变量没有被赋值或者对象中没有该属性。需要注意的是,0不等于undefined、null和false。需要注意的是,false不等于undefined、null和0。false表示布尔值false,通常用于表示一个逻辑上的假值。

2024-05-07 17:54:04 689

原创 区分function, new function, new Function

在本文中,我们将详细介绍这些方式的区别,并提供相应的代码示例。new function可以用来创建一个新的函数对象,但它的使用方式相对较少,因为它的行为在不同的JavaScript引擎中可能会有不同的结果。new Function与new function有着不同的行为,它可以用来创建一个新的函数对象,但它的使用方式更加灵活。与new function不同,new Function接受的参数也是字符串形式的函数体,但它的参数列表可以是任意数量的参数,并且可以包含函数体的完整定义。

2024-05-07 17:50:46 328

原创 获取JavaScript用户自定义类的类名称

综上所述,我们可以通过构造函数的name属性、Object.prototype.toString方法或者ES6的class关键字来获取JavaScript用户自定义类的类名称。在上面的例子中,我们使用ES6的class关键字定义了一个名为Car的类,并创建了一个名为car的实例。该方法可以返回对象的类型信息,包括类名称。在JavaScript中,通过构造函数创建的类可以使用构造函数的name属性来获取类的名称。如果我们是使用ES6的class关键字来定义类,我们可以通过类的静态属性来获取类的名称。

2024-05-07 17:38:03 533

原创 面试必备:搭建网站扫码登录的功能设计

在后端服务中,我们需要处理扫码登录的逻辑。首先,当用户访问网站时,后端服务会生成一个唯一的登录标识,并将该标识存储在数据库中。后端服务接收到标识后,会在数据库中查找对应的登录标识,并将用户信息返回给前端页面,完成登录过程。首先,我们需要一个网站,其次,我们需要一个用于生成二维码的库,这里我们选择使用qrcode.js库。接着,我们需要一个后端服务来处理扫码登录的逻辑,这里我们选择使用Node.js来实现。接着,我们使用qrcode.js库的API来生成二维码,并将生成的二维码显示在页面上。

2024-05-07 17:32:43 380

原创 面试必备:设计一个成功的微服务,9个基础知识

总结 设计一个成功的微服务需要综合考虑领域驱动设计、RESTful API、容器化、服务注册与发现、负载均衡、断路器模式、日志和监控、安全性以及持续集成和持续部署等多个方面。希望以上的基础知识和示例代码可以帮助大家更好地理解和设计微服务架构,从而在面试中脱颖而出。因此,设计合适的RESTful API对于微服务的成功至关重要。容器化技术(如Docker)可以帮助将微服务部署为独立的容器,从而提高了部署的灵活性和可移植性。微服务架构已经成为许多企业的首选,因为它可以提高系统的灵活性、可伸缩性和可维护性。

2024-05-07 17:17:38 238

原创 面试必备:一次生产的JVM优化

JVM优化是提高Java应用程序性能的重要手段,通过合理的堆内存设置、垃圾回收器选择、线程栈调整等措施,可以有效地提高应用程序的性能和稳定性。

2024-05-07 17:10:46 306

原创 架构:数据库分库分表,何时分?怎样分?

数据库分库分表是一种常见的数据库水平扩展方案,通常在数据量大、高并发、数据隔离等情况下考虑进行分库分表。在实际操作中,可以通过水平分库、水平分表和分库分表路由来实现数据库分库分表。希望本文的内容能够帮助你更好地理解数据库分库分表的原理和实践,祝你在实际应用中取得成功!

2024-03-09 18:52:01 434

原创 架构:主备+分库?主从+读写分离?

在设计数据库架构时,主备+分库和主从+读写分离是两种常见的方案。那么,这两种方案有何不同,如何选择?本文将为你一一解答。

2024-03-09 18:01:54 413

原创 单元测试应该测什么,不应该测什么?

它可以帮助我们验证代码的正确性,提高代码的质量,减少bug的出现。但是,单元测试并不是一种万能的工具,我们需要明确单元测试应该测什么,不应该测什么。单元测试的目的是验证我们自己的代码,而不是测试第三方库或框架的功能。这样的单元测试不仅可以帮助我们保证代码的质量,还能够提高我们的开发效率。单元测试应该关注代码的业务逻辑和功能实现,而不应该测试与业务逻辑无关的内容,比如UI交互、数据库操作等。比如,对于一个函数,我们可以编写测试用例来覆盖不同的输入情况,确保函数的逻辑能够正确处理各种情况。

2024-03-08 10:46:17 405

原创 JS入门:动态的时钟、显示完整的一些方法、新年倒计时

在网页设计中,动态的时钟和倒计时是很常见的元素,它们能够增加网页的趣味性和实用性。在本文中,我们将会介绍如何使用JavaScript来实现动态的时钟和新年倒计时。使用JavaScript来实现动态的时钟和新年倒计时,这些元素不仅可以增加网页的趣味性和实用性,还可以帮助我们学习和掌握JavaScript的基础知识。新年倒计时是指距离新年的时间倒计时,我们可以使用JavaScript来实现。动态的时钟是指能够实时更新的时钟,我们可以使用JavaScript来实现。希望本文能够对初学者有所帮助。

2024-03-08 10:39:10 695

原创 从企业的运行价值链说起——我眼中的测试驱动开发(TDD)

测试驱动开发(TDD)是一种先进的软件开发方法,其核心理念是在编写功能代码之前先编写测试代码,然后再编写足够的功能代码使得测试通过。这种方法能够有效地提高软件的质量,减少bug,增加代码的可维护性和可扩展性,从而提高产品的稳定性和用户体验。在这个背景下,测试驱动开发(TDD)作为一种先进的软件开发方法,对于企业的运行价值链有着重要的影响。本文将从企业的运行价值链出发,探讨我眼中的测试驱动开发,并通过步骤和代码的方式展示其实际应用。首先,我们以一个简单的示例来说明TDD的步骤和代码。一、企业的运行价值链。

2024-03-08 10:21:43 385

原创 功能强大的JavaScript引擎--SpiderMonkey

通过使用SpiderMonkey,开发者可以体验到JavaScript在嵌入式系统中的灵活性和高效性,为智能设备的开发和创新提供了强大的支持。通过体验SpiderMonkey带来的高性能和灵活性,开发者可以更好地理解其在JavaScript世界中的重要性和价值,从而推动Web技术的不断进步。SpiderMonkey是一款由Mozilla开发的JavaScript引擎,它作为Mozilla Firefox浏览器的核心组成部分,扮演着将JavaScript代码转换为计算机可执行代码的重要角色。

2024-03-08 10:17:24 760

原创 JavaScript中实现命名空间

命名空间是一种组织和管理代码的方式,可以避免不同模块之间的命名冲突,提高代码的可维护性和可读性。在上面的代码中,我们使用对象字面量创建了一个名为MyNamespace的命名空间,然后在该命名空间中定义了一个变量myVariable和一个函数myFunction。在IIFE内部,我们可以定义私有变量和函数,并通过返回一个包含公共变量和函数的对象来暴露命名空间的公共接口。对象字面量是JavaScript中一种非常方便的方式来创建对象,我们可以使用对象字面量来组织和管理相关的函数和变量。

2024-03-08 10:03:19 439

原创 优化JavaScript脚本的性能

通过以上的学习,我们已经了解了如何通过减少全局变量、避免使用eval函数、优化循环操作、合理使用缓存、使用事件委托和压缩合并JavaScript文件等方式来优化JavaScript脚本的性能。我们可以通过使用更高效的循环方式,如使用Array的map、filter、reduce等方法,或者使用for循环时避免频繁的数组操作,来提升循环操作的性能。在生产环境中,我们可以通过压缩和合并JavaScript文件来减少文件大小和HTTP请求次数,从而提升页面加载速度和性能。实际案例:优化JavaScript性能。

2024-03-06 15:18:57 684

原创 揭开正则表达式的神秘面纱

在上面的例子中,我们首先导入了Python的re模块,然后定义了一个包含邮箱地址的文本字符串。通过这个简单的例子,我们可以看到正则表达式的强大之处。正则表达式,简称正则,是一种强大的文本匹配工具,它可以帮助我们在处理文本时更加高效地进行搜索和替换操作。通过以上的学习,我们已经成功揭开了正则表达式的神秘面纱,掌握了基本语法和实际应用技巧。除了提取文本中的信息,正则表达式还可以用于替换文本中的特定内容。在上面的例子中,我们使用sub函数和正则表达式将文本中的所有数字替换为“*”,从而实现了对敏感信息的保护。

2024-03-06 15:06:37 367

原创 JavaScript判断是页面关闭还是页面刷新

在beforeunload事件中,我们可以使用event对象的type属性来判断当前页面是被关闭还是被刷新。在Web开发中,有时我们需要在页面关闭或刷新时执行一些特定的操作,例如保存用户输入的数据或清除一些缓存数据。但是,由于页面关闭和刷新的行为非常相似,我们需要使用JavaScript来判断当前页面是被关闭还是被刷新。在这个事件中,我们可以执行一些特定的操作,例如保存数据或清除缓存。在上面的代码中,我们根据event对象的type属性来判断当前页面是被关闭还是被刷新,并在控制台中输出相应的信息。

2024-03-06 14:58:08 1654

原创 获取JavaScript用户自定义类的类名称

good7ob在JavaScript中,我们经常需要获取对象的类名称,特别是在处理用户自定义类的时候。本文将介绍如何通过不同的方法来获取JavaScript用户自定义类的类名称,包括使用原型链、class关键字和Object.create方法。我们将通过生动的语言、通顺的步骤和精美的代码示例来帮助你轻松掌握这一重要的知识点。

2024-03-06 14:52:29 557

原创 JavaScript中的prototype(原型)属性研究

通过原型,我们可以实现对象的继承和方法的共享,使得代码更加高效和可维护。子对象可以通过原型链访问父对象的方法和属性,从而实现代码的复用和扩展。实际案例:通过原型,我们可以在所有Person对象实例中共享greet方法,避免了重复定义方法,提高了代码的重用性。在JScript中,我们可以随时修改对象的原型,从而动态改变对象的行为。实际案例:通过原型继承,我们可以实现子类对父类方法的继承,并在子类中添加新的方法,实现代码的复用和扩展。实际案例:通过修改原型,我们可以动态改变对象的行为,实现对象功能的灵活扩展。

2024-03-06 14:44:20 365

原创 在JavaScript面向对象编程中使用继承

通过原型链、class关键字和Object.create方法,我们可以灵活地实现对象之间的继承关系,使代码更加清晰、可维护和可扩展。通过将子对象的原型指向父对象的实例,子对象可以继承父对象的属性和方法。实际案例:通过Object.create方法实现继承,我们可以更加灵活地指定原型对象,实现继承关系的精细控制。实际案例:通过class关键字实现继承,我们可以更加清晰地定义类和实现继承关系,使代码更易读和维护。实际案例:通过原型链实现继承,我们可以轻松地创建子类并继承父类的属性和方法,实现代码的复用和扩展。

2024-01-08 14:28:10 662

原创 单扫描的JScript版String.Format方法

单扫描的 JScript 版 String.Format 方法是一种简洁而高效的字符串格式化方法,其核心思想是通过一次扫描字符串,将占位符替换为相应的值,从而实现字符串的格式化。在这个案例中,我们首先定义了一个学生信息模板,然后通过循环遍历学生信息数据,并使用 String.Format 方法将学生信息格式化成表格的行,最后将格式化后的学生信息展示在网页中。综上所述,通过使用单扫描的 JScript 版 String.Format 方法,我们可以更加方便地对字符串进行格式化,使得代码更加清晰和易读。

2024-01-08 13:37:26 399

原创 在popup窗口中俘获事件的缺陷&修复

然而,弹出窗口中事件的捕获存在一些缺陷,可能会导致一些意外的行为。使用 postMessage 方法进行跨窗口通信:通过使用 postMessage 方法,可以在父窗口和弹出窗口之间进行安全的跨窗口通信,从而解决弹出窗口无法直接访问父窗口的问题。综上所述,通过采取一些修复方法,我们可以解决弹出窗口中事件捕获的缺陷,确保弹出窗口中的事件能够得到正确处理,同时不会影响到父窗口。弹出窗口中的事件可能会被父窗口捕获:在某些浏览器中,弹出窗口中的事件可能会被父窗口捕获,导致事件处理出现混乱。

2024-01-08 11:16:59 423

原创 Redis:RDB 和 AOF 持久化的原理是什么?

首先,让我们来了解一下RDB持久化的原理。这个过程是通过fork一个子进程来完成的,子进程先将数据集写入临时文件,然后再用这个临时文件替换上次持久化的文件。通过以上实际案例,我们可以清晰地看到RDB和AOF持久化的原理,以及如何在Redis中进行配置和操作。Redis的持久化机制是保障数据安全的重要手段,了解其原理对于设计高可靠性的Redis系统至关重要。Redis是一款高性能的内存数据库,而RDB(Redis DataBase)和AOF(Append Only File)是Redis中常用的持久化方式。

2024-01-08 11:08:26 409

原创 MySQL:一份完整的MySQL规范是什么样?

在设计过程中,需要考虑到图书表和作者表的关联关系,以及字段的数据类型和长度,比如图书ID可以使用INT类型,作者姓名可以使用VARCHAR类型。通过以上实际案例,我们可以看到,遵循一份完整的MySQL规范可以帮助我们设计出高效、可靠的数据库系统,并编写出优化的查询语句,从而充分发挥MySQL的优势。MySQL的规范不仅仅是一份技术文档,更是一种设计艺术,一份规范的MySQL数据库设计将为您的应用程序带来更高效的性能和更好的用户体验。在创建数据表时,需要注意表的命名规范、字段的命名规范、主键和外键的设置等。

2024-01-08 11:02:25 474

原创 高并发文章浏览量计数系统设计

在面试中,架构设计问题是常见的考察点之一。其中,针对高并发场景下的系统设计问题尤为重要,本文将通过一个生动通顺的方式,结合实际案例,为您详细介绍如何设计一个高并发文章浏览量计数系统。

2024-01-07 19:31:36 411

原创 面试必备:举例说明ZAB协议在分布式系统中的应用,比如ZooKeeper分布式协调服务

ZooKeeper是一个分布式的、高可用的协调服务,它提供了一种类似于文件系统的数据模型,可以存储和管理分布式系统中的各种元数据。因此,当一个客户端在ZooKeeper上创建一个节点时,它会被序列化和复制到所有的ZooKeeper节点上,保证了数据的一致性和可靠性。ZAB协议的核心算法是基于Paxos算法的,它将所有的写操作序列化,保证了数据的有序性和可靠性。数据一致性:ZooKeeper使用ZAB协议来保证数据的一致性,所有的写操作都会被序列化,保证了数据的有序性和可靠性。

2024-01-07 19:25:05 399

原创 Redis:面试中经常被问到的 Redis 持久化与恢复

本文将介绍Redis持久化的两种方式,RDB和AOF,并提供相应的代码示例和实际案例,帮助读者更好地理解和掌握这一重要的知识点。RDB持久化是Redis默认的持久化方式,它可以在指定的时间间隔内将内存中的数据以快照的形式保存到磁盘上。由于开启了AOF持久化,我们可以通过AOF日志文件来恢复数据,保证数据的完整性。AOF持久化是将Redis的操作日志以追加的方式写入到磁盘文件中,可以保证数据的完整性和持久性。这个命令会返回AOF文件的保存路径,我们可以在该路径下找到最新的AOF文件。

2024-01-07 19:20:02 674

原创 MySQL:查询速度慢与性能差的解决方案

索引是提高查询性能的重要手段。但是,索引并不是越多越好,过多的索引会增加数据库的维护成本。在编写查询语句时,需要尽量避免使用SELECT *,而是明确指定需要查询的字段。另外,尽量避免在WHERE子句中使用函数,这会导致索引失效,影响查询性能。然而,随着数据量的增加和查询复杂度的提高,很多开发者都会遇到MySQL查询速度慢和性能差的问题。通过EXPLAIN语句可以发现,该查询没有使用到age字段上的索引,导致查询性能较差。通过以上优化措施,可以大大提升MySQL的查询性能,改善查询速度慢和性能差的问题。

2024-01-07 19:14:45 704

原创 MySQL:三大知识点,索引、锁、事务,原理分析

在该转账操作中,通过设置conn.setAutoCommit(false)来开启事务,通过conn.commit()来提交事务,通过conn.rollback()来回滚事务,保证数据的一致性和安全性。其中,B-Tree索引是最常用的索引类型,也是MySQL默认的索引类型。其中,行锁是最常用的锁类型。事务的原理是将一组操作放在一个逻辑单元中,通过锁机制和日志机制来保证操作的原子性、一致性和隔离性。其中,idx_name是索引名称,table_name是表名,column_name是需要建立索引的列名。

2024-01-07 19:09:53 548

原创 面试必备:Java并发编程10道面试题及答案

在多线程环境下,线程安全是指多个线程访问共享数据时,不会出现数据错误或不一致的情况。要保证线程安全,可以采用同步机制,比如使用synchronized关键字或Lock接口来保护共享数据的访问,或者使用线程安全的数据结构,比如ConcurrentHashMap。volatile关键字用于声明变量,保证了变量的可见性和禁止指令重排序。它可以用于多线程之间的通信,确保一个线程对变量的修改对其他线程是可见的。线程池是一种管理和复用线程的机制,可以提高线程的利用率和系统的性能。

2023-12-31 09:16:08 658

原创 8个Spring 面试问题及答案

简化开发:Spring框架提供了各种各样的功能,如数据访问、Web开发等,使得开发人员可以更加专注于业务逻辑的实现,从而提高了开发效率。依赖注入:Spring框架提供了依赖注入的功能,使得应用程序的组件之间的依赖关系更加清晰,同时也使得应用程序更加易于测试和维护。事务管理:Spring框架提供了事务管理的功能,使得应用程序的数据一致性得到了保证,同时也提高了应用程序的性能和可靠性。健康检查:Spring Boot提供了健康检查的功能,可以检查应用程序的运行状态,从而提高了应用程序的可靠性。

2023-12-31 09:09:46 898

原创 除了水平切分,数据库架构设计还经常遇到哪些问题

水平切分是将数据库表中的数据分成多个较小的表的过程。这种方法可以提高数据库的性能和可扩展性,因为它可以将负载分散到多个服务器上,从而减少单个服务器的压力。例如,如果您正在处理电子商务网站的订单,您可以使用订单ID作为分片键,将订单分布在多个服务器上。例如,如果您的订单表包含大量的文本数据,您可以将该数据分离到一个单独的表中,以减少查询所需的数据量。而水平切分是最常见的解决大量数据问题的方法,但是数据库架构设计还会遇到其他问题。您的订单表包含大量的数据,因此您需要使用水平切分来分散负载。

2023-12-31 09:05:13 360

原创 在什么时候才会用到fireEvent方法呢?

当需要编写自动化测试用例来验证网页或应用程序的交互功能时,我们就会用到fireEvent方法。这个方法可以帮助我们模拟用户的操作,例如点击按钮、输入文本等,从而触发相应的事件,进行测试和验证。

2023-12-31 08:41:03 506

原创 获取JavaScript用户自定义类的类名称

在这个示例中,我们定义了一个名为getClassName的函数,该函数接受一个对象作为参数,并返回该对象所属的类的名称。实际案例:使用获取类名称的功能 现在让我们来看一个实际的案例,演示如何在实际开发中使用获取类名称的功能。步骤二:获取类名称的方法 在JavaScript中,我们可以使用Object的constructor属性来获取一个对象所属的类的构造函数。在这个类中,我们使用了ES6的类语法来定义一个Animal类,其中包含了一个构造函数和一个makeSound方法。

2023-12-31 08:34:40 447

原创 JScript中的“this“关键字使用方式补充

在上面的例子中,通过调用call和apply方法,我们可以将"sayHello"方法中的"this"指向"person1"和"person2"对象,从而分别访问它们的"name"属性。在上面的例子中,当调用"person"对象的"sayHello"方法时,"this"关键字指向"person"对象,因此可以访问到"person"对象的"name"属性。在上面的例子中,箭头函数中的"this"指向了"person"对象,因此可以访问到"person"对象的"name"属性。在对象方法中使用"this"

2023-12-28 15:29:14 360

原创 JScript中的“this“关键字使用方式补充

在上面的例子中,通过调用call和apply方法,我们可以将"sayHello"方法中的"this"指向"person1"和"person2"对象,从而分别访问它们的"name"属性。在上面的例子中,当调用"person"对象的"sayHello"方法时,"this"关键字指向"person"对象,因此可以访问到"person"对象的"name"属性。在上面的例子中,箭头函数中的"this"指向了"person"对象,因此可以访问到"person"对象的"name"属性。在对象方法中使用"this"

2023-12-28 15:26:46 742

原创 在JavaScript中使用面向对象

同时我们也通过一个实际的案例,演示了如何创建一个简单的图形类,并实现了圆形和矩形两种图形的面积和周长计算方法。在上面的例子中,我们定义了一个名为Student的构造函数,它继承了Person的属性和方法。然后我们使用Object.create方法来创建一个新的对象,它的原型指向了Person.prototype,从而实现了对象继承。在上面的例子中,我们定义了一个名为Person的构造函数,它有两个参数name和age,分别用于初始化对象的name和age属性。实际案例:创建一个简单的图形类。

2023-12-28 15:21:40 359

原创 JavaScript之内嵌函数

我们了解到内嵌函数可以在外部函数内部定义和调用,并且可以访问外部函数的变量和参数。作用域链决定了变量和函数的可见性和访问权限,当内嵌函数在外部函数中被调用时,它可以访问外部函数的作用域,包括变量和参数。在JavaScript中,函数是一等公民,可以作为参数传递给其他函数,也可以在函数内部定义其他函数。首先,我们需要定义一个外部函数,内嵌函数将在这个外部函数内部被定义和调用。接下来,我们在外部函数内部定义一个内嵌函数,用于计算两个数字的差。最后,我们在外部函数中根据操作符调用相应的内嵌函数,并将其结果返回。

2023-12-28 15:16:23 546

原创 JavaScript中的this关键字

我们了解到this关键字在不同的上下文中有不同的引用对象,并且可以根据函数的调用方式进行动态的绑定。它在不同的上下文中有不同的含义,可以引用不同的对象。在JavaScript中,this关键字是一个指向当前执行上下文的对象的引用。在函数内部,this关键字引用的是调用该函数的对象。例如,当我们将一个函数作为对象的方法调用时,this关键字将引用该对象。构造函数用于创建对象的模板,使用new关键字调用时,this关键字将引用新创建的对象。在函数内部,this关键字引用的是调用该函数的对象。

2023-12-28 15:08:06 339

空空如也

空空如也

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

TA关注的人

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