image

编辑人: 沉寂于曾经

calendar2025-07-28

message3

visits436

2014年5月 数据库系统工程师 下午题答案及解析

一、问答题

1、阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。

【说明】

某巴士维修连锁公司欲开发巴士维修系统,以维护与维修相关的信息。该系统的主要功能如下:

1)记录巴士ID和维修问题。巴士到车库进行维修,系统将巴士基本信息和ID记录在巴士列表文件中,将待维修机械问题记录在维修记录文件中,并生成维修订单。

2)确定所需部件。根据维修订单确定维修所需部件,并在部件清单中进行标记。

3)完成维修。机械师根据维修记录文件中的待维修机械问题,完成对巴士的维修,登记维修情况;将机械问题维修情况记录在维修记录文件中,将所用部件记录在部件清单中,并将所用部件清单发送给库存管理系统以对部件使用情况进行监控。巴士司机可查看已维修机械问题。

4)记录维修工时。将机械师提供的维修工时记录在人事档案中,将维修总结发送给主管进行绩效考核。

5)计算维修总成本。计算部件清单中实际所用部件、人事档案中所用维修工时的总成本;将维修工时和所用部件成本详细信息给会计进行计费。

现采用结构化方法对巴士维修系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。

 

 【问题1】

使用说明中的词语,给出图1-1中的实体E1~E5的名称。

【问题2】

使用说明中的词语,给出图1-2中的数据存储D1~D4的名称。

【问题3】

说明图1-2中所存在的问题。

【问题4】

根据说明和图中术语,釆用补充数据流的方式,改正图1-2中的问题。要求给出所补充数据流的名称、起点和终点。

参考答案:


【问题1】

使用说明中的词语,给出图1-1中的实体E1~E5的名称。

【参考答案】

E1:巴士司机 E2:机械师 E3:会计 E4:主管 E5:库存管理系统

【试题分析】

本题考査的是DFD的应用,属于比较传统的题目,考查点也与往年类似。

本问题考查的是顶层DFD。顶层DFD通常用来确定系统边界,其中只包含一个唯一的加工(即待开发的系统)、外部实体以及外部实体与系统之间的输入输出数据流。题 目要求填充的正是外部实体。

从题子说明1)没有明确说明由巴士到车库后由谁提供待维修问题,图1-1中的E1, 考察说明中3)中最后一句说明"巴士司机可查看已维修机械问题"可以看出,从系统到巴上司机有输出数据流"已维修机械问题",可知E1为巴士司机。从2)中"机械师根据维修记录文件中的待维修机械问题,完成对巴士的维修,登记维修情况"再看说明

4)中机械师提供维修工时,可以看出,从E2到系统有输入数据流"维修工时"、输出数据流"待维修机械问题",可知E2为机械师,还将维修总结发送给主管,即系统到E4 有输出数据流"维系总结",可知E4为主管。从说明5)将维修工时和所用部件成本详细信息给会计,从系统到E3有输出数据流"维修工时和所用部件成本详细信息",可知E3为会计。说明3)中将所用部件清单发送给库存管理系统以对部件使用情况进行监控,及系统到E5有输出数据流"所用部件清单",可知E5为库存管理系统。

【问题2】

使用说明中的词语,给出图1-2中的数据存储D1~D4的名称。

 【参考答案】

D1:巴士列表文件  D2:维修记录文件   D3:部件清单   D4:人事档案

【试题分析】

本问题考査0层数据流阁中的数据存储。系统中的主要功能与图1-2中的处理一一对应,1)对应处理"记录巴士ID和维修问题",将巴士ID记录在巴士列表文件中,可知D1为巴士列表文件。说明2)对应处理"确定所需部件",将维修所需部件在部件淸单中进行标记,所以D3为部件清单。说明1)中将待维修机械问题记录在维修记录文件中,可知D2为维修记录文件。说明4)对应处理"记录维修工时",描述了将机械师提供的维修工时记录在人事档案中,可以判定D4是人事档案。

【问题3】

说明图1-2中所存在的问题。

【参考答案】

图1-2中处理3只有输出数据流,没有输入数据流。D2和D3是黑洞,只有输入的数据流,没有输出的数据流。父图与子图不平衡,图1-2中没有图1-1中的数据流"维修情况"。

【试题分析】

本问题考查0层数据流图中的数据流。分析图1-2,可以发现,处理3只有输出数据流没有输入数据流,D2和D3只有输入数据流,而没有输出流,造成黑洞。另外,对照图1-2和图1-1,发现图1-1中从E2输入的数据流维修工时/维修情况,在图1-2中只有维修工时,造成父图与子图不平衡。

【问题4】

根据说明和图中术语,釆用补充数据流的方式,改正图1-2中的问题。要求给出所补充数据流的名称、起点和终点。

【参考答案】


2、阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

某健身俱乐部要开发一个信息管理系统,该信息系统的部分关系模式如下:

员工(员工身份证号,姓名,工种,电话,住址)

会员(会员手机号,姓名,折扣)

项目(项目名称,项目经理,价格)

预约单(会员手机号,预约日期,项目名称,使用时长)(外键:会员手机号)

消费(流水号,会员手机号,项目名称,消费金额,消费日期)(外键:会员手机号,项目名称)

有关关系模式的属性及相关说明如下:

1)俱乐部有多种健身项目,不同的项目每小时的价格不同。俱乐部实行会员制,且需要电话或在线提前预约。

2)每个项目都有一个项目经理,一个经理只能负责一个项目。

3)俱乐部对会员进行积分,达到一定积分可以进行升级,不同的等级具有不同的折扣。 

根据以上描述,回答下列问题:

 【问题1】

请将下面创建消费关系的SQL语句的空缺部分补充完整,要求指定关系的主码、外码,以及消费金额大于零的约束。

CREATE TABLE 消费(

流水号 CHAR(12) (   a   ) ,

会员手机号CHAR(11),

项目名称CHAR (8),

消费金额NUMBER (  b  ) ,

消费日期DATE,

(  c  ),

(  d  ),

);

【问题2】

(1)手机号为18812345678的客户预约了2014年3月18日两个小时的羽毛球场地,消费流水号由系统自动生成。请将下面SQL语句的空缺部分补充完整。

INSERT INTO消费(流水号,会员手机号,项目名称,消费金额,消费日期)

SELECT '201403180001','18812345678','羽毛球', (  e  ) ,'2014/3/18'

FROM会员,项目,预约单

WHERE 预约单.项目名称=项目.项目名称AND (  f  ) 

AND 项目.项目名称='羽毛球'

AND 会员.会员手机号='18812345678';

(2)需要用触发器来实现会员等级折扣的自动维护,函数float vip_value(char(11) 会员手机号)依据输入的手机号计算会员的折扣。请将下面SQL语句的空缺部分补充完整。

CREATETRIGGERVIP_TRG AFTER ( g ) 0N ( h )

REFERENCINGnew row AS nrow

FOR EACH ROW

BEGIN

UPDATE 会员

SET ( I )

WHERE ( j ) ;

END

【问题3】

请将下面SQL语句的空缺部分补充完整。

(1)俱乐部年底对各种项目进行绩效考核,需要统计出所负责项目的消费总金额大于等于十万元的项目和项目经理,并按消费金额总和降序输出。

SELECT 项目.项目名称,项目经理,SUM(消费金额)

FROM 项目,消费

WHERE ( k ) 

GROUP BY ( l )

ORDER BY ( m ) ;

(2)查询所有手机号码以"888"结尾,姓"王"的员工姓名和电话。

SELECT 姓名,电话

FROM员工

WHERE姓名 ( n ) AND 电话 ( o )

参考答案:

【问题1】

【参考答案】

(a)PRIMARY KEY (或NOT NULL UNIQUE)

(b)CHECK(消费金额>0)

(c)FOREIGN KEY(会员手机号)REFERENCES 会员(会员手机号)

(d)FOREIGN KEY(项目名称)REFERENCES 项目(项目名称)

【试题分析】

本题考査SQL的应用,属于比较传统的题目,考查点也与往年类似。

本问题考查数据定义语言DDL和完整性约束。根据题意,需要对"消费"表的"流水号"加主键(或非空)约束,考查实体完整性约束,对应的语法为:

PRIMARY KEY (或 NOT NULL UNIQUE )

"消费金额"需要大于0,所以需要加Check约束,对应的语法为:

CHECK (消费金额>0)

"会员手机号"是"会员"关系的主键,是"消费"关系的外键,考查参照完整性约束,需要增加外键约束,对应的语法为:

FOREIGN KEY (会员手机号)REFERENCES   会员(会员手机号)

"项目名称"是"项目"关系的主键,是"消费"关系的外键,考查参照完整性约束,需要增加外键约束,对应的语法为:

FOREIGN KEY (项目名称)REFERENCES 项目(项目名称)

【问题2】

【参考答案】

(1)(e) 价格*使用时长*折扣

          (f) 预约单.会员手机号=会员.会员手机号

(2)(g) INSERT

        (h)消费

        (i)折扣=vip_value(nrow.会员手机号)

          (j)会员.会员手机号=nrow.会员手机号

【试题分析】

本问题考查数据操纵语言DML。

(1)本题考查一个较完整的查询语句,需要向"消费"关系插入新元组。

SELECT子句缺少"消费金额"。消费金额=价格*使用时长*折扣。

WHERE子句缺少"预约单"关系和"会员"关系按照"会员手机号"的连接,因此应该增加"预约单.会员手机号=会员.会员手机号"。

(2)本题考查触发器,触发器是一个能由系统自动执行对数据库修改的语句。一个触发器由事件、条件和动态三部分组成:事件是指触发器将测试条件是否成立,若成立 就执行相应的动作,否则就什么也不做;动态是指若触发器测试满足预定的条件,那么就由数据库管理系统执行这些动作。本题首先定义触发器的事件,用触发器来实现会员等级折扣的自动维护。

(g)和(h)缺少向"消费"关系插入的语句,因此应该分别补充"NSERT"和 "消费"。

(i)语句调用vip_value函数实现会员折扣的更新,函数参数为会员手机号,因此应该补充"折扣=vip_value(nrow.会员手机号)"。

(j)语句实现"会员"关系和"nrow"关系按照"会员手机号"的连接,因此应该补充"会员.会员手机号=nr0w.会员手机号"。

【问题3】

【参考答案】

 (1)(k)项目.项目名称=消费.项目名称

      (i)项目.项目名称,项目经理 HAVING SUM(消费金额)>= 100000

       (m) SUM(消费金额)DESC

(2)(n) LIKE"王%'

       (o) LIKE "%888"

【试题分析】

本问题考査数据操纵语言DML。

(1)本题考查一个较完整的查询语句,知识点包括夺标查询、集函数、查询分组、分组条件和排序查询结果。査询涉及"项目"和"消费"关系模式。用集函数SUM(消 费金额)求消费总金额,若有GROUP BY子句,则集函数作用在每个分组上,且GROUP BY之后应包含除了集函数之外的所有结果列。若GROUP BY之后跟有HAVING子句,则只有满足条件的分组才会输出。"RDER BY"列名[ASC|DESC]"对输出结果进行升序或降序的排列,若不明确制定法升序或降序,则默认升序排列。

(2)本题考查用关键字LIKE进行字符匹配。

LIKE的语法为:

[NOT] LIKE '<匹配串>'

其中,匹配串可以是一个完整的字符串,也可以含有通配符%和_,其中%代表任意长度(包括0长度)的字符串,_代表单个字符。手机号码以"888"结尾,姓"王"的 员工对用的表示为:姓名LIKE'王%"AND电话LIKE"%888'。

解析:

本题考查SQL的应用和完整性约束。对于问题1,需要指定关系的主码、外码以及消费金额大于零的约束。"消费"表的主键可以设为流水号,消费金额需要大于零,所以加上CHECK约束。会员手机号和项目名称是外键,需要引用对应表的主键,所以加上FOREIGN KEY约束。

3、阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

某家电销售电子商务公司拟开发一套信息管理系统,以方便对公司的员工、家电销售、家电厂商和客户等进行管理。

【需求分析】

(1)系统需要维护电子商务公司的员工信息、客户信息、家电信息和家电厂商信息等。员工信息主要包括:工号、姓名、性别、岗位、身份证号、电话、住址,其中岗位包括部门经理和客服等。客户信息主要包括:客户ID、姓名、身份证号、电话,住址、账户余额。家电信息主要包括:家电条码、家电名称、价格、出厂日期、所属厂商。家电厂商信息包括:厂商ID、厂商名称、电话、法人代表信息、厂址。

(2)电子商务公司根据销售情况,由部门经理向家电厂商订购各类家电。每个家电厂商只能由一名部门经理负责。

(3)客户通过浏览电子商务公司网站查询家电信息,与客服沟通获得优惠后,在线购买。

【概念模型设计】

根据需求阶段收集的信息,设计的实体联系图(不完整)如图所示。

 

【逻辑结构设计】

根据概念模型设计阶段完成的实体联系图,得出如下关系模式〔不完整)

客户(客户ID、姓名、身份证号、电话、住址、账户余额)

员工(工号、姓名、性别、岗位、身份证号、电话、住址)

家电(家电条码、家电名称、价格、出厂日期、 (1) )

家电厂商(厂商ID、厂商名称、电话、法人代表信息、厂址、 (2) )

购买(订购单号、 (3) 、金额)

 【问题1】 

补充实体联系图中的联系和联系的类型。

【问题2】

根据图,将逻辑结构设计阶段生成的关系模式中的空(1)~(3)补充完整。 用下划线指出"家电"、"家电厂商"和"购买"关系模式的主键。

【问题3】

电子商务公司的主营业务是销售各类家电,对账户有佘额的客户,还可以联合第二方基金公司提供理财服务,为此设立客户经理岗位。客户通过电子商务公司的客户经理和基金公司的基金经理进行理财。每名客户只有一名客户经理和一名基金经理负责'客户经理和基金经理均可负责多名客户。请根据该要求,对图进行修改,画出修改后 的实体间联系和联系的类型。

参考答案:

【问题1】

【问题2】

【参考答案】

(1)厂商ID

(2)部门经理工号 或 经理工号 或 员工工号

(3)客户ID、客服工号、家电条码


【问题3】


解析:

问题1考查数据库的概念结构设计,要求补充完整实体联系图中的联系和联系的类型。根据题目的需求描述,可以得知家电厂商和家电之间存在供应联系,客户、客服和家电之间存在购买联系,员工和部门经理之间存在包含关系。
问题2考查数据库的逻辑结构设计,要求补充完整各关系模式并给出各关系模式的主键。根据实体联系图和需求描述,可以得知家电关系中需要记录家电厂商的主键“厂商ID”,家电厂商关系中需要记录部门经理的主键“部门经理工号”,购买关系中需要记录客户、客服和家电的主键包括“客户ID”、“客服工号”、“家电条码”。而各关系模式的主键分别为家电条码、厂商ID、订购单号。
问题3也是考查数据库的概念结构设计,根据新增的需求在实体联系图中增加实体和联系的类型。根据问题描述,需要新增实体“客户经理”,并增加理财联系。由于客户只由一名客户经理和一名基金经理负责,所以联系的类型为客户与客户经理、基金经理之间的一对多对一的联系。

4、阅读下列说明,冋答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

某图书馆的管理系统部分需求和设计结果描述如下:

图书馆的主要业务包括以下几项:

(1)对所有图书进行编目,每一书目包括ISBN号、书名、出版社、作者、排名,其中一部书可以有多名作者,每名作者有唯一的一个排名;

(2)对每本图书进行编号,包括书号、ISBN号、书名、出版社、破损情况、存放位置和定价,其中每一本书有唯一的编号,相同ISBN号的书集中存放,有相同的存储位置,相同ISBN号的书或因不同印刷批次而定价不同;

(3)读者向图书馆申请借阅资格,办理借书证,以后凭借书证从图书馆借阅图书。办理借书证时需登记身份证号、姓名、性别、出生年月日,并交纳指定金额的押金。如果所借图书定价较高时,读者还须补交押金,还书后可退还所补交的押金;

(4)读者借阅图书前,可以通过ISBN号、书名或作者等单一条件或多条件组合进行查询。根据查询结果,当有图书在库时,读者可直接借阅;当所查书目的所有图书己被他人借走时,读者可进行预约,待他人还书后,由馆员进行电话通知;

(5)读者借书时,由系统生成本次借书的唯一流水号,并登记借书证号、书号、借书日期,其中同时借多本书使用同一流水号,每种书目都有一个允许一次借阅的借书时长,一般为90天,不同书目有不同的借书时长,并且可以进行调整,但调整前所借出的书,仍按原借书时长进行处理;

(6)读者还书时,要登记还书日期,如果超出借书时长,要缴纳相应的罚款;如果所还图书由借书者在持有期间造成破损,也要进行登记并进行相应的罚款处罚。

初步设计的该图书馆管理系统,其关系模式如图4-1所示。


【问题1】

对关系"借还",请回答以下问题:

(1)列举出所有候选键;

(2)根据需求描述,借还关系能否实现对超出借书时长的情况进行正确判定?用60字以内文字简要叙述理由。如果不能,请给出修改后的关系模式(只修改相关关系模式属注时,仍使用原关系名,如需分解关系模式,请在原关系名后加1,2,…等进行区别)。

【问题2】

对关系"图书",请回答以下问题:

(1)写出该关系的函数依赖集;

(2)判定该关系是否属于BCNF,用60字以内文字简要叙述理由。如果不是,请进行修改,使其满足BCNF,如果需要修改其它关系模式,请一并修改,给出修改后的关系模式(只修改相关关系模式属性时,仍使用原关系名,如需分解关系模式,请在原关系名后加1,2,...进行区别)。

【问题3】

对关系"书目",请回答以下问题:

(1)它是否属于第四范式,用60字以内文字叙述理由。

(2)如果不是,将其分解为第四范式,分解后的关系名依次为:书目1,书目2,…。 如果在解决【问题1】、【问题2】时,对该关系的属性进行了修改,请沿用修改后的属性。

参考答案:

【问题1】

(1)候选键:(流水号,书号)

(2)不能。还书时读取书目中的借书时长,可能在借书后该时长发生变化,不满足按原借书时长计算的要求。

在借还关系中增加借书时长属性,借书时根据书目中的借书时长值写入该值。

修改后的"借还"关系:

借还(流水号,借书证号,书号,借书日期,借书时长,还书日期,罚款金额,罚款原因)

【问题2】

(1)FD={书号→(ISBN号、破损情况、定价),ISBN号→(书名、出版社、存放位置)}

(2)该关系不属于BCNF,存在非主属性对码的传递依赖。

修改内容:去掉书名和出版社属性,将存放位置属性移至书目关系。修改后的关系模式:

图书(书号,ISBN号,破损情况,定价)

书目(ISBN号、书名、出版社、作者、排名、存放位置、借书时长)

【问题3】

(1)不属于第四范式。存在嵌入的多值依赖ISBN号→→(作者,排名)

(2)修改后的关系模式:

书目1 (ISBN号,书名,出版社,存放位置,借书时长)

书目2 (ISBN号,作者,排名)

解析:

【问题1】【试题分析】

本题考查的是数据库逻辑结构设计和关系理论的应用,属于比较传统的题目,考查点也与往年类似。

本问题考查对候选码和需求。针对借还关系,根据题干描述,"读者借书时,由系统生成本次借书的唯一流水号,并登记借书证号、书号、借书日期,其中同时借多本书 使用同一流水号",说明流水号不能唯一确定借阅记录,还需要借阅书的参与,而书号可以唯一确定一本书,故借还关系的候选码应由流水号和书号构成。

关系模式的设计应满足应用需求。通过题干中的描述,"不同书目有不同的借书时长,并且可以进行调整,但调整前所借出的书,仍按原借书时长进行处理",借书时长应该是借书时确定的,从书目的属性中读取,作为借书关系的属性,以后借书时长在书目关系中修改,并不影响已发生的借还关系。

【问题2】【试题分析】

本问题考査函数依赖和BCNF。根据描述"每一本书有唯一的编号,相同ISBN号的书集中存放,有相同的存储位置,相同ISBN号的书或因不同印刷批次而定价不同", 得出书号决定定价,破损情况是每本书的具体情况,也决定于书号,而书名、出版社和存放位置应由ISBN号决定,故函数据依赖集为{书号→(ISBN号,破损情况,定价), ISBN号→(书名,出版社,存放位置)}。

根据函数依赖集,图书关系的候选码为书号,存在非主属性书名、出版社和存放位置等对候选码书号的传递依赖,不属于BCNF。书名和出版社属性在书目关系中已有, 无需在图书关系中重复出现,同时存放位置由ISBN号所决定,应移至书目关系中,则剩余属性书号、ISBN号、破损情况和定价构成新的关系模式,属于BCNF。

【问题3】【试题分析】

本问题考查4NF和模式分解。根据题干的描述"一部书可以有多名作者,每名作者有唯一的一个排名",得出多值依赖ISBN号→→(作者,排名),为嵌入式的多值依 赖,因此,书目关系不属于4NF。根据分解算法,将多值依赖独立为一关系模式,从原 关系模式中去掉多值依赖的右部属性即可。

5、阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】 

某高速路不停车收费系统(ETC)的业务描述如下:

(1)车辆驶入高速路入口站点时,将驶入信息(ETC卡号,入口编号,驶入时间) 写入登记表;

(2)车辆驶出高速路出口站点(收费口)时,将驶出信息(ETC卡号,出口编号, 驶出时间)写入登记表;根据入口编号、出口编号及相关收费标准,清算应缴费用,并从绑定的信用卡中扣除费用。 

一张ETC卡号只能绑定一张信用卡号,针对企业用户,一张信用卡号可以绑定多 个ETC卡号。使用表绑定(ETC卡号,信用卡号)来描述绑定关系,从信用卡(信用卡号,余额)表中扣除费用。 

针对上述业务描述,完成下列问题:

 

【问题1】

在不修改登记表的表结构和保留该表历史信息的前提下,当车辆驶入时,如何保 证当前ETC卡已经清算过,而在驶出时又如何保证该卡已驶入而未驶出?请用100 字以内文字简述处理方案。

【问题2】 

当车辆驶出收费口时,从绑定信用卡余额中扣除费用的伪指令如下:读取信用卡余额到变量X,记为x = R(A);扣除费用指令x = x - a;写信用卡余额指令记为W(A, x)。 

(1)当两个绑定到同一信用卡号的车辆同时经过收费口时,可能的指令执行序列为:x1=R(A),x1 =x1-a1, x2 = R(A), x2 = x2-a2, W(A,x1,W(A,x2)。此时会出现什么问题?(100字以内) 

(2)为了解决上述问题,引入独占锁指令XLock(A)对数据A进行加锁,解锁指令Unlock(A)对数据A进行解锁。请补充上述执行序列,使其满足2PL协议。

【问题3】

下面是用E-SQL实现的费用扣除业务程序的一部分,请补全空缺处的代码。

CREATE PROCEDURE 扣除(IN ETC 卡号 VARCHAR(20),IN 费用 FLOAT)

BEGIN

UPDATE 信用卡 SET 余额=余额-费用

FROM信用卡,绑定

WHERE信用卡.信用卡号=绑定.信用卡号 AND  (  a  ) ;

if error then ROLLBACK;

else ( b ) ;

END

参考答案:

【问题1】

在车辆驶入时判定登记表上对应该ECT卡的所有记录,出口编号和驶出时间均不为空,表示该卡已清算过;在车辆驶出时判定该卡存在记录有驶入信息而出口编号和驶出

时间为空。

【问题2】

(1)出现问题:丢失修改,x1的费用扣除后写入的值被x2的覆盖,造成对x1并未扣费。

(2)加锁后的执行序列:XLock(A), x1=R(A), x1=x1-a1, W(A,x1), Unlock(A), XLock(A), x2 = R(A), x2 = x2-a2, W(A,x2), Unlock(A)。

【问题3】

(a) ETC卡号=:ETC卡号

(c)COMMIT

解析:

问题一要求在不修改登记表结构并保留历史信息的前提下,确保车辆驶入时当前ETC卡未清算过,驶出时已驶入且未驶出。通过查询登记表的入口和出口信息,可以确认ETC卡的状态。

问题二解答
(1)

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2014年5月 数据库系统工程师 下午题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share