自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hanxiaoyong_的博客

业精于勤

  • 博客(259)
  • 资源 (7)
  • 问答 (1)
  • 收藏
  • 关注

原创 c++数据格式化输出/字符串复制/字符串比较

sprintf_s比

2021-06-02 09:49:16 739

原创 C++多线程编程(真实入门)

https://blog.csdn.net/Kprogram/article/details/89472995

2021-01-06 10:39:41 2511

原创 C/C++中深浅拷贝(map、vector)与内存释放

在实际应用中,有时需要进行map的深拷贝,直接上代码:#include <iostream>#include <string>#include <map>#include <string.h>#include <iterator>using namespace std;int main(){ map<string,int>m_map; m_map.insert(make_pair<string,int..

2021-01-03 20:05:50 12796

原创 js正则表达式-匹配空格/数字范围/网址/电话等常用表达式

项目需要匹配gh字符,要求gh前面有空格,后面有无空格都可以。思路如下:\s :表示space,空格+: 一个或多个^: 开始,^\s,以空格开始$: 结束,\s$,以空格结束|:或者/g:global, 全局str.replace(/^\s+|\s+$/g,'')错误写法如下: var reg=/(^\s+)gh(|\s)/geg:str='hello chinagh'reg.test(str) //false正确的写法如下:reg=/( +...

2020-07-27 21:59:24 19587 1

原创 Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示

Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示,当Qt的窗口最小化时,isVisible值一定是true,这是正常的。在Qt中,当你点击窗口的最小化按钮时,Qt内部不会自动调用 hide() 方或 setVisible(false) 来隐藏窗口。相反,它会改变窗口的状态,将其标记为最小化。窗口的最小化是一个特殊的状态,不同于被显式隐藏。在最小化状态下,窗口的内容不再显示在屏幕上,但它仍然存在于系统中,并且可以通过操作系统恢复显示。Qt通过 isMinimized() 方法提供了检测窗口是

2025-02-13 23:14:04 573

原创 verilog中可综合电路介绍和门级网表作用

Verilog中的可综合电路是指那些能够通过EDA(电子设计自动化)工具自动转化为硬件逻辑(如与、或、非门等)的Verilog代码所描述的电路。这一过程称为综合,它将HDL(硬件描述语言)代码转化为门级网表,进而可以映射到具体的硬件电路上。这些电路可以在实际的硬件平台上实现,并用于执行特定的功能。Verilog的可综合电路是通过特定语法和规则编写的,能够直接被EDA工具综合成硬件逻辑的电路。它们与其他电路(如不可综合电路、仿真电路等)在实现方式、用途、综合过程和代码要求等方面存在明显的区别。

2024-12-18 23:04:08 967

原创 8位移位寄存器的verilog语言

并在每个时钟周期将其移动到寄存器的最低位,同时寄存器的内容向左移动一位。的内容进行左移操作。具体来说,每次时钟上升沿到来时,如果复位信号。拼接在一起,形成了一个新的8位值,然后这个新值被赋给寄存器。这个左移操作是通过Verilog的位拼接操作符。也可以,但这里为了清晰起见使用了完整表示)。被清零(所有位都设置为0)。因此,可以说上面的移位寄存器是一个。的左移寄存器,它接受一个单比特输入。来明确表示一个8位的零值(虽然。为高,表示复位激活),则寄存器。为高(即未激活复位),则寄存器。上面的代码中,使用了。

2024-12-18 22:52:56 521

原创 Verilog的线与类型与实例化模块

在Verilog中,线与(wire-AND)类型通常用于描述多个信号进行逻辑与(AND)操作的电路行为。虽然Verilog本身没有直接定义一种名为“线与”的数据类型,但可以通过使用wire类型结合特定的逻辑操作来实现线与功能。

2024-11-28 22:11:03 1046

原创 Verilog使用liberty文件中cell单元的demo

Liberty(.lib)文件是用来描述标准单元库中逻辑单元(如门电路、触发器等)的时序和功耗特性的,不是用来直接定义Verilog中的元件。在Verilog设计中,我们通常通过实例化模块(module)来创建电路,而这些模块可以是自定义的,也可以是来自库文件的。Liberty文件描述和一个使用这些描述中逻辑单元的Verilog模块。但请注意,实际的Liberty文件内容要复杂得多,并且通常由EDA工具自动生成。

2024-11-28 22:06:43 487

原创 毫米波雷达、激光雷达和其它传感器之间介绍

毫米波雷达、激光雷达和其它传感器之间介绍

2024-10-26 13:17:28 261

原创 C++ 实现HTTP的客户端、服务端demo和HTTP三方库介绍

C++ 实现HTTP的客户端、服务端demo和封装HTTP协议的三方库介绍。本文使用C++模拟实现http的客户端请求和http的服务端响应功能,并介绍常用的HTTP协议封装的三方库。cpp-httplib适合需要轻量级、简单易用且跨平台的HTTP库的项目。libcurl适合需要强大功能和灵活性的项目,特别是需要支持多种协议和与其他库配合使用的场景。Poco C++ Libraries适合需要丰富功能和稳定性的大型项目。

2024-06-12 23:10:43 3237 1

原创 HTTP协议介绍与TCP协议的区别

是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 是基于TCP/IP 进行数据的通信,通常使用端口 80/8080。HTTP可以传输多种数据类型,如html文件、图片、视频等数据。

2024-05-30 22:57:48 1925

原创 std::find_if函数结合函数对象、lambda表达式查找元素

std::find_if函数头文件:#include 里面。函数意义:查找满足条件的元素的第一次出现。时间复杂度O(n)。参数:first − 输入迭代器到初始位置。last − 最终位置的最终迭代器。pred − 一元谓词,即:接收一个参数的函数对象或者一个参数的lambda表达式,return:返回一个迭代器,指向 (first,last) 范围内满足条件的第一个元素.没有找到,指向最后一个元素。谓词介绍返回bool类型的仿函数称为谓词。

2024-05-16 22:39:26 1590

原创 二叉树的前序、中序、后序遍历的C++实现

二叉树的前序、中序、后序 遍历的C++实现方法,使用递归法的C++实现demo,包括二叉树的定义、创建、二叉树数据的释放。

2024-05-08 22:56:59 462

原创 设计模式之观察者模式(优先使用对象组合的原则)的C++实现

实现订阅发布模式,这种设计的优点是想订阅数据的类不需要继承订阅者类的抽象类,减少了一层类的继承;当然,具体情况需要可根据需求进行订阅者发布者模式的代码设计。

2024-04-21 13:40:59 495

原创 C++ 使用共享内存的进程通信方式模拟生产者消费者模型

C++ 使用共享内存的进程通信方式模拟生产者消费者模型,进程间的同步使用信号量SystemV方式。

2024-04-16 23:06:37 449 1

原创 linux下backtrace函数获取函数调用堆栈信息用法

使用backtrace可以查看函数的调用关系,也可以查看程序异常时的函数调用关系。配置生成coredump生成文件的方法也可以捕获异常,但产生的coredump文件内存较大,backtrace函数的方法占用的内存小。:查看函数Print1函数是哪个函数调用。生成可执行文件的命令如下。执行下面运行可执行文件。

2023-10-30 21:37:38 702

原创 VSCode Linux的C++代码格式化配置

然后,重新打开VSCode,按下Ctrl+S时会自动格式化代码。保存后,在当前工程下面,按下Ctrl+S保存时会自动格式化代码。得到安装地址:/usr/bin/clang-format。(3)不用保存时格式化代码,使用快捷键格式化代码。默认的格式化代码快捷键Ctrl+Shift+I。

2023-10-03 09:44:59 813

原创 设计模式之解析器(Interpreter)的C++实现

设计模式之解析器(Interpreter)的C++实现。在软件开发的过程中,需要实现一种需求,该需求的结构稳定,但是需求的业务内容会频繁变化,如果使用普通语法实现需求,需要经常更新代码,不具有灵活性。可以使用解析器模式解决实现该类需求,解析器是实现一种能够解析该需求结构语法的功能代码,针对不同的业务调用对应的解析规则代码。有一个字符串的加减计算,如'a+b+c-d-e',其中a,b,c,d,e分别对应带计算的值。

2023-09-17 13:01:16 474

原创 linux下检测CPU性能的mpstat命令安装与用法

linux下检测CPU性能的mpstat命令安装与用法P: 指定要监控哪个CPU,范围是[0 ~ n-1], ALL表示监控所有CPU都监控。count: 采样的次数,count只能和delay一起使用。上面输出了2次的CPU状态,后面输出了所有 CPU 的平均值。(4)检测每个CPU的状态,每1秒检测1次,检测2次。interval: 相邻的两次采样的间隔时间、(2)1秒检测1次,检测5次CPU。mpstat的命令用法也可参考。(3)检测每个CPU的状态。(1)检测总的CPU状态。

2023-09-09 21:47:20 1662

原创 设计模式之访问器模式(Visitor)的C++实现

在软件开发过程中,早已发布的软件版本,由于需求的变化,需要给某个类层次结构增加新的方法。如果在该基类和子类中都添加新的行为方法,将给代码原有的结构带来破坏,同时,也违反了修改封闭,扩展开放的原则。访问器模式可以实现不改变原有代码结构的前提下,基于双向分发机制(2次虚函数绑定实例对象),通过扩展的方法实现新的接口。上面的代码,ConcreteElementA和ConcreteElementB的方法更新,通过Visitor基类的扩展子类来实现。(2)Visitor的子类必须实现Element的所有子类方法。

2023-09-09 21:08:55 361

原创 设计模式之命令模式(Command)的C++实现

命令设计模式(Command)的C++代码实现。在软件开发过程中,“行为请求者”和“行为实现者”通常呈现一种“紧耦合”。如果行为的实现经常变化,则不利于代码的维护。命令模式可以将行为的请求者和行为的实现者进行解耦。具体流程是将行为请求者封装成一个对象,将行为实现者抽象成一个类。

2023-08-27 17:46:43 1987

原创 设计模式之职责链模式(ChainOfResponsibility)的C++实现

职责链模式(ChainOfResponsibility)的C++代码实现。在软件开发过程中,发送者经常发送一个数据请求给特定的接收者对象,让其对请求数据进行处理(一个数据请求只能有一个对象对其处理)。职责链模式的处理流程是:设计一个职责链处理基类,该类具有指向下一个待处理类的变量,通过set接口设置下一个待处理的链对象成员;该类具有遍历处理请求的功能,遍历过程中,只要有一个对象处理了请求,则停止遍历;该基类抽象了2个接口分别为:判断是否处理该类型请求和处理消息的功能接口。其他的具体职责链类继承并实现职责链

2023-08-22 22:57:54 843 1

原创 设计模式之迭代器模式(Iterator)的C++实现

迭代器模式(Iterator)的C++实现,泛型编程实现迭代器的C++实现。在软件开发过程中,操作的集合对象内部结构常常变化,在访问这些对象元素的同时,也要保证对象内部的封装性。迭代器模式提供了一种利用面向对象的遍历方法来遍历对象元素。迭代器模式通过抽象一个迭代器类,不同的对象继承自迭代器类,外部通过统一接口访问元素。面向对象实现的迭代器模式是在程序运行时,通过虚函数去操作对象元素;相比于C++中的泛型编程实现迭代器的运行性能较低(泛型编程是在编译时已确定访问的元素),所以建议使用泛型编程实现迭代器。

2023-08-20 18:17:47 1411

原创 设计模式之组合模式(Composite)的C++实现

组合模式(Composite)的C++代码实现。在软件开发过程中,使用者Client过多依赖所操作对象内部的实现结构,如果对象内部的实现结构频繁发生变化,则使用者的代码结构将要频繁地修改,不利于代码地维护和扩展性;组合模式可以使用者代码与复杂地操作对象结构进行解耦,根据操作对象的实现结构抽象出一个的基类,让操作对象内部根据需求变化实现复杂数据地操作接口,则使用者使用操作对象提供的统一接口就可完成功能。

2023-08-20 13:30:38 772

原创 设计模式之备忘录模式(Memento)的C++实现

备忘录模式(Memento)的C++代码实现。在软件功能开发过程中,某些对象的状态在转换过程中,由于业务场景需要,要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。备忘录模式是在不破坏对象封装性的前提下,增加一个备忘录类,用于保存捕获对象的内部状态。当该对象需要回溯到之前状态时,只需调用备忘录接口获取之前的状态,并设置状态。

2023-08-19 22:01:29 1033

原创 设计模式之状态模式(State)的C++实现

状态模式(State)的C++代码实现。在开发过程中,某些对象的状态经常面临变化,不同的状态,其对象的操作行为不同。比如根据状态写的if else条件情况,且这种条件变化是经常变化的,这样的代码不易维护。可以使用状态模式解决这类问题。状态模式是将状态值抽象成一个基类,将不同状态下的操作,封装成基类中的虚函数,使用者可以依赖抽象的基类来进行功能开发。

2023-08-19 14:51:36 993

原创 设计模式之中介者模式(Mediator)的C++实现

中介者模式(Mediator)的C++代码实现在软件组件开发过程中,如果存在多个对象,且这些对象之间存在的相互交互的情况不是一一对应的情况,这种功能组件间的对象引用关系比较复杂,耦合度较高。如果有一些新的需求变化,则不易扩展。中介者模式使用一个“中介对象”去管理对象间的关联关系,这个中介对象里面定义了对象间的数据统一交互接口,解耦对象间的直接交互依赖,从而提高代码的扩展性。

2023-08-18 19:23:06 896

原创 设计模式之适配器模式(Adapter)的C++实现

适配器模式(Adapter)的C++代码实现。由于使用环境的改变,之前一些类的旧接口放在新环境的功能模块中不再适用。适配器可以解决此类问题。适配器模式:通过增加一个适配器类,在适配器接口中做一些适配操作,将旧模块类转换成使用者Client类期望的接口。

2023-08-18 15:53:25 1475

原创 设计模式之代理模式(Proxy)的C++实现

代理模式(Proxy)的C++实现。在组件的开发过程中,有些对象由于某种原因(比如对象创建的开销很大,或者对象的一些操作需要做安全控制,或者需要进程外的访问等),会使Client使用者在操作这类对象时可能会存在问题:(1)使用者直接访问这种对象会使系统带来很多麻烦。(2)或者使用者使不能直接访问这类对象;使用代理模式就可以解决此类问题。有一个主题类,该类具有请求功能和数据转换功能。而Client使用者不能直接访问和操作它,只能间接的通过其它类进行访问操作。3、代理模式的代码实现。

2023-08-18 12:52:24 1426

原创 设计模式之门面模式(Facade)的C++实现

门面模式(Facade)的C++实现。在组件的开发过程中,某些接口之间的依赖是比较紧密的,如果某个接口发生变化,其他的接口也会跟着发生变化,这样的代码违背了代码的设计原则。门面设计模式是在外部客户程序和系统程序之间添加了一层中间接口,使依赖的接口之间相互解耦。有3个公司,每个公司都有自己的工作流方式;客户端代码使用这3个公司的工作流。3、门面模式代码实现。

2023-08-17 22:28:50 729

原创 设计模式之享元模式(Flyweight)的C++代码实现

面向对象很好地解决了抽象问题,但是创建对象会带来一定的内存开销。绝大部分情况下,创建对象带来的内存开销是可以忽略不计的;在有些情况下是需要谨慎处理的,如类A的sizeof是50个字节,则创建50*1024*100个A对象,则对象的内存大小约为5MB,这个是很占用内存的。享元模式就是使用运用共享技术支持创建大量的对象情况,并同时减少内存开销。有3种类型产品,这几种类型产品的形状和大小各不相同;现有1000个产品(3种类型),分别输出这些产品的类型和大小。

2023-08-17 12:42:55 122

原创 设计模式之构建器(Builder)C++实现

构建器模式的C++代码实现。在软件功能开发中,有时面临“一个复杂对象”的创建工作,该对象的每个功能接口由于需求的变化,会使每个功能接口发生变化,但是该对象使用每个功能实现一个接口的流程是稳定的。构建器就是解决该类现象的。构建就是定义一个抽象类,然后将变化的每个功能接口定义为虚函数,稳定的流程定义为函数接口;其他有变化的类继承该抽象类。有一个产品需要经过设计、制作、包括、出售这几个步骤,才可以完成整个功能。每个产品都会有这几个步骤,但每个产品对应的具体细节是不一样的。

2023-08-16 21:44:38 646

原创 设计模式之原型模式Prototype的C++实现

设计模型之原型模式C++代码实现。在软件功能设计中,经常面临着“某些结构复杂的对象”的创建工作,且创建的对象想拥有其他对象在某一刻的状态,则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象,并且该对象拥有其他对象在某一刻的状态。上面代码main函数中的创建方式根据实际情况选择,如果想隔离new,则使用方式1。原型模式的优点是将创建对象(该新创建的对象具有其他对象的状态,但与其他对象的地址区域是相互独立的)变得比较简洁。设计产品A,B,这个产品有重量和单价,输出产品的价格。3、原型模式代码实现。

2023-08-16 18:56:41 766

原创 设计模式之抽象工厂模式的C++代码实现

抽象工厂方法模式C++实现。在软件功能设计中,经常面临着“一系列相互依赖的对象”的创建工作,同时,由于需求的变化,这些相互依赖的对象会有更多子类的创建功能。抽象工厂模式主要是解决“一系列对象对象的创建工作,且这些对象有相互依赖或者作用的关系”。抽象工厂模式可以将一系列的变化对象分别创建对应的抽象基类,然后将这些有相互作用的抽象基类的对象创建集成到一个工厂类中。抽象工厂方法模式是将有相互依赖的创建工厂集中到一个工厂类中创建,即工厂方法集的类接口。抽象工厂方法模式实现。

2023-08-15 22:15:26 277

原创 设计模式之Bridge模式的C++实现

Bridge模式的C++实现。类实现的功能具有两个变化的维度,甚至由多个维度的变化。Bridge模式使用“对象间的组合关系”解耦抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度变化,即将不同的维度分别进行抽象,然后各自根据变化维度进行继承。Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类甚至由多个变化的维护,这时使用Bridge模式的扩展模式来进行设计代码。

2023-08-09 22:38:11 938

原创 linux下性能分析工具Perf安装与用法

perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。它由一个叫“Performance counters“的内核子系统实现,基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析,可用于性能瓶颈的查找与热点代码的定位。Perf介绍于火焰图分类。火焰图安装命令(1)安装Perf工具(2)下载可视化工具FlameGraph 。火焰图demo测试(1)生成CPU火焰图1(2)火焰图表解析(3)生成差分火焰图步骤。

2023-08-04 22:06:38 4405

原创 C++信号量与共享内存实现进程间通信

C++信号量与共享内存实现进程间通信。

2023-07-28 17:46:08 467

原创 信号量SytemV与Posix信号量的介绍与用法

信号量是一种计数器,用在多进程、多线程的共享资源访问控制上面,防止多进程、多线程对共享资源的同时读写。信号量种类有SystemV信号量和Posix信号量。信号量SystemV是Linux操作系统的内核对象,由内核同一管理,它的生命周期不依赖创建的进程,即使进程退出,信号量依然存在。信号量SystemV常用于多进程间的同步。最简单的信号信号量是只能取0和1的变量,也叫做二进制信号量,可以去多个正数的信号量被称为通用信号量,本文主要讲解二进制信号量。

2023-07-26 23:24:08 477

原创 C++ 创建共享内存

共享内存用于实现进程间大量的数据传输,共享内存是在内存中单独开辟一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和最近访问时间等。返回值:(1)成功,返回共享内存标识符(2)出错,返回-1,错误原因存于errno中。shmflag: 指定共享内存的访问权限和映射条件,一般设置为0,即读写权限。返回值:成功:0,出错:-1,错误原因存在于errno中。返回值:成功:0,出错:-1,错误原因存在于errno中。参数:shmaddr:指定共享内存的映射地址。作用:共享内存的内存管理。

2023-07-16 19:12:29 2860 1

ROS的自定义msg文件的订阅发布功能demo

编译步骤如下: 1、在catkin_ws目录将build文件目录删除。 2、在catkin_ws目录下执行catkin_make命令。 3、执行下面命令 $ source devel/setup.bash $ rosrun topic_demo listener 4、打开另一个终端。进入catakin_ws目录,输入下面命令 $ source devel/setup.bash $ rosrun topic_demo listener

2024-10-28

CMake中一个工程依赖另一个工程生成的动态库demo

project1生成动态库,project2工程中引用porject1中生成的动态库。

2023-10-29

linux下tcp的服务端和客户端代码,一个服务器对应多个客户端 (多线程和select方式创建服务端)

linux下tcp的服务端和客户端代码,一个服务器对应多个客户端。 服务端程序对应多个客户端的创建方式有两种,如下: 1、每一个客户端创建一个线程。 2、使用IO多路复用的select方式来应对多个客户端。 程序启动命令如下: 服务器启动命令:$ ./server 37777 客户端启动命令:$ ./client 127.0.0.1 37777

2023-08-30

OpenglES离屏渲染 C++ demo

该资源使用OpenglES绘制了一个三角形,然后利用帧缓冲将数据读取到buffer,最后使用opencv将数据保存为jpg图片。代码在linux下编写,使用CMake编译。

2023-03-18

opengl加载obj模型

加载obj模型

2023-03-12

VSCode中配置ros环境

在CMakelists中配置最ros环境的demo,注释中带#ROS的为添加的配置,其实只有2部分: (1)查找头文件和库。 (2)添加ROS的静态库

2022-12-07

VScode配置C++工程

VSCode中配置C++,涉及三个文件c_cpp_properties.json,launch.json,tasks.json

2022-12-07

CMakeList配置文件介绍

CMakeList配置文件介绍:里面有3种配置方式, 1:在当前目录下,编译本目录的CMakeLists.txt,生成Makefile和其他文件,执行 (1)$cmake . (2) $make (3)$./main 2:将编译输出文件与源文件放到不同目录中,执行命令: $mkdir build $cd build $cmake .. $make $./main 3:工程多个CMakelists,makelist编译嵌套

2022-12-07

VS2017番茄助手Visual Assist 10.9 Setup2270下载

支持VS2017、2015、2013、2010、2008版本。 步骤: 1、若之前VS2017上已安装番茄助手,请卸载,卸载步骤:打开VS2017->工具->扩展和更新->卸载。点击后,关闭VS2017软件,卸载完成。 2、双击下载的VA_X_Setup2270.exe,安装完成。 3、用VA_X.dll替换电脑中的VA_X.dll文件。 注:VS更高版本是否支持,没有试过。

2022-08-07

基于TCP的服务端和客户端软件

tcp的服务端和客户端,待完善

2022-05-06

RegisterTable.rar

demo为VS2017程序,C++往注册表中写数据读数据,windows程序。

2021-10-05

QtSocket.rar

Qt Socket存在不能一次接收到完整数据的问题,需多次拼接数据;若是复杂的场景,需要较好的处理数据方法,才可接收到完整的数据。本方法可以较好的提取出完整的数据。

2021-05-06

EasyBCD.rar

在windows7系统下,可以使用EasyBCD软件进行引导,进入Ubuntu系统。此资源无需安装EasyBCD,直接使用。

2019-06-30

MFC启动画面(VS2010,无对话框边框,只显示启动图片)

C++,无对话框边框,只显示启动图片,真正的启动动画,值得参考。

2017-08-15

MFC基于对话框的启动画面(只显示启动图片无对话框边框)

本程序使用利用延时关闭启动画面,启动画面没有边框,做到只显示启动图片,真正的启动画面。

2017-08-14

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

TA关注的人

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