自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(51)
  • 资源 (14)
  • 问答 (1)
  • 收藏
  • 关注

原创 新时代的KTV系统设想(一)

工作之后好久没有写过博客了,整天为了那乱七八糟的事情,更可恨的是,现在由C转为Oracle程序员了,不过感觉还挺不错的。好了,牢骚就这么多,开始今天的正文。相信大家和我一样,毕业之后去KTV的次数变多了,但是去的KTV地方多了,你就会发现大部分的KTV系统都还是那个屌样子,没有什么变化:搜歌,唱歌。创新一点的还可点个零食啥的,但新时代的KTV应该是这样吗?根据这两年接触到的新事物,

2013-03-10 22:29:40 1091

原创 一种基于邮件协议的聊天工具

在学习编写局域网即时聊天工具时,发现这种软件只能是在同一个局域网内传递消息。随着网络知识的学习,发现邮件的SMTP和POP3协议支持邮件的发送,而且同样是tcp/ip通信,而且现在很多免费的邮箱都支持客户端存取邮件,这样就联想到将聊天工具架设到一个免费的邮箱上面去!基本思路如下:1、为系统申请2个免费的并支持SMTP和POP3的邮箱(其实也可以不这样),为了下面容易区分,分别记为邮

2010-03-15 22:20:00 2840 4

原创 如何破解安腾校园网客户端(2)

<br />好了吃饱了,继续我们的破解之路。<br />前面已经追到了关键函数,函数中有下面一段代码<br /><br />004166B7  |.  51            PUSH ECX<br />004166B8  |.  68 0C914500   PUSH upplican.0045910C                   ;  这里应该指向一个结构体<br />004166BD  |.  6A 06        

2018-07-11 11:25:26 1034

原创 判断类指针为空的另类做法

class Object{public:        void operation();protected:private:};其实针对上面一个类,相信在很多时候我们需要其对象的一个指,例如下面一句代码Object * pObj = GetOneObject();pObj->operation();相信对于上面一段代码,很多人都会修复其中的一个小bug,然

2011-11-04 20:28:27 1373

原创 获取Android开机启动项列表

最近学习Android,想要写一个手机信息助手,想获取开机启动项,但网上一直没有搜到明确的方法。搜集了很多文章,发现其实还是可以获取开机启动项的。好了,废话不说了,先贴出代码如下,仅供参考:static final String BOOT_START_PERMISSION = "android.permission.RECEIVE_BOOT_COMPLETED"; public List> fetch_installed_apps(){        List packages = getPackageMa

2011-04-05 20:36:00 3121 4

转载 15个编程好习惯(转)

<br />【转载的文章加了一点自己的注释】<br />http://www.cnbeta.com/articles/138055.htm<br />编者按:这是国外程序员Al katib总结的一些编程习惯。<br />1. 动手编码之前,你需要对要编码实现的解决方案有一个正式的或粗略的设计。永远不要在没有任何设计的前提下就开始编码,除非所编代码不重要。<br />【这一点刚开始编程的时候总是不以为然,但随着代码的积累,才渐渐明白设计的重要性。这设计可能不是面面俱到,确实很重要】<br /> <br />2

2011-03-23 20:35:00 482

原创 桥接模式案例

桥接模式的定义:将抽象部分与它的实现部分分离,是他们都可以独立地变化。这样的定义,对于初学者的我,简直就是一头雾水。什么叫做抽象与实现分离?其实上网查阅相关资料,再加上自己工程实践,才慢慢明白这句话的意思。所谓的抽象就是某个类暴露给外界的接口(说白了就是可调用的函数);实现就是这些接口(函数)如何实现。通常当一个抽象有多个实现时,使用继承就可以了。但是继承机制将抽象部分与实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。(书中原话)其实也就是说,如果你修改基类,例如增加了一个接口,

2011-03-19 16:42:00 1369

原创 总结的编码规范

1、宏定义格式:每个单词用下划线隔开。示例:#define           XXX_YYY            20#define、XXX_YYY、20各用两个tab隔开2、一律不得出现常量,对于出现的常量(指数字和字符串),用意义明显的宏定义(或枚举变量)代替。3、每个函数体不能过长,原则上不超过200行4、每个文件不能过长,原则上不超过2500行5、类的规则:(1)构造函数与析构函数放置在public下,并与其他public隔开(2)消息映射函数统一放在一个public下,格式如下:      

2011-02-28 16:42:00 453

原创 总结的编码规范

<br />1、宏定义格式:每个单词用下划线隔开。示例:<br />#define           XXX_YYY            20<br />#define、XXX_YYY、20各用两个tab隔开<br />2、一律不得出现常量,对于出现的常量(指数字和字符串),用意义明显的宏定义(或枚举变量)代替。<br />3、每个函数体不能过长,原则上不超过200行<br />4、每个文件不能过长,原则上不超过2500行<br />5、类的规则:<br />(1)构造函数与析构函数放置在public下

2011-02-28 16:42:00 369

原创 总结的编码规范

<br />1、宏定义格式:每个单词用下划线隔开。示例:<br />#define           XXX_YYY            20<br />#define、XXX_YYY、20各用两个tab隔开<br />2、一律不得出现常量,对于出现的常量(指数字和字符串),用意义明显的宏定义(或枚举变量)代替。<br />3、每个函数体不能过长,原则上不超过200行<br />4、每个文件不能过长,原则上不超过2500行<br />5、类的规则:<br />(1)构造函数与析构函数放置在public下

2011-02-28 16:42:00 366

原创 总结的编码规范

<br />1、宏定义格式:每个单词用下划线隔开。示例:<br />#define           XXX_YYY            20<br />#define、XXX_YYY、20各用两个tab隔开<br />2、一律不得出现常量,对于出现的常量(指数字和字符串),用意义明显的宏定义(或枚举变量)代替。<br />3、每个函数体不能过长,原则上不超过200行<br />4、每个文件不能过长,原则上不超过2500行<br />5、类的规则:<br />(1)构造函数与析构函数放置在public下

2011-02-28 16:41:00 409

原创 利用内存映射处理文件

<br />最近闲来无聊,想写一个简单的文件操作的类。但是由于经验尚浅,对于类的设计总是把握的不是太好。<br />C++毕竟是面向对象,而且自己又学过设计模式(个人觉得这个非常有用),当然也就希望自己设计的类有对象的意味了。<br />学习的最好方法就是模仿,在我印象中C#.NET框架中的类设计的很好,就借鉴一下。<br />.NET中操作文件的类如下:<br />FileStream:提供一个访问文件流对文件进行读写、打开、关闭等操作<br />StreamReader:用于读取文本信息。他会检查字节标

2011-02-25 14:39:00 635

转载 单实例程序

<br />http://www.codeproject.com/Tips/151060/How-to-avoid-multiple-instances-of-your-Windows-ap.aspx#alternate2<br /> 

2011-02-01 11:09:00 362

原创 模板函数实现单例模型

最近在写一个播放器软件,里面的配置类,我考虑了一下准备用单例模型而且是线程安全的。不过考虑到代码的重用性,准备把单例模型的实现部分抽象出来,用一个模板函数来实现实现代码如下:templateSingletonType GetSingleton(SingletonType oneInstance,   CSimpleCriticalSection & clsCriticalSection){//判断某个指针是否为NULL的操作最好抽象成一个模板函数if (UTIL_COMMONFUN::IsNull(oneI

2010-12-26 17:13:00 731

原创 如何实现只启动一个exe进程

<br />  在http://topic.csdn.net/u/20101119/15/8fcae5f3-df45-4116-9f03-a543ef1ee910.html?45107<br />  帖子中,有这样一个问题“编写了一个小应用程序,采用MFC工程,生成了exe文件。<br />  代码中应添加什么内容,使得只允许打开一个exe例程。且在此点击该exe的图标时,已运行的该exe的实例放到桌面的顶端?<br />  学MFC不久,请大家给些方法。方法越多越好!”<br /> 经常会有人提出上面的问

2010-12-21 10:15:00 1149

原创 GDI透明绘图

<br />这几天闲来无事想写一个播放器的界面,但需要GDI透明绘图的知识,找了一些资料,但理解的不是很清楚。<br />BitBlt(hImageDC,0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND)<br />比如上面的函数中源DC是一个单色位图,目的DC是一个彩色位图,如何进行与操作呢?<br />假设目的DC用4位表示一个像素,且整张位图只有2个像素,像素值分别为 1011 0011<br />而源DC是一张单色位图,也只有两个像素,分别

2010-12-07 14:47:00 1379

转载 用BitBlt制作透明位图(1)

http://express.ruanko.com/ruanko-express_17/webpage/tech3.html这里写的真不错,要好好看几遍,对DC认识的不清,对BitBlt认识不清的人可以收获不少。特别是结合光栅操作码看。但是对中间掩码位图的由来不清楚,怎么样制作掩码位图呢?http://www.pcdog.com/a/19/10/x211415.html又发现了上面的这个地方,讲到如何一幅位图的掩码位图,正合我意。主要用到了CreateBitmap()创建了一幅单色的位图,然后将装有源位图的

2010-12-07 14:14:00 3257

原创 如何破解安腾校园网客户端(2)

好了吃饱了,继续我们的破解之路。前面已经追到了关键函数,函数中有下面一段代码004166B7  |.  51            PUSH ECX004166B8  |.  68 0C914500   PUSH upplican.0045910C                   ;  这里应该指向一个结构体004166BD  |.  6A 06         PUSH 6004166BF  |.  6A 07         PUSH 7004166C1  |.  52            PUS

2010-12-06 13:27:00 4869 7

原创 如何破解安腾校园网客户端(1)

注:本博文仅供学习参考,请不要用户其他非法用途。版本:安腾校园网客户端3.3.0操作系统:windowsXP背景:相信很大一部分的高校校园网客户端用的都是安腾校园网客户端,同学无意中发现了一个漏洞,那就是免费上网!真是爽啊。具体是这样的,由于学校对校园网的服务器端进行了升级,说简单点就是网关更改了,如果把电脑网关地址改为新地址,IP随便改(保证在同一网段内),学号随便输入,密码用原始密码,如果这个IP没有被绑定,那恭喜你,可以免费上网了。大家都知道客户端是通过IP,MAC,学号,密码来验证的,其中一个IP只

2010-12-06 11:04:00 12536 1

转载 【项目管理】创建SVN容器

<br />用 TortoiseSVN 进行版本管理时可以很方便的创建容器( repository )。 甚至在一个人开发的情况下也可以在本地创建一个容器 , 在工作的时候将项目checkout 出来,修改之后再 commit 。 这样既可以对每次提交的项目进行自动备份,同时又保留了项目进展的日志。 从而更加方便高效地管理项目。                 要将一个项目放入容器中进行管理, 可以通过下面步骤:                ●  确认正确安装有TortoiseSVN         

2010-11-22 11:41:00 770

原创 音频播放器

<br />下面是我在google code上的工程 http://code.google.com/p/myttplayer/

2010-11-12 16:08:00 538

原创 如何在google code创建自己的工程

<br />在平时我们写代码往往会遇到这样的问题:对某个阶段的代码进行备份,防止由于编码的失误造成新版本错误太多,这时候需要恢复到之前的版本。我之前的做法就是将错误过多的代码删除,用原来备份的代码重新在写!这样非常的浪费时间与精力,解决这个问题的一个比较完美的方法就是利用google code!<br />1、工欲善其事必先利其器。<br />     分别下载TortoiseSVN、AnkhSvn,下载的地址、安装的方法就不介绍了,大家可以google一下。但有一点需要注意,就是AnkhSvn有可能安装不

2010-11-12 10:15:00 1783

转载 MCIWnd的使用

<br />Windows中提供了一个MCIWnd窗口类,可以更加方便的在一个VC窗口中操作多媒体。 <br />  使用MCIWnd,源文件中需要包含头文件 vfw.h,在Project->Settings->Link->Object/libray module中加入库 vfw32.lib。 <br /> <br />详细内容参考一下博文:<br />http://blog.163.com/xy-home/blog/static/29500416200762103958696/

2010-11-09 21:33:00 655

转载 [转][VC/MFC]VC资源分配、释放表

<br />资源                            分配函数                            清除函数                     需要手动清除?<br />======================================================================<br /><br />Accelerators                 LoadAccelerators                 N/A   

2010-11-08 16:43:00 402

原创 WTL按钮自绘机制

<br />这几天想自己写一个WTL的SkinButton,找了好长时间的资料才搞明白。<br />在搜索资料在过程中发现,大家都是知道怎么实现,贴出了一大段代码,但是很多人并不明白实现窗体自绘的原理。下面就如何实现窗体自绘我给出自己的解法:<br />1、第一步就是控件的子类化,这个是用来让自己写的类接受window消息的。这个就不具体讲解了,<br />可以参考:<br />http://www.cnblogs.com/wdhust/archive/2010/09/18/1830097.html<br

2010-11-07 11:02:00 3551 1

原创 搜索引擎探究(一)

<br />前段是时间找工作,受打击了,本以为自己熟练了掌握了C/C++,windows编程,ATL、WTL编程,可以熟练的编写win32DLL,可以熟练的写MFC程序,就可以找个差不多的公司,谁料到,并不是所有的公司都找这样写window客户端的人。<br />百度,搜索;阿里,数据挖掘。这些东西,我真是一窍不通,所以一怒之下开始研究搜索引擎(主要是想去百度,所以研究一下这个)<br />《自己动手写搜索引擎》罗刚写的那本,这本书写的不错,当然讲的比较简单,但是对于入门确是一本很不错的书。<br />一、

2010-11-06 19:20:00 666

原创 win32DLL导出函数、变量、类

<br />1、新建-->win32项目,程序名字为DLL,应用程序类型选择DLL,附加选项选择导出符号,添加公共头用于,这个可以选择ATL,也可以不选<br /><br />2、生成主要文件有DLL.h,DLL.cpp,注意此处的DLL可以是任意的<br />DLL.cpp内容如下:<br />// Dll.cpp : 定义 DLL 应用程序的入口点。<br />//<br />#include "stdafx.h"<br />#include "Dll.h"<br /><br />#ifdef _MAN

2010-11-06 17:20:00 2202

转载 Windows对象 (Object) 结构

<br />Windows系统的各种资源以对象(Object)的形式来组织,例如File Object, Driver Object, Device Object等等,但实际上这些所谓的“对象”在系统的对象管理器(Object Manager)看来只是完整对象的一个部分——对象实体(Object Body)。Windows XP中有31种不同类型的对象,Object Body反映了某一类型对象的特征信息,例如,文件对象使用FILE_OBJECT结构描述、驱动对象使用DRIVER_OBJECT结构描述、DEV

2010-11-03 17:03:00 515

原创 volatile存储器限定符

<br />对于volatile类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况

2010-11-03 16:36:00 390

原创 Notepad++源码学习心得(不断更新中。。。)

1、功能点:    获取父窗口的背景色相关函数:    static COLORREF getParentDlgBkColor(HWND hWnd)基本思想:给父窗口发送一条WM_ERASEBKGND消息,参数是一个与父窗口大小相同的位图;父窗口处理这个消息时候,将本身的或用指定的画刷将与自己背景色相同的颜色画在传进来的那张位图上然后在取得这张位图0,0点的颜色即可确定父窗口的背景颜色心得:      这个函数的处理比较简单,利用消息进行各个窗体间的通信。但是却有不好的感觉,因为这个函数的动机是用来获取父窗

2010-10-31 15:43:00 1640

转载 动态内存分配与释放(new and delete)

Cpp Operators of new and delete1. 动态内存分配与释放(new and delete)一般说来,一个对象的生命期是由它被创建时所处的区域决定的。例如,在一对{}类定义的一个对象,在离开这个由{}所界定的区域时,该对象就会被销毁,在这个区域之外这个对象是不存在的,程序的其他部分不能再引用这个对象了。<br /> 如果希望在离开了创建这个对象时所处的区域后,还希望这个对象存在并能继续引用它,就必须用new操作符在自由存储空间来分配一个对象。这个过程也叫做动态内存分配,也叫堆对象。

2010-10-31 15:36:00 5222

转载 动态内存分配与释放(new and delete)

Cpp Operators of new and delete1. 动态内存分配与释放(new and delete)一般说来,一个对象的生命期是由它被创建时所处的区域决定的。例如,在一对{}类定义的一个对象,在离开这个由{}所界定的区域时,该对象就会被销毁,在这个区域之外这个对象是不存在的,程序的其他部分不能再引用这个对象了。<br /> 如果希望在离开了创建这个对象时所处的区域后,还希望这个对象存在并能继续引用它,就必须用new操作符在自由存储空间来分配一个对象。这个过程也叫做动态内存分配,也叫堆对象。

2010-10-31 15:36:00 638

转载 动态内存分配与释放(new and delete)

Cpp Operators of new and delete1. 动态内存分配与释放(new and delete)一般说来,一个对象的生命期是由它被创建时所处的区域决定的。例如,在一对{}类定义的一个对象,在离开这个由{}所界定的区域时,该对象就会被销毁,在这个区域之外这个对象是不存在的,程序的其他部分不能再引用这个对象了。<br /> 如果希望在离开了创建这个对象时所处的区域后,还希望这个对象存在并能继续引用它,就必须用new操作符在自由存储空间来分配一个对象。这个过程也叫做动态内存分配,也叫堆对象。

2010-10-31 15:36:00 323

转载 动态内存分配与释放(new and delete)

Cpp Operators of new and delete1. 动态内存分配与释放(new and delete)一般说来,一个对象的生命期是由它被创建时所处的区域决定的。例如,在一对{}类定义的一个对象,在离开这个由{}所界定的区域时,该对象就会被销毁,在这个区域之外这个对象是不存在的,程序的其他部分不能再引用这个对象了。<br /> 如果希望在离开了创建这个对象时所处的区域后,还希望这个对象存在并能继续引用它,就必须用new操作符在自由存储空间来分配一个对象。这个过程也叫做动态内存分配,也叫堆对象。

2010-10-31 15:36:00 466

转载 定制new和delete(Cpp Operators of new and delete)

Cpp Operators of new and delete1. 动态内存分配与释放(new and delete)一般说来,一个对象的生命期是由它被创建时所处的区域决定的。例如,在一对{}类定义的一个对象,在离开这个由{}所界定的区域时,该对象就会被销毁,在这个区域之外这个对象是不存在的,程序的其他部分不能再引用这个对象了。<br /> 如果希望在离开了创建这个对象时所处的区域后,还希望这个对象存在并能继续引用它,就必须用new操作符在自由存储空间来分配一个对象。这个过程也叫做动态内存分配,也叫堆对象。

2010-10-22 13:15:00 1117

原创 匿名结构体的妙用

<br />struct { int iIndex ; TCHAR * szLabel ; TCHAR * szDesc ; } sysmetrics [] = { SM_CXSCREEN, TEXT ("SM_CXSCREEN"), TEXT ("Screen width in pixels") }; 注意上面的语法,匿名结构体后面没有分号,意味着sysmetrics []是一个这个匿名结构体类型的数组,在 sysmetrics []初始化时, SM_CXSCREEN, TEXT ("SM_CXSCREE

2010-10-07 10:15:00 4354

原创 Sum Problem

Sum ProblemTime Limit: 1000/500 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 77962 Accepted Submission(s): 17478Problem DescriptionHey, welcome to H

2010-05-06 15:10:00 985 1

原创 PPStream播放器完整控件

powplayerpsnetworkpp2play上面三个dll是必须的其中PowerList不是必须的,如果想开发网络电视则应该添加PowerList.ocx及相关组件下载地址http://www.ppstream.com/bin/powerplayer.cab               函数接口 Method void AboutBox();显示关于PPStream对话框.v

2010-03-20 20:06:00 746

原创 如何在在主窗体显示前显示一个窗体既广告窗体

   public class StartUpMessage    {       public StartUpMessage()       {       }       private bool _isInit = false;//如果想关闭线程中的窗体则将IsInit设置为TRUE       public bool IsInit       {           set {

2010-03-20 12:45:00 884

原创 搜集的工具软件(.NET)

1 P/invoke interop assistant为某个指定api生成对应的C# 或vb.net的声明代码2 tlbimp将com类型库中的类型定义转换为公共语言运行库程序集中的等效定义3 tlbexp生成一个类型库,该类型库描述公共语言运行库程序集定义的类型4 。NET reflector强大的。NET程序集反编译工具5 msil汇编程序从中间语言msi

2010-03-19 12:56:00 377

kafka & mafka client开发与实践

内容介绍: Kafka是一个高吞吐量分布式消息系统。linkedin开源的kafka。 Kafka就跟这个名字一样,设计非常独特。 首先,kafka的开发者们认为不需要在内存里缓存什么数据,操作系统的文件缓存已经足够完善和强大,只要你不搞随机写,顺序读写的性能是非常高效的。kafka的数据只会顺序append,数据的删除策略是累积到一定程度或者超过一定时间再删除。Kafka另一个独特的地方是将消费者信息保存在客户端而不是MQ服务器,这样服务器就不用记录消息的投递过程,每个客户端都自己知道自己下一次应该从什么地方什么位置读取消息,消息的投递过程也是采用客户端主动pull的模型,这样大大减轻了服务器的负担。Kafka还强调减少数据的序列化和拷贝开销,它会将一些消息组织成Message Set做批量存储和发送,并且客户端在pull数据的时候,尽量以zero-copy的方式传输,利用sendfile(对应java里的 FileChannel.transferTo/transferFrom)这样的高级IO函数来减少拷贝开销。可见,kafka是一个精心设计,特定于某些应用的MQ系统。

2016-12-19

socket封装

本人根据桥接模式和工厂模式对windows下的socket通信进行封装,使tcp、udp通信变得简单,代码写的非常清晰,但读者需要有一定的设计模式的功底和较高的C++类方面的知识

2011-10-26

彻底深入剖析WTL精髓

深入剖析WTL 一.Win32模型 二.如何封装Windows界面程序 三.WTL框架窗口分析 深入剖析WTL

2010-11-14

WTL下的SkinButton

在WTL框架下些的一个SkinButton类,对于学习WTL的童鞋来说可是个不错的源码,欢迎下载,欢迎交流

2010-11-07

用DLL实现多语言支持.doc

用DLL实现多语言支持

2010-10-09

三层架构开发的C#视频播放器

对此软件又进行了更新,需要的话联系我 根据三层架构框架用C#语言写的视频播放器。 其中播放控件是用PPStream相关组件开发的,调试时需要安装PPStream或其相关组件。 其中包含有发送邮件模块,值得参考。 基础的DLL开发的比较完善,软件的所有功能并没有全部实现,后续的工作就是完善剩下的功能。 其中操作数据库的DLL是对.NET的比较好的封装,但并没有提供源码,需要的话,邮件联系我[email protected]

2010-02-26

TH-union(FPGA)-在FPGA芯片中实现的非流水线的CPU设计

ise的仿真代码,不过还不太成熟,凑合着看吧

2009-12-13

词法分析程序Expre版

由于刚学编译原理,现在用C#写的词法分析程序只是简单的演示一下,以后会慢慢更正修改的。不过已经实现了词法分析的基本功能

2009-10-18

ComboBox下拉选择字体控件

用combobox实现的字体格式选择控件,此控件实现的功能相对简化,但是能满足基本的要求。此Dll是一个用户自定义控件,引用方法可上网搜集.

2009-10-07

DataBaseLIb

我用c#写的操作数据库的一个DLl,实现基本的功能,欢迎大家使用。用的时候会有详细的提示。

2009-10-03

C#图形界面最小生成树

最小生成树 Access数据库操作 GDI画图 InputBoxC#实现.这是我在网上查了好多资料写的一个算最小生成树的一个窗体应用程序,综合了多方面的知识,很值得借鉴

2009-07-10

飞信api函数设计说明书

飞信api函数说明,版本是v1.0方便大家研究使用

2008-12-08

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

TA关注的人

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