自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL索引

MySQL索引是提高查询效率的数据结构,主要包括主键、唯一、普通和全文索引。InnoDB存储引擎以16KB的Page为单位进行数据交互,通过B+树结构管理索引,其聚簇索引直接存储完整数据行而非聚簇索引则保存键值和指针。索引虽提升查询速度但会降低写入性能。复合索引遵循最左匹配原则,合理设计可触发索引覆盖避免回表查询。MyISAM引擎采用索引与数据分离存储方式。创建索引时应结合查询频率、字段唯一性和更新频率等因素,避免冗余索引。全文索引需配合MATCH语法使用且仅支持MyISAM引擎。

2025-11-11 17:11:08 852

原创 MySQL复合查询

本文介绍了数据库多表查询的常见方法,包括交叉连接、自连接、子查询和内外连接。交叉连接返回两表所有行组合(笛卡尔积),自连接用于表内层级关系查询,子查询分为单行、多行、多列及FROM子句中的子查询。内外连接方面,内连接返回匹配记录,外连接分为左外(保留左表所有记录)和右外(保留右表所有记录)连接。文章通过员工表和部门表的实例演示了各种查询语法,包括显示部门员工、查询上级领导、工资比较等典型场景,并对比了UNION和UNION ALL在合并查询结果时的区别。

2025-11-11 17:05:07 992

原创 MySQL表的查询

本文介绍了MySQL数据库中CRUD操作的基本语法和使用方法。"Create"部分详细讲解了单行/多行数据插入、创建表结构、主键冲突更新等操作。"Retrieve"部分重点介绍了SELECT语句的完整语法,包括全列/指定列查询、结果去重、WHERE条件筛选、排序(ORDER BY)和分页(LIMIT)等。"Update"和"Delete"部分分别讲解了修改数据和删除数据的操作,并对比了DELETE与TRUNCATE的区别。最后介

2025-11-10 18:57:01 692

原创 MySQL内置函数

本文介绍了MySQL中常用的日期、字符串和数学函数的使用方法。日期函数部分讲解了如何获取年月日、时分秒、时间戳,以及日期加减、差值计算等操作;字符串函数部分展示了字符串连接、长度计算、替换、截取等操作;数学函数部分包括绝对值、进制转换、取整、随机数等运算。通过实际案例演示了这些函数在数据库查询中的应用,如留言表日期处理、姓名格式化显示等。这些函数为数据处理提供了便捷的操作方式,能够有效提升SQL查询的灵活性和功能性。

2025-11-10 18:44:44 420

原创 MySQL表的约束

MySQL表约束用于确保数据完整性,主要包括列级和表级约束。主要约束类型包括: NOT NULL - 字段不能为空 DEFAULT - 设置默认值 COMMENT - 列描述 ZEROFILL - 数字不足位数补零显示 PRIMARY KEY - 主键约束,唯一且非空 AUTO_INCREMENT - 自增长,常与主键配合 UNIQUE KEY - 唯一键,允许空值 FOREIGN KEY - 外键,维护表间引用完整性 约束可确保数据有效性,防止无效数据入库,是数据库设计的重要部分。外键约束特别用于维护表间

2025-09-27 14:01:52 843

原创 MySQL库、表的操作

SQL语言主要分为四类:DDL(数据定义语言)用于结构操作,包括create/drop/alter;DML(数据操纵语言)用于数据操作,含insert/delete/update;DQL(数据查询语言)专指select;DCL(数据控制语言)管理权限和事务,如grant/revoke/commit。文章详细介绍了数据库和表的创建、修改、删除操作,以及字符集、校验规则设置方法。同时讲解了常用数据类型(数值、字符、日期、枚举集合等)的特性及使用场景,包括整型、浮点型、char/varchar、datetime/

2025-09-27 14:01:14 906

原创 c++11 智能指针

C++智能指针(Smart Pointer)是封装原始指针的类模板,基于RAII思想自动管理动态内存,避免内存泄漏和野指针问题。C++11提供了三种主要智能指针:unique_ptr(独占所有权,不支持拷贝)、shared_ptr(共享所有权,引用计数)和weak_ptr(弱引用,解决循环引用)。智能指针通过重载运算符实现指针式访问,析构时自动释放资源。shared_ptr存在循环引用问题,需用weak_ptr配合解决。此外,智能指针支持自定义删除器管理非new资源,但需注意线程安全问题。智能指针的发展源于

2025-09-26 10:53:37 1009

原创 C++11(2)

本文系统介绍了C++11中的多项重要特性:1. 可变参数模板:支持参数数量变化的函数/类模板,通过参数包和包扩展实现灵活的参数处理;2. 移动语义:新增移动构造和移动赋值函数,通过std::move实现资源高效转移;3. lambda表达式:提供匿名函数对象语法,支持捕捉上下文变量;4. 包装器:std::function统一可调用对象类型,std::bind实现参数适配;5. 类型处理:auto/decltype简化类型推导,using替代typedef;6. const优化:区分顶层/底层const,c

2025-09-26 10:52:48 876

原创 C++11:列表初始化与左右值引用

C++11 是 C++ 语言的重要更新,引入了多项核心特性:1. 统一初始化机制:提供 {} 语法支持所有类型的初始化,包括内置类型、结构体和容器。2. std::initializer_list:支持容器通过 {} 直接初始化,简化多值构造。3. 右值引用和移动语义:通过 && 语法实现资源高效转移,减少拷贝开销: 区分左值/右值,支持移动构造和移动赋值 优化返回局部对象场景,解决深拷贝性能问题 容器接口新增右值版本提升效率4. 完美转发:通过 std::forward 保持参数原始值类别

2025-09-23 15:03:50 577

原创 多路转接IO模型select、poll、epoll

本文系统介绍了五种I/O模型及其核心概念:1. 五种I/O模型:包括阻塞I/O、非阻塞I/O、信号驱动I/O、多路转接I/O和异步I/O,重点分析了各自的特点和适用场景。2. 高级I/O概念:区分了同步/异步通信、阻塞/非阻塞调用,并阐述了四种组合方式的特点。3. 非阻塞I/O实现:详细介绍了fcntl函数的五种功能及其应用。4. 多路转接机制:着重讲解了select、poll和epoll三种实现方式,对比分析了它们的优缺点,其中epoll凭借红黑树和回调机制在高并发场景中表现最优。5. epoll工作模式

2025-09-23 15:02:44 1017

原创 网络层ip协议

网络层是负责数据传输路径选择的核心协议层。IP协议通过头部字段(版本号、服务类型、分片控制等)管理数据包传输,采用CIDR无类别划分解决传统网络划分的缺陷。路由器通过路由表实现逐跳转发,NAT技术实现内网与外网地址转换。家用路由器采用双IP设计(LAN口和WAN口)实现子网隔离,私有IP地址(如192.168.*)在局域网内可重复使用。路由过程本质是基于路由表的网络层决策与数据链路层执行的结合,通过多跳接力完成端到端通信。

2025-09-22 08:11:35 1255

原创 传输层协议UDP、TCP

本文系统分析了传输层TCP与UDP协议的核心特性。UDP作为无连接协议,具有8字节精简报头,支持高效传输但不可靠,适用于DNS、DHCP等场景;TCP则通过三次握手建立可靠连接,提供确认应答、超时重传、滑动窗口、流量控制、拥塞控制等机制确保数据传输可靠性。重点解析了TCP连接管理(三次握手/四次挥手)、状态转换、粘包问题及异常处理机制,对比了两种协议在端口号使用、缓冲区管理等方面的差异,阐明了它们各自适用的应用场景和设计考量,为网络通信协议选择提供理论依据。 关键词:

2025-09-22 08:10:52 1005

原创 应用层协议HTTP

1. URL在互联网世界中,HTTPyperextransferrotocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。HTTP协议是客户端与服务器之间通信的基础。客户端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。它是一个的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。1. URL平时我们俗称的网址其实就是说的URL像等这样的字符已经被。

2025-07-31 09:36:57 878

原创 HTTPS协议原理

HTTPS通过非对称加密、对称加密和数字证书三重机制保障通信安全。首先通过CA证书验证服务器身份,防止中间人攻击;然后使用非对称加密安全传输对称密钥;最后采用高效的对称加密进行数据传输。这种组合方案既解决了密钥交换的安全问题,又保证了加密效率,有效防止了数据窃取和篡改,实现了安全高效的网络通信。三组密钥各司其职:证书验证密钥、密钥协商密钥和数据加密密钥共同构成了HTTPS的安全基础。

2025-07-31 09:36:16 897

原创 Jsoncpp 用法速查

文章介绍了Json::Value的核心功能,包括构造方法、元素访问、类型检查和转换等基本操作。详细讲解了三种序列化方式(toStyledString、FastWriter和StreamWriter)和反序列化方法(Reader解析器),并提供了完整的代码示例。此外还包含不同系统下的安装命令,帮助开发者快速实现JSON数据处理。该库具有高性能、易用性和完善的错误处理机制,适合各类C++项目使用。

2025-07-23 17:10:21 1019

原创 计算机网络基础

本文详细介绍了TCP/IP五层网络模型及各层核心功能,包括应用层(HTTP/FTP等协议)、传输层(TCP/UDP)、网络层(IP/ICMP)、数据链路层(MAC帧传输)和物理层(比特流传输)。重点阐述了网络通信中的关键概念:MAC地址的唯一性、IP地址的路由功能、端口号的进程标识作用,以及网络字节序转换规则。同时深入讲解了socket编程接口,包括UDP/TCP套接字的创建、绑定、监听、连接等系统调用,并提供了UDP服务端/客户端的完整封装实现代码,展示了网络数据从封装到分用的完整传输流程。

2025-07-23 17:04:37 777

原创 linux线程同步

生产者-消费者模型(Producer-Consumer Model)是一种典型的多线程同步模型,用于处理生产者和消费者之间的协作问题。它常用于操作系统、并发编程、线程池、任务队列等场景。(1)基本概念负责生产数据(或任务),放入缓冲区。负责从缓冲区取出数据(或任务)进行处理。一个用于存储生产者生成、等待被消费者处理的数据的容器。可以是队列、数组等。(2)存在的问题缓冲区满时,生产者需要等待。缓冲区空时,消费者需要等待。多线程并发时,需要保证缓冲区的线程安全,防止数据竞争或丢失。(3)解决方案。

2025-05-24 15:23:20 748

原创 linux线程同步与互斥

线程互斥相关概念、互斥锁mutex相关函数、锁的原理、线程安全与函数重入问题、死锁。本文探讨了线程互斥机制在多线程编程中的关键作用。首先介绍了临界资源、临界区、互斥和原子性等基本概念,指出共享变量在多线程并发操作时可能出现的问题。通过售票系统代码示例,分析因非原子操作导致的数据不一致问题,特别是票数减为负数的现象。文章详细讲解了互斥锁的使用方法,包括初始化、加锁和解锁操作,并深入剖析锁的硬件实现原理。同时讨论了线程安全与可重入性的区别与联系,以及死锁产生的四个必要条件。

2025-05-24 15:23:16 834

原创 linux线程控制

线程控制:创建、等待、终止、分离。用户态线程和内核线程、线程独立的栈结构。摘要:POSIX线程库(pthread)是UNIX/Linux系统下遵循POSIX标准的多线程编程接口。文章详细介绍了pthread的主要功能:1)线程创建与管理,包括pthread_create、pthread_join等重要函数;2)线程终止的三种方式;3)分离线程(pthread_detach)的实现原理;4)用户态线程(TCB)与内核态线程(LWP)的协作机制;5)线程独立栈的特性与实现。

2025-05-17 16:43:04 762

原创 linux线程基础

线程简介、分页式存储管理、线程的优缺点、线程异常、线程与进程之间的关系。本文系统阐述了线程与进程的概念及其在Linux系统中的实现原理。线程是进程内的执行单元,共享进程资源但拥有独立栈和寄存器状态;Linux通过轻量级进程(LWP)实现线程,使用task_struct管理并共享地址空间。文章详细分析了分页式存储管理机制,包括虚拟地址转换、多级页表设计和缺页中断处理。通过对比线程与进程的资源共享、创建开销和通信方式,指出线程切换更快但健壮性较低。

2025-05-17 16:42:53 1188 1

原创 linux-进程信号捕捉

信号捕捉、操作系统运行原理、硬件中断、软件中断、用户态和内核态、可重入函数本文摘要:文章详细讲解了Linux系统中信号处理、中断机制和用户态/内核态切换的底层原理。主要内容包括:1.信号捕捉流程,描述了从用户态到内核态的转换、信号检查和处理机制;2.操作系统运行机制,重点分析硬件中断、时钟调度和软件中断(系统调用)的实现;3.用户态与内核态的区别及切换过程,涉及地址空间划分和权限控制;4.sigaction系统调用的使用方法和特性;5.可重入函数的概念和安全要求;6.SIGCHLD信号的作用和典型应用场景。

2025-05-14 19:27:33 966 1

原创 linux-信号保存和处理

信号保存、信号集操作函数: sigset,sigprocmask、sigpending。本文介绍了Linux系统中信号处理的相关概念和操作。主要内容包括:1.信号递达、未决和阻塞的基本概念;2.信号在内核中的表示方式,通过位图记录阻塞和未决状态;3.信号集操作函数(sigemptyset、sigfillset等)和信号屏蔽字管理(sigprocmask);4.获取未决信号集的方法(sigpending);5.终止信号的两种类型(core和term)及其区别;。

2025-05-14 19:27:16 754

原创 linux-进程信号的产生

信号的概念与产生。硬件事件、系统调用、软件命令、内核触发信号。目标进程。Linux进程信号是一种异步通信机制,用于进程间通信或事件通知。信号分为普通信号(1-31)和实时信号(34-64),可通过硬件异常、系统调用(kill/raise/alarm)或软件条件触发。进程可采取默认处理、忽略或自定义处理三种响应方式。信号处理具有优先级,普通信号可延迟处理,实时信号需立即响应。常见信号包括SIGINT(Ctrl+C)、SIGKILL(强制终止)、SIGSTOP(暂停)等。

2025-05-12 15:52:37 1093

原创 进程间通信(2)——共享内存

共享内存、消息队列、信号量。摘要: SystemV共享内存(SHM)是进程间通信(IPC)的高效机制,通过共享内存区域实现数据交换,避免了内核数据拷贝。其核心函数包括shmget(创建/获取)、shmat(映射)、shmdt(解除映射)和shmctl(控制)。SystemV还提供消息队列(msgget/msgsnd/msgrcv)和信号量(semget/semop)用于进程同步与通信。共享内存生命周期随内核,需手动删除(ipcrm)。

2025-05-12 15:50:59 737

原创 进程间通信(1)——管道

进程间通信的目的、分类、匿名管道、命名管道。本文摘要: 进程间通信(IPC)是不同进程间交换数据的机制,主要分为管道、SystemV IPC和POSIX IPC三种方式。管道包括匿名管道(父子进程间通信)和命名管道(任意进程间通信),通过内核缓冲区实现数据传输。SystemV IPC提供消息队列、共享内存和信号量,功能更强大但管理复杂。POSIX IPC是SystemV的改进版,API更简洁易用。文章详细介绍了匿名管道的实现原理、同步机制和进程池应用,以及命名管道的创建与通信方式。

2025-03-19 21:03:53 1029 1

原创 ELF文件从形成到加载

ELF文件从形成到加载、动静态库链接与加载

2025-03-19 21:03:28 1200

原创 动静态库的使用和原理

动静态库的创建与使用。库是代码重用的重要手段,主要分为静态库和动态库。静态库(.a/.lib)在链接时将代码复制到可执行文件中,具有独立性但体积较大;动态库(.so/.dll)在运行时加载,节省空间但依赖环境配置。创建静态库使用ar工具打包.o文件,动态库则通过gcc的-shared选项生成。使用静态库需指定-L(库路径)和-l(库名),动态库还需配置运行时查找路径(如LD_LIBRARY_PATH)。当两者共存时,gcc默认优先链接动态库,使用-static可强制静态链接。

2025-03-18 16:47:49 889 1

原创 Ext系列文件系统

磁盘存储、逻辑结构。文件系统。分区、块组、inode、软硬链接。本文系统介绍了Linux文件系统的核心结构与工作原理,重点分析了Ext系列文件系统的演进与实现。首先从磁盘物理结构入手,详细解释了CHS/LBA寻址方式、扇区/块/柱面的组织关系。随后深入剖析了Ext2文件系统的架构设计,包括块组划分、超级块、inode表、数据块等核心组件,并阐述了inode指针的多级映射机制。针对目录管理,文章揭示了Linux通过dentry结构构建路径缓存的优化策略。最后对比了硬链接与软链接的本质区别

2025-03-18 16:45:29 1305

原创 文件描述符与重定向

open、dup2系统调用。重定向、文件描述符、缓冲区。Linux中文件操作与描述符管理 open系统调用 open()用于打开/创建文件,返回文件描述符。关键参数包括路径名、打开标志(O_RDONLY/O_CREAT等)和可选权限模式(如S_IRUSR)。示例:open("file.txt", O_CREAT, S_IRUSR|S_IWUSR)创建可读写文件。 文件描述符原理 每个进程默认拥有0(STDIN)、1(STDOUT)、2(STDERR)三个描述符

2025-03-01 16:45:17 1280 2

原创 进程控制(创建、终止、等待、替换)

进程控制:进程创建、进程终止、进程等待、进程替换。本文介绍了Linux系统中的进程管理机制,主要包括三个方面:进程创建、进程终止和进程替换。在进程创建部分,详细讲解了fork()函数及其写时复制机制,这种机制通过延迟内存复制提高了效率。进程终止部分对比了exit()和_exit()的区别,并解释了退出码的作用。进程等待部分说明了wait()和waitpid()如何防止僵尸进程,并获取子进程状态。最后,文章介绍了进程替换的exec系列函数,这些函数允许进程执行新程序而不创建新进程。

2025-03-01 16:44:51 850 2

原创 穿越虚拟与现实:解密Linux进程的地址空间

进程概念:虚拟地址空间,进程相关属性之间的关系。本文深入探讨了Linux进程的虚拟地址空间及其管理机制。文章首先介绍了虚拟地址空间的概念,指出它是操作系统为每个进程提供的抽象内存模型,通过内存管理单元(MMU)实现虚拟地址到物理地址的转换。详细分析了虚拟地址空间的布局,包括代码段、数据段、BSS段、堆和栈等区域,并解释了虚拟地址与物理地址的映射关系。文章还阐述了程序加载为进程的三个关键步骤,以及虚拟地址空间对内存保护和进程管理的重要性。

2025-02-24 19:44:51 854 1

原创 环境变量:Linux 系统中的‘神经网络

本文系统介绍了Linux环境变量的概念与应用。文章首先阐述了环境变量的基本定义和作用,指出它们如同"神经元"连接系统组件,决定了程序运行时的关键行为。通过PATH变量示例,详细讲解了系统如何查找命令,并演示了如何添加自定义路径。文章还深入分析了环境变量的存储机制、来源(如.bashrc和.bash_profile配置文件)以及常用环境变量(HOME、SHELL等)。此外,还介绍了获取和操作环境变量的方法(env、getenv、setenv等),区分了本地变量与全局变量的特性,并说明了内建

2025-02-24 19:44:23 972

原创 优先级的权杖:进程世界的‘王位争夺战’

进程优先级、PRI和NI,竞争、独立、并行、并发,O(1)调度算法Linux系统中进程优先级通过PRI和NI值共同决定,其中PRI(0-139)是内核动态优先级,NI(-20到19)是用户可调的静态修正值。系统采用O(1)调度算法,通过活动/过期双队列结构和位图索引实现常数时间复杂度的进程切换,确保多任务环境下CPU资源的高效分配。用户可通过nice、renice命令和top工具调整优先级,但需注意不合理设置可能导致进程饥饿。该机制在保留进程独立性的同时,通过时间片轮转和优先级调度实现并发与并行执行。

2025-02-23 16:21:39 729

原创 linux进程状态的多面人生:从奔跑到沉睡,从新生到孤独

进程状态详解,运行、挂起、阻塞。僵尸进程、孤儿进程。Linux进程状态摘要:Linux进程主要包含运行(R)、睡眠(S/D)、停止(T/t)、僵尸(Z)和死亡(X)等状态,内核通过task_struct结构体和状态常量(TASK_*)管理进程状态切换。运行状态进程处于CPU调度队列;睡眠状态分为可中断(S)和不可中断(D)两种阻塞类型;停止状态(T/t)由信号触发;僵尸进程(Z)需父进程回收资源。孤儿进程由init接管,内核通过task_state_array[]数组定义状态标识。

2025-02-23 16:05:24 875

原创 操作系统与社交达人:进程的初次探秘

摘要: 进程是程序的执行实例,包含代码、数据及资源。Linux通过task_struct(PCB)管理进程,记录PID、状态、内存等信息。查看进程可用ps、top等命令;终止进程用kill或Ctrl+C。fork()系统调用创建子进程,采用写时拷贝机制共享父进程资源,父子进程通过不同返回值(父进程获子进程PID,子进程获0)区分。进程独立性确保修改变量时触发写时拷贝,使父子进程数据隔离。/proc目录动态存储进程信息,退出后自动移除。

2025-02-22 17:09:46 877 1

原创 Linux调试器gdb

linux调试器,调试命令。断点管理、程序控制命令、检查和监视变量、修改变量

2025-02-22 15:59:03 815 1

原创 linux编译器和自动化构建工具(gcc与Makeile)

本文系统介绍了Linux环境下的编译器工具链和构建系统。主要内容包括:1. Linux编译器:重点讲解了GCC(GNU Compiler Collection)和Clang两大主流编译器,以及Ninja高效构建系统。详细解析了GCC的常见选项和编译过程(预处理、编译、汇编、链接四个阶段)。 动静态库:对比分析了动态库(.so)和静态库(.a)的特点、创建方法及使用场景,包括-fPIC选项的作用和库文件链接方式。 Makefile构建系统:深入讲解了Makefile的基本结构、伪目标、时间属性检查、推导规则等

2025-02-21 16:10:17 1527 3

原创 Linux终端之旅:必备开发工具vim

Vim是一款高效文本编辑器,主要包含正常模式(默认模式)、插入模式(文本输入)和底行模式(文件操作)三种核心模式。基本操作包括文件打开(vim filename)、保存(:w)、退出(:q)等。在正常模式下,可通过h/j/k/l移动光标,使用x/dd/yy等命令进行删除/复制操作,支持查找(/keyword)和撤销(u)。底行模式提供全局替换(:%s/old/new/g)、行号显示(:set nu)等功能。Vim还支持分屏操作(:vsp/:sp)和多窗口切换(Ctrl+w+方向键),以及批量注释(Ctrl+

2025-02-21 16:09:19 1296

原创 递归、搜索、回溯

递归是一种通过函数调用自身来解决问题的编程方法,适用于存在重复子问题的场景,如二叉树遍历、汉诺塔问题等。其核心在于:设计函数头(明确子问题)、编写函数体(解决单个子问题)和设置递归出口。示例包括汉诺塔问题(通过中间柱移动盘子)、合并有序链表(比较节点连接)、二叉树剪枝(后序遍历)、验证二叉搜索树(中序遍历比较)、输出二叉树路径(前序遍历记录)以及全排列和子集生成(回溯法)。递归的关键在于将问题分解为更小的相同子问题,并相信递归函数能正确解决这些子问题。

2025-02-20 10:55:10 928

原创 链表操作与经典问题解析

本文介绍了链表操作的常用方法与技巧,包括节点创建、头插尾插操作,以及虚拟头节点、快慢指针等实用技巧。重点讲解了LeetCode五道链表相关题目:两数相加的进位模拟、节点两两交换、重排链表的反转拼接、合并K个有序链表的分组处理。通过代码示例展示了如何运用基础操作解决复杂链表问题,适合算法学习者掌握链表处理的经典模式。

2025-02-20 10:52:58 431

空空如也

空空如也

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

TA关注的人

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