《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程

前言:

VipSystem Pro 会员系统插件已经正式上线,请戳官网:https://vipsystem.pro文章源自狐狸影视城-https://fox-studio.net/35107.html

目前在开发一个基于WordPress平台的插件。是一个个人站长用于虚拟链接买卖的辅助插件,可以让你的博客内容变现。其中功能包含用户管理,营销策略,数据分析、以及适用与程序爱好者的一些极客功能等。关于插件的具体介绍,有兴趣可以在本站搜索关键字“vipsystem”来了解这个东西。文章源自狐狸影视城-https://fox-studio.net/35107.html

很早前就有想法第三次重新编写《vipsystem Pro 会员系统》这个插件,因为第二版本从功能设计,代码编写,到UI都越来觉得不好了。而且WordPress版本的升级,PHP版本的升级等,也出现了很多bug。修复起来特别费事,所以想法有很久了,但是因为本身在一家公司工作,做影视后期教育,不是同一个行业,就一直把插件的开发就拖着。文章源自狐狸影视城-https://fox-studio.net/35107.html

从去年12月,就逐渐开始在网上找PHP教程学习,一边学习,一遍重新构思插件的功能框架,需要什么技术就看什么技术,看他难不难,要不要花很多钱买工具什么的。记得最清楚的是,当时从网上看到了面向对象OOP的编程模式。就一下子启发了我对插件重新设计的兴趣。一遍学习,一遍重新架构功能,还化了好几个月写了一个功能的脑图框架文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

除此之外,还有smarty前端模板、OpenSSL数据加密、PDO数据库管理、Memcached缓存管理、SESSION会话控制等等。看了很多技术,也纳入到了功能的架构中,什么功能使用什么样的技术。如何做功能的封装嵌套,规划各功能之间的API数据对接等。功能计划了很多,这篇帖子不具体介绍。之前还写过一个开发历程,请戳这里:https://fox-studio.net/34706.html文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

数据分析动力来源

代码是越写越来劲,真的是对写代码上瘾了。曾经原计划插件中会有数据图表的分析。前两天,给我的好友Meediy(老刘)本地测试,开发的半成品。老刘也是半个程序员,身边除了他还真没有第二个编程方面的朋友了,哈哈,你们看,我都穷到没朋友了。文章源自狐狸影视城-https://fox-studio.net/35107.html

他说感觉还不错,然后,我们就聊了起来,我说接下来想做数据图表了,但是目前还不知道图表怎么写。也不知道用那个图表库。老刘就给我推荐了百度的Echarts制图工具。并且给我还看了官网的宣传片,这东西真的是惊艳到我了。有兴趣可以看看:https://www.echartsjs.com/zh/index.html文章源自狐狸影视城-https://fox-studio.net/35107.html

插件开发是在本地搭建的WordPress环境,其中的数据就是现在这个网站的数据库,我把本站数据弄到本地环境里了。网站从2012年做起,所以存有大量用户数据,和文章数据。数据分析的开发过程中不缺数据样本。哈哈,幸运!也许其他和我一样想法和动力的优秀程序员,没有我这么幸运的有数据样本。文章源自狐狸影视城-https://fox-studio.net/35107.html

然后,接下来周末的2天时间,一边查阅帮助文档,一边开始研究echarts.js图表怎么用到我的插件里。最后第一版用户注册柱状图表就做好了。文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程

注册用户数据

当做完后,才发现真的很好玩,除了流畅的缩放,加载和交互外。就简单的看图,就让我想起来很多往事。文章源自狐狸影视城-https://fox-studio.net/35107.html

我记得前两年,《VipSystem Pro 会员系统》第2个版本写完后,删除过网站里一年中都未登录过的用户数据。当时有1w条注册用户的数据被删除了。现在想来有点后悔,当时想法不成熟,没有把数据看成多么珍贵的资源,就那么轻松的删除了。文章源自狐狸影视城-https://fox-studio.net/35107.html

当我把图表做出来之后,看到下面的位置,心里就回想起来了当时删除1w注册用户的事情。文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

重要的是,这让我意识到,数据分析,对决策的影响。虽然现如今人工智能,大数据什么的话题很火,但是就感觉离自己很远。文章源自狐狸影视城-https://fox-studio.net/35107.html

还有就是通过上面的数据图表,也发现了其中有一天,被人恶意注册了。只有那一天155个新增账户,并且查询后发现,用户名和注册邮箱都特别统一文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

这个只是用户注册时间和当天数量的图标,都看出这么多问题。这个只是第一版,数据分析的维度只是很简单的算法。文章源自狐狸影视城-https://fox-studio.net/35107.html

之后,我又做了文章表的数据分析。从图表分析曾经的事情,下方列表可以查看具体发布的文章文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

从文章发布的数据,也让我回想起来很多事情,并且看到了我在哪个时间段特别勤奋。当然,现在还没写完营销数据的分析部分。如果完成后,就可以通过这些数据分析出整体网站的运营情况。哈哈。文章源自狐狸影视城-https://fox-studio.net/35107.html

目前只做了两个图表,就已经预想到完整数据都完成后是多莫伟大的场景。真的是成神了,指手画脚控制各部门的业务情况。文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

我对数据分析的应用(小故事)

在上家公司的一年里,我从讲师做到了影视后期的项目负责人。除了课程研发与教学,当你做了管理,也会开始关注销售与客户了,还有管理。我自认是个爱折腾的人儿,哈哈(羞羞偷笑)。在上家公司收获很多,最重要的是产生一个想法,数据化管理。文章源自狐狸影视城-https://fox-studio.net/35107.html

最开始我还只是讲师,然后我们项目经理调走了,让我忽然接手这个业务。那真如晴天霹雳!心想,我就是一老师嘛,一点管理经验都没有,偶尔写写代码还行。这担子挑不起来咋整,虽然满心激动。虽说是临时的!也忒忐忑!为这事,我还和我哥聊了一晚上:要不要接手?搞砸了咋办?不会管理咋办?别人不听我的咋办?不会跟人沟通咋办?会不会给我涨工资?会不会天天加班?会不会没空处对象?...各种问题。把我哥都整不会了!文章源自狐狸影视城-https://fox-studio.net/35107.html

我哥也是牛,有一句话让我醍醐灌顶,大意是:选择是放弃的最大成本。当你选择A,那么你就会失去B,B就是你选择A的最大损失。反之亦然!如果两者同等重要,那么你就是幸运的,无论哪种选择,对于长远来看。都是好的!文章源自狐狸影视城-https://fox-studio.net/35107.html

哎,文化不行,语言组织描述不了我当时的体会。不行,以后要继续学习诗歌,提升自身语言表达水平(我本来就会写诗,网站就有。哈哈,厉害不)。文章源自狐狸影视城-https://fox-studio.net/35107.html

最终决定当然要一试。接手之后小半年里,发生了很多故事,也让我的能力和思想有了质的提升。挑一个有趣的讲。当时我们业务还是新开启的。公司内部原有的业务系统不太针对我们的新业务流程,用起来特别不方便。有几个100块钱退款的问题,交接到我这里。我因为啥都不会,就开始各种找人问。除了直属领导,还有从来公司接触的第一个小姐姐(人事小姐姐),学习公司的业务流程,汇报关系等等,还有我们部门销售组的同事,运营组的同事。来回跑了14+天都没解决,就差没给在北京总部的CEO发邮件求助了。最后是我们资深的行政部大姐姐,把我劝住了。文章源自狐狸影视城-https://fox-studio.net/35107.html

大体量公司的业务流程复杂繁琐是常态,各个部门都是通过特定人员进行对接。公司中,除了特别资深和高层领导外,在员工层级,很少会有对公司业务整体流程了如指掌的人。就如同 不识庐山真面目 一样。这让我对大公司有了新的认知!文章源自狐狸影视城-https://fox-studio.net/35107.html

最后解决问题的方法我已经了解到了,大概七八个步骤,中间对接三四个同事,还有后台系统操作,邮件审批等步骤。预估需要两周时间退款到用户的帐上。然鹅,我每天还要上直播课,上课当然需要提前备课的。也是因为接手之前,我已经充足准备了未来一个月的课程内容,本身就做了好几年讲师,都不是大问题。就这个退款问题,把我两周时间搞没了。就这样,直到我的领导帮我把这个事情交接别的部门同事解决。我就没再过问了。文章源自狐狸影视城-https://fox-studio.net/35107.html

当时我一念之间,决定把我们项目的所有业务数据,转到“石墨文档”中进行。有想法就开始做,并且本来就爱好写代码,弄个Excel的表格进行数据统计,可不小菜一碟。文章源自狐狸影视城-https://fox-studio.net/35107.html

为此我花了大概一周的时间,创建了许多在线的Excel表格。写好公式并分发给所有组员。当时准备了一场盛大的部门会议。而且还有记录文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

以前开会我都是汇报者,这次开会我成了主角。开什么玩笑,全程汗流浃背,就算空调呼呼吹。也凉不了剧烈跳动的小心脏。只能来首凉凉送给自个。文章源自狐狸影视城-https://fox-studio.net/35107.html

我让所有组员 全部启用石墨文档进行工作记录,每位组员,人手一份在线的表格文档,下班前填写好数据。我这里有一个数据汇总的表,组员数据已填写,我这边通过算法,就能分析出实时的数据状况。并且我们三个组的负责人,需要查看和分析数据总表。每周进行一次沟通。文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

你是不纳闷,咋数据统计出来,成了下降趋势。哈哈,我说过,我是临的。真正接手时间只有一个月,6月份从各种问题,到7月初规划好整个业务流程方案。上级就派来领导重新规划了我们项目的业务,就这样,我被安排在教学部,主要负责课程。其他事情,交接给有经验的同事搞定。文章源自狐狸影视城-https://fox-studio.net/35107.html

我也明白的很,公司又不缺有才的人,咋可能让没经验的人做管理呢,免费提供机会给我提升经验?再给我发着高薪?哈哈!!继续看我的数据化管理理念。当时就设想过,我需要将所有工作,全部数据化。提高沟通和工作的效率。文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

1.、因为刚开始,学生数不是很多。前期为了进行数据分析和调查,就给为个学生做了回访记录。用于课程规划和提供对应的教学服务。文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

2、我们团队同时也进行了很多头脑风暴,想了很多有效的授课模式,录播直播都会进行。根据我们设想的情况,我也做了学生们学习的计划表。
《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程
文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

3、录播课试过,直播课也进行了测试、也对授课质量,出勤等,进行数据记录。根据同学们上课和作业的记录,评估每位讲师。分析优秀讲师的特征,并进行经验分享和奖赏。文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

4、同时营销活动也很重要。头几行 就有数据分析,我还怕我们部门销售组的小伙伴不会填写,专门写了一个填写样例。供参考文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

5、因为我原本就是做教学的,所以我也按照我们上课的习惯,制定了一份数据统计表格。这个表格特别长,我们课程有很多分类。正式课,预科班,试学课,营销课等。你只看到了四分之一的内容。文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

好了,通过上面这些图例,你是不是感觉到了数据无处不在。就那么简单的一行代码,就能分析出特别重要的数据。让我们的决策变得有迹可循,坚实可靠。文章源自狐狸影视城-https://fox-studio.net/35107.html

通过以上经验,也坚定了,我开发《Vipsystem Pro 会员系统》的信心。虽然不知道会不会给我带来盈利,但是这一份经验,我认为,未来在智能时代,应该不会被淘汰。文章源自狐狸影视城-https://fox-studio.net/35107.html

哈哈,期待插件的新版本吧。其中数据分析目前设想的特别棒。虽然只是自我感觉良好。文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

数据分析算法研究(简略版)

最近在开发过程中,也有人问我学代码难不难,怎么学之类的。我特别感触到编程学习其实不难,感觉像学数学,就是逻辑思维的能力。但是和他们一聊,明显感觉到他们特别怕。就是那种“未见人,只闻其名,先退三分”的感觉。我想说的是,你要入门了,就忽然发现,特别好玩,也很简单。如同中学的物理课。当年我初中时特别喜欢物理实验室,各种灯泡导线,并联串联,还有开关线路设计。跟玩积木一样上瘾。如今写代码就是这种感觉。文章源自狐狸影视城-https://fox-studio.net/35107.html

我用的PHP语言写数据分析的算法,echarts.js库用于图表的制作和渲染。文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

这天遇到挺多问题,也都挨个解决了。以文章数据为例,因为不是连续每天发布文章,所以会有某些天数据是空的。按照我之前的算法,生成的图表,在x轴向上的时间,并不是连续的。文章源自狐狸影视城-https://fox-studio.net/35107.html

《vipsystem Pro 会员系统》开发历程之 – 大数据分析及算法研究历程文章源自狐狸影视城-https://fox-studio.net/35107.html

然后我花了1天的时间,进行算法的优化。最终得到连续的结果。具体关于算法的分解,我相信你们肯定是不乐意听我絮叨的。这篇帖子又不是上专业课对吧。文章源自狐狸影视城-https://fox-studio.net/35107.html

我就直接贴出来我优化好的代码,我做了特别详细的注释,如果你也是程序员肯定看得懂逻辑。知道为什么我要对这段代码,这么重视。文章源自狐狸影视城-https://fox-studio.net/35107.html

/**
 * 1、从wp_post表中查询所有数据,SQL命令
 * 2、按照日期升序排列
 */
$get_data_sql = "SELECT * FROM ".$this->DB->getTableName('wp_post')." ORDER BY post_date asc";

/**
 * 1、如果缓存开启,并且缓存存在,则返回缓存中的数据。
 * 2、如果没有缓存,再进行数据库读取操作
 * 3、缓存开关在config文件设置
 */
if( isset($_SESSION['wp_post']['echarts'][md5($get_data_sql)]) && $this->config::$_config_post_list_echarts_data_cache === true ){

	// 缓存读取数据记录log日期中
	$this->file->writeLog("echarts 缓存数据读取");

	// 输入缓存中的数据
	echo $_SESSION['wp_post']['echarts'][md5($get_data_sql)];

	// 停止脚本
	exit;
}

/**
 * 1、执行SQL命令
 * 2、读取数据库中的数据
 * 3、数据按照文章发布日期升序排列
 * 4、数据格式:索引数字 => array(数据数组)
 * 5、数据放入result数据池中
 *
 * 6、使用PDO扩展进行数据库处理
 */
$result = $this->DB->doSql($get_data_sql,true);

/**
 * 1、以上操作,已将需要分析的数据准备好
 * 2、以下操作,开始进行数据分析
 * 3、数据分析的内容需求:
 * 		a. 以最早的第一篇文章日期(包含所有文章状态),作为起始日。
 * 		b. 截止今日时间为终止日,生成连续的范围日期。
 * 		c. 以连续日期中每日作为一个节点,统计每个节点(每天)的文章数量(包含所有文章状态)。
 * 		d. 如果某日没有产生任何文章(包含所有文章状态),则可将数据统计为0。
 * 4、算法优化后的特点:
 * 		a. 针对大数据量的计算特别友好。
 * 			仅使用一次while循环,其中不嵌套其他任何循环迭代函数。
 * 			
 * 		b. 将算法处理的结果,存入SESSION中进行缓存。
 * 			第二次刷新页面,不进行数据库查询。可使用unset()函数,清除缓存(缓存清除不在此算法中,自行书写)。
 * 			
 * 		c. 资源消耗降到最低,逻辑清晰
 */

// 数据池中第一条数据的日期,也就文件中最早的日期取出(数据池的结果是按文章生成日期升序排列的结果)。
$minimum_post_date = $result[0]['post_date'];

// 将数据池中第一条数据的日期,精确到日。格式为时间戳
$dt_start 	= strtotime(date('Y-m-d',strtotime($minimum_post_date)));

// 今天的时间,格式为时间戳
$dt_end 	= time();

// 创建一个数组容器
$date_array = array();

// 池中数据日期,小于等于今日日期。执行循环,继续重复分析。
while ($dt_start <= $dt_end){

	static $debug_index=0;$debug_index++;
	/**
	 * 调试模式,防止穷举的循环。导致系统崩溃。
	 * 最多循环3000次,超出停止。
	 * 数据分析结果检查没有问题后,屏蔽下面一行判断。
	 */
	// if($debug_index == 3000)break;

	// 定义为天,pass_day 从0计数。经过了多少天的数据
	static $pass_day 	= 0;

	// 定义为当前处理的数据数量,data_index 从0计数。处理了多少条数据
	static $data_index 	= 0;

	// 从池中最早一条数据的日期,定义历史“今日”的日期,精确到日,格式为日期。
	$date_data = date('Y-m-d',$dt_start);

	// 从数据池取出第i条数据。如果能取出,则进行分析
	if( isset($result[$data_index]) ){

		// 第i条数据的日期,精确到日,格式为日期
		$each_post_postDate = date('Y-m-d',strtotime($result[$data_index]['post_date']));

		// 如果第i条数据的日期 等于 历史“今日”的日期。则继续
		if( $each_post_postDate == $date_data ){

			// 判断第i条数据的文章状态
			switch ($result[$data_index]['post_status']) {

				// 已发布状态,统计数+1
				case 'publish':isset($post_data[$each_post_postDate]['publish'])?$post_data[$each_post_postDate]['publish']++:$post_data[$each_post_postDate]['publish'] = 1;break;

				// 待审核状态,统计数+1
				case 'pending':isset($post_data[$each_post_postDate]['pending'])?$post_data[$each_post_postDate]['pending']++:$post_data[$each_post_postDate]['pending'] = 1;break;

				// 草稿状态,统计数+1
				case 'draft':isset($post_data[$each_post_postDate]['draft'])?$post_data[$each_post_postDate]['draft']++:$post_data[$each_post_postDate]['draft'] = 1;break;

				// 自动保存状态,统计数+1
				case 'auto-draft':isset($post_data[$each_post_postDate]['auto-draft'])?$post_data[$each_post_postDate]['auto-draft']++:$post_data[$each_post_postDate]['auto-draft'] = 1;break;

				// 定时状态,统计数+1
				case 'future':isset($post_data[$each_post_postDate]['future'])?$post_data[$each_post_postDate]['future']++:$post_data[$each_post_postDate]['future'] = 1;break;

				// 私有状态,统计数+1
				case 'private':isset($post_data[$each_post_postDate]['private'])?$post_data[$each_post_postDate]['private']++:$post_data[$each_post_postDate]['private'] = 1;break;

				// 继承/修订状态,统计数+1
				case 'inherit':isset($post_data[$each_post_postDate]['inherit'])?$post_data[$each_post_postDate]['inherit']++:$post_data[$each_post_postDate]['inherit'] = 1;break;

				// 回收站状态,统计数+1
				case 'trash':isset($post_data[$each_post_postDate]['trash'])?$post_data[$each_post_postDate]['trash']++:$post_data[$each_post_postDate]['trash'] = 1;break;
			}
			// 统计今日文章总数
			isset($work[$each_post_postDate])?$work[$each_post_postDate]++:$work[$each_post_postDate]=1;

			// 处理完一条数据,data_index 打卡一次
			$data_index++;
		}

		/**
		 * 1. 如果第i条的数据,不是历史“今日”生产的。
		 * 2. 表示“今日”的数据已经处理完成。
		 * 3. 统计数据赋值为0.
		 * 4. 日期加一天,再次循环处理历史“明日”的数据
		 */
		else{

			// 历史“今日”日期+1天,生成历史“明日”日期,格式为时间戳。赋值while循环,供条件判断
			$dt_start = strtotime('+1 day',$dt_start);

			// 各状态的文章,统计为0。下同
			$post_data[date('Y-m-d',$dt_start)]['publish'] 		= 0;
			$post_data[date('Y-m-d',$dt_start)]['pending'] 		= 0;
			$post_data[date('Y-m-d',$dt_start)]['draft'] 		= 0;
			$post_data[date('Y-m-d',$dt_start)]['auto-draft'] 	= 0;
			$post_data[date('Y-m-d',$dt_start)]['future'] 		= 0;
			$post_data[date('Y-m-d',$dt_start)]['private'] 		= 0;
			$post_data[date('Y-m-d',$dt_start)]['inherit'] 		= 0;
			$post_data[date('Y-m-d',$dt_start)]['trash'] 		= 0;

			// 处理完一天的数据,pass_day 打卡一次
			$date_array[] = $pass_day++;
		}
	}else{

		// 数据处理完成,退出循环
		break;
	}
}

代码部分就看个热闹吧,以后插件完成后,说不定会做编程相关的课程!文章源自狐狸影视城-https://fox-studio.net/35107.html

哈哈,感谢您耐心阅读。。。赞一个。文章源自狐狸影视城-https://fox-studio.net/35107.html

 文章源自狐狸影视城-https://fox-studio.net/35107.html

weinxin
千年骚狐
  • 本文由 发表于 2019年11月24日
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
评论:1   其中:访客  1   博主  0
    • 素锦
      素锦 0

      很佩服博主的自学能力

    匿名

    发表评论

    匿名网友 填写信息

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

    确定