自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

勤劳的小琪

小琪码代码

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

原创 Saga事务实现原理详解与Java实践

Saga是一种在微服务架构中处理分布式事务的模型。与两阶段提交(2PC)或三阶段提交(3PC)等集中式协调方式不同,Saga通过协调一系列本地事务来完成全局事务。每个本地事务都有一个与之对应的补偿事务(Compensating Transaction),用于在全局事务失败时撤销已执行的本地事务。Saga事务模式提供了一种灵活、高可用的分布式事务解决方案。通过协调一系列本地事务和补偿事务,Saga能够在微服务架构中实现全局事务的ACID特性。

2024-05-08 14:48:45 949

原创 MySQL索引与SQL调优:提升数据库性能的关键

MySQL索引是数据库管理系统中的一个重要功能,它可以加速数据的检索速度。索引相当于数据库中的“目录”,通过索引,数据库系统可以快速地定位到需要的数据,而无需全表扫描。索引类型MySQL支持多种索引类型,包括B-Tree索引、Hash索引、FULLTEXT索引等。其中,B-Tree索引是MySQL中最常用的索引类型,它可以满足大部分场景的查询需求。创建索引在MySQL中,可以使用CREATE INDEX语句来创建索引。例如,为users表的email字段创建索引:sql3. 删除索引。

2024-05-04 09:30:00 732

原创 Redis数据一致性问题的三种解决方案

无论是更新缓存还是删除缓存,在同时操作缓存和数据库时,都无法保证两者都能一次性操作成功,所以我们最好的办法就是重试,这个重试并不是立即重试,因为缓存和数据库可能因为网络或者其它原因停止服务了,立即重试成功率极低,而且重试会占用线程资源,显然不合理,所以我们需要采用异步重试机制。如果只有第一步执行成功,而第二步失败,那么只有缓存中的数据被删除了,但是数据库没有更新,那么在下一次进行查询的时候,查不到缓存,只能重新查询数据库,构建缓存,这样其实也是相对做到了数据一致性。进行两次删除,且中间需要延迟一段时间。

2023-05-16 13:29:01 3291 1

原创 Lock和synchronized的区别与解析

Lock接口为Java提供了比内置synchronized更强大和灵活的锁定机制。该接口定义了一系列核心方法,包括lock(), unlock(), tryLock(), 和 lockInterruptibly(),这些方法让开发者能够明确地控制何时获取和释放锁。synchronized是Java语言内置的关键字,用于实现简单的同步机制。它可以应用于方法或代码块,确保同一时间只有一个线程能够执行特定的代码段。synchronized是Java中的一个基本同步机制,它内置于Java语言和JVM中。

2024-05-23 14:24:26 430

原创 MySQL索引使用技巧:优化数据库性能的最佳实践

在MySQL数据库中,索引是提高查询性能的关键因素之一。然而,不当地使用索引也可能导致性能下降。本文将介绍一些MySQL索引使用的最佳实践,帮助您优化数据库性能。

2024-05-20 15:40:01 1670

原创 Spring Boot集成Kafka:最佳实践与详细指南

本文详细介绍了如何在Spring Boot项目中集成Kafka,并通过最佳实践和代码示例来指导你。通过合理配置Kafka、使用KafkaTemplate发送消息、使用@KafkaListener接收消息以及处理错误和监控,你可以轻松地构建高效、可靠的消息处理系统。希望本文对你有所帮助!

2024-05-17 09:03:37 1480 2

原创 延迟加载(Lazy Loading)在Java中的实现与应用

延迟加载是一种提高程序性能和响应速度的有效策略,在Java编程中可以通过多种方式实现。使用Hibernate等ORM框架可以方便地实现延迟加载,并通过配置文件来指定需要延迟加载的属性或关联关系。在实际应用中,需要根据具体的业务场景和需求来选择合适的延迟加载策略,以达到最佳的性能和效果。

2024-05-15 15:12:20 580

原创 Spring框架中的事务管理:解决思路与代码示例

Spring框架支持两种类型的事务管理:声明式事务管理和编程式事务管理。声明式事务管理:主要通过配置实现,无需编写事务管理代码,通过AOP(面向切面编程)技术将事务管理逻辑织入到业务逻辑中。编程式事务管理:通过编程方式实现事务管理,需要开发者在代码中显式调用事务管理API。在实际应用中,声明式事务管理更为常用,因为它减少了代码的冗余,提高了可维护性。Spring框架为开发者提供了强大而灵活的事务管理支持。

2024-05-14 10:32:37 746

原创 Java中的单例模式:深入解析与最佳实践

单例模式(Singleton Pattern)确保一个类只有一个实例,并提供一个全局访问点。只有一个实例:在任何时候,单例类都只能有一个实例存在。全局访问点:单例类提供了一个访问其唯一实例的静态方法。延迟实例化:单例类在被调用时才创建实例,而不是在类加载时。单例模式是一种非常有用的设计模式,它可以确保资源的唯一性和可控性。在选择单例模式的实现方式时,需要根据实际需求考虑线程安全性、延迟加载等因素。本文介绍了四种常见的单例模式实现方式,并提供了相应的代码示例和最佳实践。

2024-05-13 09:24:33 493

原创 深度揭秘MySQL事务机制

在开发Java应用程序时,数据库事务的处理是确保数据完整性和一致性的关键所在。MySQL作为广泛使用的数据库系统,其事务机制对于开发者来说至关重要。本文将深入解析MySQL的事务机制,并通过Java代码示例展示如何在应用程序中正确地使用和管理事务。

2024-05-10 13:42:30 989

原创 Redis是单线程的,但Redis为什么这么快?

Redis之所以能在单线程模型下保持高性能,主要得益于其基于内存存储、单线程模型、C语言开发、高效的数据结构和算法以及异步非阻塞I/O模型等多个方面的优势。这些优势使得Redis在处理大量并发请求时能够保持快速响应和高吞吐量。

2024-05-09 13:14:04 954

原创 为什么SpringBoot的jar包可以直接运行及示例

通过上述示例,我们可以看到SpringBoot的jar包可以直接运行,这主要得益于其自动配置机制、Maven/Gradle插件以及可执行jar包的内部结构。这些特性使得SpringBoot应用在开发、测试和部署过程中都更加高效和便捷。同时,我们也需要注意到,虽然SpringBoot简化了应用的初始搭建和开发过程,但在实际开发中,我们仍然需要深入理解Spring框架和SpringBoot的原理,以便更好地使用它们来构建高性能、高可用的应用。

2024-05-07 13:02:03 682 1

原创 Java微服务架构:构建高效、可扩展的分布式系统

微服务架构是一种将单一应用程序划分成一组小的服务的方法,每个服务运行在其独立的进程中,服务之间通过轻量级通信机制进行通信(通常是基于HTTP的RESTful API)。这些服务围绕业务能力构建,并且可以通过全自动化的部署机制来独立部署。这些微服务可以使用不同的语言编写,并使用不同的数据存储技术。Java微服务架构通过分解大型应用为小型服务,提高了系统的可伸缩性、容错性和迭代速度。

2024-05-06 10:29:09 509

原创 Java实现以图识图功能模块(简单案例)

在实现以图识图功能模块时,需要关注多个方面,包括特征提取、特征比较、图像数据库管理、用户界面设计等。随着技术的不断发展,深度学习等先进方法正在被越来越多地应用到以图识图系统中,以提高系统的性能和准确性。未来,我们可以期待以图识图系统在更多领域得到应用,并为用户带来更好的体验。

2024-05-01 08:30:00 510 2

原创 基于千万级联表查询的数据库分离改造实践

通过对千万级联表查询进行数据库分离改造,我们可以有效提升系统性能,减轻数据库压力,并增强系统的扩展性。实践过程中,需要根据具体的业务需求和数据量设计合适的分离方案,并在代码层面进行相应的修改和优化。需要注意的是,分离改造可能涉及复杂的配置和代码修改,因此在实施前应进行充分的测试和评估,确保改造后的系统稳定性和性能达到预期。同时,随着业务的发展和数据的增长,可能需要不断调整和优化分离方案,以适应新的需求和挑战。希望本文对您有所帮助,如果您在实际操作中遇到任何问题或需要进一步的指导,请随时提问。

2024-04-30 08:59:03 391

原创 基于Spring Boot实现IP黑白名单功能

基于Spring Boot实现IP黑白名单的功能,可以通过自定义一个过滤器(Filter)来完成。这只是一个基础的实现,根据你的具体需求,可能还需要考虑其他因素,例如:缓存黑白名单以提高性能、支持CIDR表示法的IP地址范围等。这个示例中,IP地址是硬编码在过滤器注册中的。过滤器的顺序(通过setOrder方法设置)可能会影响其他过滤器的执行顺序,确保这个顺序符合你的需求。对于非黑白名单的IP,这个示例中默认是允许访问的。创建一个自定义的过滤器,用于检查请求的IP是否在黑白名单中。

2024-04-29 10:00:00 1157

原创 Java中的装饰器模式:扩展对象功能的新途径

装饰器模式是一种结构型设计模式,它允许用户通过在一些对象中动态地添加新的行为来扩展这些对象的功能。装饰器模式属于对象的结构模式,它使用继承来连接类的行为。通过这种方式,可以在运行时动态地改变对象的行为。在装饰器模式中,我们通常有一个抽象组件接口,它定义了一些基本操作。然后,我们有一些具体的组件类实现了这个接口,提供了这些操作的具体实现。接着,我们有一个装饰器接口,它也实现了抽象组件接口,并持有一个对组件对象的引用。具体的装饰器类则实现了装饰器接口,并添加了一些新的行为或状态。

2024-04-28 14:45:00 416

原创 MySql的索引失效的场景

对索引列进行数学运算(如除法、乘法等)或应用函数(如TO_CHAR(), UPPER(), LOWER()等),可能导致索引失效,因为索引存储的是原始数据值,而非经过计算或函数处理后的值。对于一个多列索引,查询仅使用索引的一部分(如只查询b和c列),或者查询顺序与索引列顺序不一致(如先查询c再查询a),可能导致索引失效。如果表数据发生显著变化后未重新收集统计信息,或索引长期未进行维护,可能导致查询优化器对索引效用的评估不准确,从而不使用索引。=、)可能导致索引失效,除非索引支持倒序扫描。

2024-04-27 13:00:00 727

原创 Git:掌握版本控制的艺术

Git是一个强大而灵活的版本控制系统,它可以帮助我们更好地管理项目的版本历史、协作开发和解决冲突。通过掌握Git的基本概念和使用方式,我们可以更加高效地进行软件开发工作。希望本文和附带的代码片段能够帮助你更好地理解和使用Git。

2024-04-26 21:39:03 1077

原创 Spring源码深度解析:三级缓存机制探究

Spring的三级缓存是为了解决循环依赖问题而设计的。在Spring的IoC容器中,Bean的创建和初始化过程分为多个阶段,其中涉及到了多个缓存。这三个缓存分别是:一级缓存(singletonCache):用于存储完全初始化好的单例Bean实例。二级缓存(earlySingletonCache):用于存储已经创建好实例但还未进行属性填充和初始化方法调用的单例Bean。三级缓存(singletonFactories):存储的是ObjectFactory对象,这些对象能够生成对应Bean的早期引用。

2024-04-26 12:45:00 614

原创 RabbitMQ的工作原理及其在Java中的应用

RabbitMQ是一款开源的消息代理软件,它接收并转发消息。你可以将其视为一个邮局:当你把邮件放入邮箱时,你可以确定邮差先生最终会将邮件送给收件人。在这个比喻中,RabbitMQ就是邮箱、邮局和邮差先生的集合体。

2024-04-25 09:15:00 849

原创 Java实现单点登录(SSO)详解

单点登录(Single Sign-On,简称SSO)是目前比较流行的企业业务整合的解决方案之一,它的主要功能是:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。单点登录的实现机制是:当用户第一次访问应用系统1的时候,因为还没有登录,所以会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行验证,如果通过验证,则应该返回给用户一个认证的凭据——ticket;

2024-04-24 19:11:43 1543

原创 使用Java实现交税计算功能:原理与实战编码

本文介绍了使用Java实现交税计算功能的基本原理和实战编码示例。通过定义税率表和税收起征点,并根据纳税人的收入计算应纳税额,我们可以方便地实现交税计算功能。然而,需要注意的是,本文中的示例仅用于演示目的,实际的交税计算可能涉及更复杂的税法规定和计算逻辑。因此,在实际应用中,我们需要根据具体的税法规定进行调整和优化。此外,随着税收政策的不断调整和完善,交税计算功能也需要不断更新和升级。我们可以关注最新的税法动态,结合实际需求,对交税计算功能进行改进和优化,以更好地满足实际应用需求。

2024-04-24 08:15:00 540

原创 使用Java实现人脸识别功能模块

本文介绍了使用Java和OpenCV库实现人脸识别功能模块的基本步骤,并提供了简单的代码片段。通过加载预训练的模型,我们可以快速地对图像中的人脸进行识别和标注。然而,需要注意的是,本文中的代码仅仅是一个基础的示例,真实场景中的人脸识别应用可能涉及到更多的复杂性和挑战。例如,如何处理不同角度、表情和光照条件下的人脸识别,如何提高识别的准确性和速度,以及如何保护用户的隐私和数据安全等问题都需要我们进一步研究和解决。此外,随着深度学习技术的不断发展,越来越多的新方法和模型被提出并应用于人脸识别领域。

2024-04-23 13:45:00 626

原创 SpringBoot 转账示例与事务一致性问题解析

通过Spring Boot的事务管理功能,我们可以很方便地确保一系列数据库操作的原子性,从而避免数据不一致的问题。在实际开发中,我们应该根据业务需求合理地使用事务管理,确保数据的完整性和一致性。

2024-04-23 08:15:00 430

原创 使用Java实现动态心形图案

通过本文的介绍和示例代码,我们展示了如何使用Java实现动态心形图案。这个示例不仅展示了Java图形绘制和动画处理的基本技术,还提供了优化和扩展的思路。希望这篇文章能够对你在Java图形编程和动画设计方面有所帮助。

2024-04-22 14:29:54 868

原创 Java实现照片美化:基础功能与技术解析

本文介绍了如何使用Java实现照片美化的基础功能,包括亮度和对比度的调整。通过掌握这些基础技术,我们可以对照片进行更多的处理与美化。然而,要实现更高级的照片美化效果,我们可能需要深入研究图像处理算法,并考虑使用更先进的工具和技术。Java作为一种功能强大的编程语言,为照片美化提供了丰富的可能性。通过不断学习和探索,我们可以利用Java实现更多有趣的照片美化功能,为人们带来更好的视觉体验。希望本文能对你有所启发,帮助你更好地理解和应用Java在照片美化领域的应用。

2024-04-22 11:14:16 408

原创 Java一键发送邮件:封装好的工具类详解

本文介绍了一个简单的Java邮件发送工具类的设计与实现,通过封装SMTP服务器的配置和邮件的发送逻辑,我们可以非常方便地实现一键发送邮件的功能。然而,这个工具类还有很多可以扩展的地方,比如支持添加附件、支持群发邮件、支持发送带图片的HTML邮件等。此外,为了提高邮件发送的可靠性和性能,我们还可以考虑使用连接池、异步发送等方式来优化工具类的实现。需要注意的是,发送邮件时可能会遇到各种网络问题或认证问题,因此在实际应用中,我们需要对可能出现的异常进行妥善处理,并提供友好的错误提示。

2024-04-21 12:15:00 577

原创 Java内存管理与调优:深入剖析与实战指南

Java内存模型主要包括堆内存、栈内存和方法区。其中,堆内存是Java对象存储的主要区域,包括新生代和老年代;栈内存则是用于存储基本数据类型和对象的引用;方法区则存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Java内存管理与调优是一个复杂而重要的领域。通过深入理解Java的内存模型和内存管理机制,以及掌握一些实用的调优策略,我们可以更好地优化Java应用程序的性能,提高系统的稳定性和响应速度。希望本文能对读者在Java内存管理与调优方面提供一些有益的启示和帮助。

2024-04-20 09:30:00 500 1

原创 Spring Boot实现文件上传与下载功能

本文介绍了如何使用Spring Boot实现文件上传与下载功能,并提供了相应的代码片段。通过配置Spring Boot的相关属性和创建相应的Controller,我们可以方便地实现文件上传和下载的需求。在实际应用中,还需要根据具体需求进行进一步的优化和扩展,比如添加文件验证、处理大文件上传、实现断点续传等功能。

2024-04-19 14:15:00 621

原创 斐波那契数列:Java实现及其解析

斐波那契数列是一个经典的数学问题,通过Java实现可以帮助我们深入理解其原理和应用。在实际应用中,我们应根据具体情况选择合适的实现方式,以达到最优的效果。

2024-04-19 08:30:00 348

原创 Java中的几种经典排序算法实现

本文介绍了Java中几种常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序,并提供了相应的Java代码实现。每种排序算法都有其特点和适用场景,需要根据具体需求选择合适的算法。在实际应用中,还需要考虑算法的时间复杂度和空间复杂度,以及数据的特性(如是否稳定、是否大量重复等)来做出最优选择。希望本文能够帮助读者更好地理解这些排序算法的原理和实现,为在实际项目中应用这些算法提供有价值的参考。

2024-04-18 17:00:00 645

原创 Java内存溢出场景及解决办法

Java内存溢出通常发生在以下几种情况:堆内存溢出、栈内存溢出、方法区内存溢出以及直接内存溢出。每种溢出情况都有其特定的原因和解决方案。内存溢出是Java应用开发中常见的问题,但通过合理的代码优化、内存管理以及JVM参数调整,我们可以有效地避免和解决这类问题。在开发过程中,我们应该时刻关注应用的内存使用情况,及时发现并解决潜在的内存溢出问题,确保应用的稳定性和性能。

2024-04-18 09:15:00 683

原创 Java绘制心形图案

通过结合数学知识和Java的图形绘制API,我们可以轻松地绘制出各种有趣的图案。在这个示例中,我们展示了如何使用参数方程和Java的Graphics2D类来绘制一个心形图案。你可以根据自己的需要调整参数方程和绘制方式,创造出更多独特和富有创意的图形作品。

2024-04-17 13:45:00 461

原创 Java性能优化技巧:让你的代码飞得更快

Java性能优化是一个综合性的过程,涉及多个方面和技巧。除了掌握合适的数据结构、使用缓存、优化数据库访问等常见技巧外,还需要关注并发和多线程、JVM调优、代码优化和重构等方面。同时,保持对新技术的敏感性和持续学习的态度也是至关重要的。通过不断实践和优化,我们可以编写出更高效、更稳定的Java程序,满足不断变化的业务需求。

2024-04-17 09:30:00 578

原创 利用Java开发实现简单“猜数字”的游戏

通过制作这个简单的“猜数字”游戏,我们初步体验了Java游戏开发的乐趣。虽然这个游戏很简单,但它为我们打开了游戏开发的大门。只要我们不断学习和实践,就能够制作出更加复杂和有趣的游戏。希望本文能够激发您对Java游戏开发的兴趣,并为您的游戏开发之旅提供一个良好的起点。

2024-04-16 14:30:00 522 1

原创 Java Web开发常用库与工具

Java Web开发领域有着丰富的库和工具可供选择,它们涵盖了从开发到测试、部署等各个环节。合理地使用这些工具,能够大大提高开发效率,减少错误,并使得项目更加可靠和可维护。当然,除了上述提到的工具和库之外,还有许多其他的优秀工具和库等待我们去发掘和使用。作为开发者,我们应该保持学习和探索的精神,不断提升自己的技能和能力。

2024-04-16 08:30:38 800

原创 RESTful API与Web应用程序构建:原理与实践

RESTful API,即基于REST(Representational State Transfer,表现层状态转化)架构风格的Web API。REST是一种软件架构风格,它定义了一组设计原则和约束条件,用于创建具有良好交互性的分布式系统。RESTful API通过HTTP协议进行通信,使用标准的HTTP方法(如GET、POST、PUT、DELETE)来表示对资源的操作。RESTful API为Web应用程序的构建提供了灵活、可扩展和可维护的解决方案。

2024-04-15 15:30:00 375

原创 Struts2框架与Web开发:深入解析与实战应用

Struts2是一个基于MVC设计模式的Web应用框架,它整合了多种优秀的技术和组件,如拦截器、类型转换、数据校验等,使得Web开发变得更加高效和便捷。Struts2框架的核心思想是将业务逻辑、数据、界面显示分离,使得代码结构清晰,易于维护。Struts2框架以其强大的功能和灵活的扩展性,为Web开发提供了极大的便利。通过本文的介绍和示例代码,相信读者对Struts2框架有了更深入的了解。在实际开发中,我们可以根据具体需求灵活运用Struts2框架的各种组件和特性,构建出高效、稳定、易维护的Web应用。

2024-04-15 10:30:00 469

原创 MyBatis框架使用指南

MyBatis是一个强大且灵活的ORM框架,它可以帮助我们简化数据库操作,提高开发效率。通过本文的介绍,你应该对MyBatis的基本使用有了一定的了解。当然,MyBatis还有很多高级特性和用法,如动态SQL、缓存、插件等,这些都需要你在实际项目中不断学习和探索。希望本文能对你的学习有所帮助。

2024-04-14 12:15:00 962

redis-7.2.2.tar.gz

Redis的安装包通常包含了Redis服务器和客户端所需的所有文件和依赖项,使得用户能够轻松地安装和配置Redis。这些安装包通常适用于不同的操作系统和平台,如Windows、Linux等。 在Windows系统下,Redis安装包可能包括redis-server.exe(Redis服务器执行文件)、redis-cli.exe(Redis命令行客户端执行文件)以及配置文件(如redis.windows.conf)。安装过程通常涉及将安装包解压到指定目录,并将Redis的路径添加到系统的环境变量中,以便在命令行中直接运行相关命令。安装完成后,用户可以通过命令行启动Redis服务器和客户端,进行各种Redis相关的操作。 对于Linux系统,Redis的安装包可能是一个压缩文件,其中包含Redis的源代码和构建脚本。用户需要下载并解压该压缩文件,然后使用构建脚本进行编译和安装。安装过程完成后,Redis的相关命令将可用于系统的命令行环境。 无论是Windows还是Linux系统,Redis安装包中的配置文件允许用户自定义Redis服务器的各种设置,如端口号、密码、持久化选项等。用户可

2024-04-16

jdk1.8.0-131

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。是整个java开发的核心。 JDK是整个java开发的核心,它包含了: 1.JAVA开发工具(jdk\bin) 2.基础开发库(jdk\jre\lib\rt.jar) 3.基础开发库的源码(jdk\src.zip) 另外1.8版本是目前相对比较稳定的版本,不建议下载最新的jdk版本,因为最新版的jdk不稳定,不适配更高的配置。很多配置有问题噢。所以目前还是不建议下载最新版本的JDK,有很多项目是不兼容的。

2023-08-07

HBuilderX.3.8.7

前端开发编译器,可以适用VUE全家桶还有Uniapp的开发,前端开发人员使用,使用VUE进行开发的,Uniapp专用工具开发十分流畅。ide侧重于某种语言的语法分析、提示、转到定义、调试。一般比较厚重。 而编辑器则是对通用文本处理,提供更高效的通用文本处理能力,比较轻量,但语法分析能力不足。 上一代HBuilder是一个典型的IDE,语言处理非常强大,但在字处理、轻量方面客观讲不如优秀的编辑器。 而新的HBuilderX,定位是ide和编辑器的完美结合,那么HBuilderX就会提供轻量且世界顶级的高效字处理能力。界面清爽简洁,绿柔主题经过科学的脑疲劳测试,最适合人眼长期观看的主题界面。提供比其他工具更优秀的vue支持,大幅提升你的vue开发效率。并且可以保护手腕,减缓鼠标手。对于技术人员,我们强烈建议你以后不要使用记事本了,用markdown来替代txt。

2023-08-07

空空如也

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

TA关注的人

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