基于微信平台的“快递超市”设计


 

毕业设计说明书

 

 

基于微信平台的“快递超市”设计

           


 

基于微信平台的“快递超市”设计

 

 

摘   要

 

通过对当今快递信息管理的分析,依托微信,采用 PHP 和 MySQL 及Apache 技术实现了一个“快递超市”系统。本设计总结了快递信息管理的要点,介绍了微信平台的优势,解析了整个系统开发的一些关键技术与设计,这些技术与设计在类似系统中具有一定通用性。开发与实践的结果显示,采用以上技术与设计,可以有效地提高快递信息在服务商与用户的传递及管理效率,具有较高的实用性。

关键词 微信;快递;Apache;PHP;MySQL


 

 

Design of ‘express-supermarket’

Based on WeChat

 

 

ABSTRACT

 

Forthe current status of express information management, relying on WeChat, usingPHP and MySQL and Apache technology to achieve ‘express-supermarket’ system.This design analyzes the key of express delivery information management,introduces the advantages of WeChat platform, and analyzes some keytechnologies and designs of the whole system development. These techniques anddesigns have certain versatility in similar system. Development and practice ofthe results show that the use of the above technology and design, caneffectively improve the delivery of information in the service providers andusers of the transmission and management efficiency, with high practicality.

 

KEY WORDS  WeChat; Express; Apache; PHP; MySQL


目 录

 

 

中文摘要.I

英文摘要.II

目  录.III

引  言.1

1..现状分析. 1

1.1 快递. 1

1.2 微信. 2

1.3 构想. 2

2..系统功能. 2

2.1.需求设计. 2

2.1.1身份认证.3

2.1.2自主下单.3

2.1.3信息查询.3

2.2.功能设计. 3

3..系统架构. 4

3.1.服务器. 5

3.2.操作系统. 5

3.3.服务器软件. 5

3.4.编程语言. 6

3.5.数据库. 6

4..代码编程. 8

4.1.微信端. 8

4.2.服务器端. 9

4.3.数据库端. 11

5..系统完成. 12

5.1.代码部署. 12

5.1.1微信端.12

5.1.2服务器端.13

5.1.3数据库端.13

5.2.功能测试. 13

6..设计总结. 16

参考文献.17

致  谢.18


 

引 言

随着快递物流环节的精良化,以及快递数据环节的信息化,传统使用的手写纸质快递单造成的电子数据生成错误甚至失败的问题,以及客户对快递物流信息的查询对快递信息传递及管理的要求越发凸显。而微信是腾讯公司在2011年推出的一个基于智能手机的免费应用程序,其核心是社交通讯,这一属性将用户牢牢地聚集在平台之上。截止到2016年第二季度,月活跃用户已达到 8.06亿。用户和企业可以非常方便的在平台上进行沟通。微信平台为解决快递信息传递及管理问题创造了新的可能性。

本论文的研究主题范围内,并没有针对性的文献可供参考。对于本论文而言,只能尝试将各相关研究范围内的文献资料进行收集整理,即收集整理包含快递、网络研发、微信各方面的文献。并尝试从网络的浩瀚之海中学习前沿的技术并加以应用。在整个设计研究过程中,研究得以不断改进与优化。

微信公众平台的后台实际上就是一个WEB项目,能够开发WEB项目的语言环境都可以实现。但每个语言都有各自的特性。例如准备周期不同,开发周期不同,可支持性不同,可维护性不同等等。因此,分析需求并设计合理的系统架构,并选择在合适的编程语言平台上,以及选用适宜的该编程语言的框架完成本系统的各项功能,是主要的问题。

本论文通过对当下快递信息需求,用户需求,及快递服务提供商需求的分析,进行了“快递超市”的功能设计,将内在的功能逻辑转化为实际代码,部署到服务器上,并成功地在微信上进行使用。通过实际使用者的反馈,“快递超市”极大的满足了快递信息传递及管理方面的需求。

基于微信平台的“快递超市”设计为解决传统使用的手写快递单造成的电子数据生成错误甚至失败的问题,以及客户对快递物流信息的查询、提醒即时性的要求,并提供除身份证以外的其他身份认证方式进行了探索,达到了本论文研究的目的。

 

1   现状分析

 

社会正处于电子信息化时代,大多数熟悉的生产生活方式的形态都处于快速的更迭之中。在此趋势下,一些原本分属于不同的生活功能也许能以一种难以预料的方式结合起来,产生出全新的功能,并改变人们原有的生产生活方式。

1.1  快递

在未采用电子信息化时,所有快递数据均采用人工管理,以会计的记账法管理将所有纸质快递单数据收集并整理。快递数据的搜集、分类、处理、反馈等操作程序在传统的手工操作中,工作效率偏低,但由于当时物流环节的限制,对快递数据的要求不是首要之急。

当进入电子信息化时代后,所有的数据在新的管理方式下,需要从手写的纸质快递单转换为电子数据,于是出现了两种信息转换方式。第一种是人工录入方式,即将纸质快递单交给熟悉电脑数据录入的人员进行逐条录入。但这一方式本质上仍需人工处理每条数据,数据的录入速度没有得到很大的提高。第二种是文字识别方式,即通过程序智能识别纸质快递单上的文字,并将其转换为电子数据。但程序的文字识别准确率不高,只能作为一种辅助手段,无法成为一种主流的信息转换方式。并且快递客户对查询、提醒的即时性要求进一步提升。

其次,快递的签收流程要求签收人必须携带有效的身份证件以提供证明。也就意味着如果没有携带有效的身份证件就不能对快递进行签收。必要的身份认证无可避免,但若能提供有一种便捷而安全的身份认证方式来代替上述方式,会有效的提高快递服务的质量。

1.2  微信

随着信息化时代的到来,传统的打电话、发短信的无法满足人们对沟通方式的要求,使用手机聊天软件进行沟通和交流的人越来越多。

不仅仅是因为相比传统打电话、发短信,软件聊天只花费少量流量费用,节约了开支;另一方面,方便和快捷的软件,功能强大,创造了更多有趣、新颖的聊天方式。当前,在主流手机聊天软件中发展最好,使用人群最多的就是微信了,微信 App 经过多次更新,从最初单一的语音通讯聊天,到如今已成为独立的、立体化的社交媒介,并且成为时下人们的一种生活习惯。当今最流行的聊天平台——微信,被越来越多人所选择。

但是,信息化时代产品更迭超乎想象,强大的互联网技术层出不穷,聊天软件市场竞争越发激烈,而微信平台要想立于不败之地,就必须保持对市场的敏锐性,满足广大客户的需求,将这种新兴传播模式持续健康发展[1]

1.3  构想

快递行业的发展重心已逐步由物流环节移向数据环节。如果能在拥有大用户基数的微信平台上,进行对快递的数据管理,那么,快递的数据管理可以分解至每一个用户。即由用户直接产生电子数据,可以选择不再使用纸质快递单。这样,用户既免去了手写快递单的步骤,并且可以在微信平台上随时随地填写信息,也免去必须去快递营业点所花费的时间。

此外,时下兴起的二维码技术通过合理的设计也许可以提供一种便捷而安全的身份认证方式。

 

2   系统功能

 

通过系统的流程及需求,设计分析系统所要实现的功能及功能的结构体系,并以此进行合理有效的服务器与数据库设计。

2.1  需求设计

2.1.1   身份认证

1.在线填写用户姓名,手机号即可完成在公众号的注册。由于手机号已完成实名认证,故不需身份证号,注册后生成与用户绑定的二维码,快递工作人员通过扫描该二维码即可完成实名认证。

2.收件认证本人收件,扫描实名二维码认证;委托收件,收件人可扫描委托人唯一二维码增加快件接收人信息,委托人可根据本人唯一二维码进行收件,减少快递丢失概率。

2.1.2   自主下单

1.选择快递公司,输入快件大致重量体积与递送地,自动生成校园内可寄送的快递公司的价格与递送时长。

2.移动端填写信息,用户通过移动端填写信息:寄件人姓名、联系方式等,收件人姓名、地址、联系方式。

3.移动端与快递小屋打印机互联,打印快递单。

2.1.3   信息查询

1.查询,移动端实时查询;问题件、疑难件提醒。

2.到件提醒,取件时间、地点提醒。

2.2  功能设计

由于快递数据的数据库由快递服务商管理,当快递服务商对数据有需求时,可直接使用数据库进行功能定制。因此本设计侧重研究用户所需功能。用户功能设计如表2-1 所示。


 

表2-1 用户功能设计

功能

功能大类

选择快递公司,输入快件大致重量体积与递送地,自动生成校园内可寄送的快递公司的价格与递送时长。

 

寄件

移动端实时查询物流情况

 

查询

问题件、疑难件提醒,

 

到件提醒,取件时间、地点提醒。

 

查询

在线填写用户姓名,手机号即可完成在公众号的注册。由于手机号已完成实名认证,故不需身份证号,注册后生成与用户绑定的二维码,快递工作人员通过扫描该二维码即可完成实名认证。

 

认证

收件认证本人收件,扫描实名二维码认证;委托收件,收件人可扫描委托人唯一二维码增加快件接收人信息,委托人可根据本人唯一二维码进行收件,减少快递丢失概率。

 

认证

移动端填写信息,用户通过移动端填写信息:寄件人姓名、联系方式等,收件人姓名、地址、联系方式。

寄件

 

实际实现时,为了便于直观性及使用性,再划分功能后,微信菜单结构设计如图2-1所示。

图2-1 菜单结构图

3   系统架构

 

系统采用标准的三层 B/S 架构,分为手机端、服务器端、数据库端,如图3-1所示。手机页面展示端选择微信。但是也需对服务器商,操作系统,以及服务器软件与编程语言等部署环境进行合理选择。

 

图3-1 系统结构图

 

3.1  服务器

快递信息管理系统其本质是管理信息系统( MIS )。

通过各种资料查询,阿里云对解决快递信息管理系统应用问题有如下优势:

(1)通过基于阿里云平台的 MIS 发挥大数据、云计算,为快递服务商供给个人弹性化的、灵活的、订制化的快递服务,满足中小企业集群化和产品灵活调度,降低中小企业的资金成本和人力资源成本的需求提供了优势。

(2)基于阿里云平台的快递信息管理系统可以利用大数据技术分析快递信息服务所汇聚的中小企业的信息,为中小企业供给更加强有力的集群化和产品灵活调度的服务。

(3)阿里巴巴集团发挥阿里云平台的优势,对快递信息管理系统形成一种支撑力,有利于加深阿里巴巴集团与中小企业的合作,在阿里巴巴集团与中小企业之间构筑联盟[2]

综上所述,本系统的服务器选择架设在阿里云服务器上。

3.2  操作系统

现在常用服务器的操作系统大致分为两类: WindowsNT与 Linux。

Windows NT操作者经过简短的培训即可掌握图形用户界面,其安装、使用和管理都比较简单。由于Windows NT 内置 IIS(Internet Informationservice) ,可以很容易地实现网络服务,包括 WWW 、 FTP 、 Gopher 等。因此在很多时候人们会选择使用 Windows NT 。虽然 WindowsNT 是一个易于操作者管理和实现各种网络服务的操作系统,但其稳定性和可靠性不好,出现死机的状况比较频繁,与UNIX及Linux系统相比, WindowsNT差距很大。而且,由于图形占用大量硬件资源,所以虽然操作起来 Windows NT 相对简单,但对系统要求较UNIX 及 Linux 高,在性能速度上更是比Linux逊色很多[3]

基于以上考虑,本系统服务器的操作系统选择 Linux ,以保证服务器无人监守时稳定运行。

3.3  服务器软件

现在常用的服务器软件有IIS(Microsoft)、Apache、Nginx、Tomcat等。

与Linux相似,很大程度上,Apache的巨大成功的原因是由于其开源。相比其他平台,Apache 的跨平台性尤甚,不仅完成了许多基本的功能,例如I/O、内存分配等,并且这些接口与具体平台无关,因此,只要通过对原有的Apache Web服务器进行较少的配置,就可以构建一个伸缩性强的服务器系统;同时,因为使用简单的结构和算法,使Apache Web服务器的理解和维护相对容易,系统稳定性也得到提高[4]

基于以上考虑,本系统服务器的服务器软件选择 Apache ,以保证服务器的稳定运行,并为后续的系统开发提供了便利。

3.4  编程语言

编程语言选择计算机语言中的高级语言,以免去底层编程的精力。但即便如此,计算机的高级语言种类也十分繁多,例如:C 、 C++ 、 C# 、Java 、 PHP 、ASP等等。

其实每一门编程语言都有各自的优缺,而在服务器端有很多编程语言都能胜任工作。但经过仔细的斟酌,本系统服务器的编程语言选择PHP。

PHP作为在编程人员中新兴的热门语言。引用PHP(PersonalHome Page Tools)的官方主页 http://www.php.net 的介绍,PHP是一种脚本语言。其实,它的一些特性与ASP相似,而且主要功能也是用于动态交互式的Web服务器应用程序的开发。PHP构思于1994年,1995年公开第一个版本。而最新版修复了历史版本的一些BUG,并且加入新的扩展功能,使PHP 支持 HTTP 身份验证,Cookie、GIF图像创建等。目前,由PHP开发人员开发的PHP 被大量采用,而且一些大体量的集团公司也采用了 PHP 进行网站开发。如今,世界上有超过600万个网站使用 PHP ,并且仍然保持增长的趋势。PHP的出现,可以成为 ASP 及JSP之外的有一种选择,甚至是最佳选择。它不仅拥有其他网站编程语言的优点,并且它在简便的开发 Web 应用程序的特性,又具有跨平台的可移植性,非常具有发展潜力[5]

3.5  数据库

使用稳定的数据库来对数据进行管理,是整个设计过程中极为重要的一环。如果数据库设计不合理,那么对数据的管理将变得十分复杂。所以根据前期的需求分析与系统的数据体系,选择使用MySQL 。

MySQL 作为目前三大数据库环境:SQL Server、 MySQL 、 Oracle 之一,相比其他选择,具有体积小、速度快、总体拥有成本低,开源等优势,对于本系统而言,是合适之选。

MySQL是 Oracle 公司开源的 RDBMS(Relational Database Management System ,关系型数据库管理系统)应用,是关系型数据库软件中在Web应用领域最受欢迎的选择之一。MySQL 使用标准化 SQL 数据库管理语言,具有较强通用性,为有经验的数据库管理人员最佳选择节省了学习成本[6]。 MySQL 数据库不仅包括数据定义、操纵、控制、服务等主流数据库管理功能,其中数据操纵以数据查询、数据更新、数据删除为主。关系型数据库部分是SQL 数据库的核心部分,通过定义数据关系模式,实现对数据库操作[7]

根据数据的存储模型划分,数据库类型大致分为:网状数据库(Network Database)、树状数据库(HierarchicalDatabase)、面向对象数据库(Object-oriented Database)及关系数据库(Relational Database)。商业应用中数据库管理系统主要使用关系型数据库。关系型数据库基于关系代数对数据进行管理操作的,关系代数的操作有:并、交、差、叉积、选择、投影及连接。数据库管理系统根据需求,对一个及多个关系数据,进行合理高效的运算.取出其中符合操作者需求的集合。用更直观的介绍方式来说,对于关系型数据库而言,管理系统将数据视作操作单元,操作是对操作单元进行的[8]

虽然关系数据库增加了数据库关联信息查询的计算量,但由于本系统并非存在大量的数据关系。故采用关系数据库。

各表结构如下:

1.快递单主表

表3-1 快递单主表(ExpressForm)

名称

字段

数据类型

自增

Null

本表主键

PKID

Int

快递单编号

ExpressNo

Varcahr(50)

发货客户编号

SendCustomerNo

Varcahr(50)

发货客户

SendCustomer

Varcahr(50)

发货客户电话

SendCustomerTel

Varcahr(50)

发货客户地址

SendCustomerAddr

Varcahr(200)

收货客户编号

ReceiveCuetomerNo

Varcahr(50)

收货客户

ReceiveCustomer

Varcahr(50)

收货客户电话

ReceiveCustomerTel

Varcahr(50)

收货客户地址

ReceiveCustomerAddr

Varcahr(200)

发货日期

SendDate

datetime

发货地址

SendAddr

Varcahr(200)

快递费

ExpressFee

Money

备注

Remark

Varcahr(200)

2. 快递单事件表

表3-2 快递单事件表(ExpressFormEvent)

名称

字段

数据类型

自增

Null

本表主键

PKID

Int

快递单主表主键

ExpressFormPKID

Int

事件名称

EventName

Varchar(200)

备注

Remark

Varchar(200)

发生时间

OccurTime

datetime

3.快递费用查询表

表3-3 快递费用查询表(ExpressFee)

名称

字段

数据类型

自增

Null

本表主键

PKID

Int

出发地与目的地

DepartureAndDestination

Varcahr(200)

元/公斤

RMBPerKG

Float

4.用户实名认证表

表3-4 用户实名认证表(Verified)

名称

字段

数据类型

自增

Null

本表主键

PKID

Int

姓名与电话

NameAndTel

Varcahr(200)

二维码信息

QRCodeMessage

Varcahr(200)

 

4   代码编程

 

系统架构设计完毕,通过之前的系统功能分析就可以在 B/S 各端上进行代码编程[9]。由于篇幅所限,只以一个功能在各端的实现作为示例说明。功能的实际请求在系统中的代码流程如图4-1所示。

图4-1 代码流程图

 

4.1  微信端

微信官方要求菜单代码必须是 Json 格式, menu.json 的代码实现如下图4-2所示:

图4-2 menu.json

Json格式是以键值对的形式来进行更规范化网络数据传输的一种标准格式。如代码示意图所示,button代表该json文件携带的信息为按钮菜单的格式,相当于数据结构中树结构的根,其下每一个花括号代表了每一个子树,name代表的是按钮名称,type代表消息类型,url代表消息请求所跳转的网址。

4.2  服务器端

服务器端共有两个文件, form.html 与 service.php 。 form.html 用作信息的录入, service.php 用作数据库的交互。

下面以 EnterInformation.html 与EnterInformation.php 为例。

EnterInformation.html的核心代码实现如下图4-3所示:

 

图4-3EnterInformation.html

Html 是用来进行页面展示并指定整个数据请求的格式的代码。由于手机端与电脑端的尺寸不同,以及页面的美观所需,引入CSS 样式表指定整个 Html 页面的样式。

由于这部分代码涉及到的相关知识过多且无深化讲解的必要,因此略去不表。

EnterInformation.php 的核心代码实现如下图4-4所示:

图4-4 EnterInformation.php

使用 mysql_connect() 函数进行数据库连接测试,执行后考虑到便于调试,使用mysql_error()输出错误信息,相当于处理异常。未免整个数据请求在网络传输时字符集混乱,使用 mysql_query() 设定字符集为UTF-8 。最后通过 mysql_select_db() 函数选择指定的数据库。至此数据库连接完毕。

所有的编号,例如快递编号都使用 rand() 函数产生一个随机数进行分配。再使用date()函数获取当前时间戳并指定格式。

生成一个 sql 语句字符串,由于 php 对字符串的处理支持占位符,可以便捷的直接更改一个字符串,避免了在修改字符串时使用冗长的代码及这个过程中带来的错误。

直接使用 $_POST 全局变量获取 EnterInformation.html 转过来的 HTTP 请求参数并与上文中提到的sql 语句字符串直接合并,完成了一个动态的 sql 语句。

最后使用 mysql_query() 函数执行 sql 语句,完成数据录入。并用 mysql_close()函数释放数据库连接资源。

4.3  数据库端

由于存在多张表,未免重复,以快递单主表为例进行说明

建表语句如图4-5所示:

图4-5 建表语句

Mysql 的建表语句与其他主流数据库类似,但略微有所不同。设定字段自增时需用 auto_increment 关键字指明,另外为使字符集统一建表语句后指明字符集为 UTF-8。

 

5   系统完成

 

将代码正确的部署到 B/S 各端,并对系统使用进行功能测试。

5.1  代码部署

5.1.1   微信端

微信端的代码通过微信官方的微信公众平台接口调试工具部署[10],如图5-1所示。将 menu.json放入"body"文本框中,点击"检查问题"进行菜单生成。

图5-1 微信端部署

最底部的 "Requestsuccessful" 表示菜单已成功生成。微信端菜单如图5-2所示。

图5-2 微信端菜单

5.1.2   服务器端

服务器端代码需要放置在指定的目录下才能使微信端的网络请求得到正确的响应。将所有的 .html 文件与 .php 文件放在服务器的 /var/www/html 路径下。通过电脑端浏览器查看是否部署成功。

图5-3 浏览器页面

120.25.68.197为阿里云分配的服务器 IP 地址。通过访问IP 地址,服务器会调取 index.php 进行响应。而 index.php 中的内容就是字符串“Hello World!!!!”。 图5-3表明.html 文件与 .php 文件已经部署在服务器上,并且可以响应网络请求。

5.1.3   数据库端

在 MySQL 数据库中使用建表语句进行建表。并输入查看表结构的语句进行检测。

Desc ExpressForm;

结果如图5-4所示,建表完成。

图5-4查看表结构

5.2  功能测试

未免行文繁琐,不一一展开所有功能,只使用具有代表性的寄快递中的填写信息功能进行说明。

用户在手机微信端菜单上点击“寄快递”,再点击“填写信息”。如图5-5所示。

图5-5 操作图1

用户在表格中填写快递详细信息。如图5-6所示。

图5-6 操作图2

点击提交,服务器会将用户输入信息发送至数据库保存,并返回输入信息以及快递单号以供用户核实备用。如图5-7所示。

图5-7 操作图3

最后在数据库端查询数据是否成功录入,显示数据库已成功将数据保存,快递服务商已可以用数据生成其定制快递单,免去了二次录入的重复操作。如图5-8所示。

图5-8 操作图4

基于以上结果,可以看到本设计已成功运行并可投入实际使用。

 

6   设计总结

快递行业的发展重心已逐步由物流环节移向数据环节,而基于微信平台的“快递超市”指的是在拥有大用户基数的微信平台上进行的对新的快递数据管理进行的一种新的探索。本文在分析快递和微信的现状后,提出了将二者结合的构想。通过对用户和快递服务商的需求与功能分析,设计了系统结构及运行环境,最后成功完成代码,并可以在微信上进行使用。

通过本系统,说明快递的数据管理可以依托大用户基数的应用,将快递的数据管理的端口交给用户,这不仅为快递服务商解决了一道难题,而解决难题后,快递服务商所提供的服务品质的提升也使用户享受到了更加优质的服务。

此外本次设计也提供了一种便捷而安全的身份认证方式的思路来代替原有的快递签收身份认证方式,为用户省去了携带证件的不便。

本系统的实际使用邀请了一些日常使用快递频率较高者进行使用,系统的使用反馈得到了多数人的肯定,并且,通过邮件询问快递服务商后,发现快递服务商也在尝试包含微信在内的各种平台,来实现本系统设计的初衷。说明了本次设计所具有的实际价值。

研究过程难免存在些许瑕疵,但在一定程度上本设计具有通用性。本设计为不同的生活功能如何进行合理有效的结合进行了探讨,为类似研究打下了基础。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考文献

[1] 徐晓宇.从传播学角度解构微信的信息传播模式[J]. 新媒体研究, 2016, 2(21): 28-29.

[2] 吕超.基于阿里云平台的中小企业 MIS 的应用研究[D]. 山东大学,2015.

[3] 江立颖.基于 Web 的通用远程网络教学平台系统的设计与实现[J]. 硕士论文, 大连理工大学, 大连, 2001.

[4] 侯景华.基于 Apache 的 Web 服务器性能优化和分析[J]. 西安电子科技大学, 西安, 2006.

[5] 何珏飞.基于 php 技术和三层 B/S 模式的办公自动化系统的设计与实现[D]. 天津大学, 2007.

[6] Böttcher S, Hartel R, Wolters D. S2CX: Fromrelational data via SQL/XML to (Un-)Compressed XML[J]. Information Systems,2016, 56:198-213.

[7] 田超. 基于MySQL的计算机网络课程双语教学平台设计[D]. 内蒙古大学, 2016.

[8] 黄锡伟,毕厚杰. 关系型数据库和对象数据库范式和操作研究[J]. 小型微型计算机系统, 1997, 18(11): 61-68.

[9] 黄浪.企业级的B/S模式应用软件非功能性需求分析与研究[D]. 厦门大学, 2008.

[10] 刘厚.微信公众互动平台的设计与实现[D]. 湖南大学, 2016.

 

致  谢

此次毕业设计也算是为大学生活画上了一个句号。此间我所经历和感受到的将使我受益终生。特别感谢朱老师在我完成毕业设计的过程中的敦促,使我能够有效率的完成毕业设计。我生性有些拖沓,有劳老师费心。

生命短暂,很多事情也许把握不住,只要思想不因痛苦和快乐变得慵懒,就是幸事。

 

时间:2017年5月17日22:30:18

原文地址:https://www.cnblogs.com/Sherlock-J/p/12926011.html