第七章GIS软件工程的实施与维护ppt课件.ppt

上传人:牧羊曲112 文档编号:1355360 上传时间:2022-11-13 格式:PPT 页数:61 大小:312.50KB
返回 下载 相关 举报
第七章GIS软件工程的实施与维护ppt课件.ppt_第1页
第1页 / 共61页
第七章GIS软件工程的实施与维护ppt课件.ppt_第2页
第2页 / 共61页
第七章GIS软件工程的实施与维护ppt课件.ppt_第3页
第3页 / 共61页
第七章GIS软件工程的实施与维护ppt课件.ppt_第4页
第4页 / 共61页
第七章GIS软件工程的实施与维护ppt课件.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《第七章GIS软件工程的实施与维护ppt课件.ppt》由会员分享,可在线阅读,更多相关《第七章GIS软件工程的实施与维护ppt课件.ppt(61页珍藏版)》请在三一办公上搜索。

1、第七章 GIS软件工程的实施与测试,第一节 概述第二节 程序编制第三节 软件测试第四节 测试用例的设计第五节 软件调试第六节 软件试运行,第一节 概述,GIS软件实施指系统设计报告通过审核后,把系统设计转换为可实际运行的物理系统的工作,主要包括系统实施准备、程序编制等主要内容。一 实施阶段的准备工作1 硬件准备2 软件准备3 开发人员准备4 数据准备,二 硬软件引进 硬软件引进工作的实施步骤为:配置方案制订购置(或开发)安装调试试运行。 硬软件引进工作实施中应注意的问题: (1)GIS基础软件对硬件和操作系统都有一定的要求,选购时要考虑这一因素; (2)不提倡自己开发GIS基础软件,最好在选用

2、国内外先进软件的基础上进行二次开发 (3)较大的GIS应有中心机房 (4)网络规模应与系统规模匹配,设备效果好 (5)安装、调试、试运行中的问题应及时解决,三 软件工程对编程的技术要求1 有关编码的基本原则 (1)简明清楚 (2)避免及少用全局变量,不要使用过多的程序嵌套结构 (3)编程时先达到正确性,然后考虑执行速度 (4)充分的注释、合适的编程语言 (5)不同的编程语言具有共性,2 编程与软件开发方法 编程语言的选择依赖于开发的方法,如果要用快速原型模型来开发,要求能快速实现原型的构建,宜采用第四代编程语言(4GL);如果是面向对象方法,宜用面向对象的语言编程,如C+,Java等。3 编码

3、与软件环境 良好的编程环境不但能有效提高生产率,同时能减少错误,有效提高软件质量。目前很多可视化的软件开发环境,如VB、VC等。,第二节 程序编制,一 程序编制的基本要求 好程序的基本要求是:能够正常工作、调试代价低、易于维护、易于修改、设计不复杂、效率高等。 GIS软件还具有以下要求 1 尽量使用GIS基础软件的编程资源 GIS开发有两种方式,其一是直接编程,其二是利用GIS基础平台提供的资源库进行开发。 2 注意系统配置要求 GIS涉及大量数据,对硬件要求高,在编程中应采用效率高的连接方式,提高系统效率。,3 良好的程序设计风格4 程序容错性强 GIS系统运行过程中可能面临许多不规范甚至非

4、法操作,忽视程序容错性,容易导致系统瘫痪。5 采用版本控制管理程序编码 版本控制是指将系统转化为若干个具有一定顺序的部分(版本),首先实现系统的轮廓和框架,在此基础上不断添加新的功能,最后达到系统物理模型所要求的全部功能。 是一种自顶向下的开发方法,将系统功能划分到多个相对独立版本之中,为系统程序的开发组织、质量控制和测试等减小了难度。,二 程序语言的特征及选择1 编程语言的特征(1)心理特征 编程语言的心理特征是指影响程序员心理的语言性能,这类特征是作为程序设计的结果而出现的,表现形式如下 1)歧义性 如XX1/X2*X3 2)简洁性 3)局部性和顺序性 4)传统性,(2)工程特征 1)可移

5、植性 2)开发工具的可利用性 3)软件的可重用性 4)可维护性(3)技术特征 将软件设计转化为程序代码时,转化的质量往往受语言性能的影响,可能会影响到设计方法。 编程语言的技术特征对软件的测试与维护也有一定的影响,支持结构化构造的语言有利于减少程序的复杂性,使程序易测试、易维护。,2 编程语言的选择 选择编程语言可以从以下几个方面考虑 (1)科学工程计算,需要大量的标准库函数,可选择Fortran、C语言等; (2)数据处理与数据库应用,可选用的语言有Cobol、SQL、4GL等; (3)实时处理,要求有较高的性能,可选用的语言有汇编语言、Ada等; (4)系统软件,可选用汇编语言、C等; (

6、5)人工智能,如要完成知识库系统、专家系统、决策支持系统等任务,可选用的语言有Lisp、Prolog等。,三 程序设计风格 程序设计风格是指一个人编制程序时所表现出来的特点、习惯以及逻辑思路等。 与编程风格有关的因素有以下几个方面1 源程序文档化(1)标识符按意取名 如row_of_screen(2)程序应加注释 序言性注释,包括说明每个模块的用途、功能、接口以及数据描述和开发历史等; 功能性注释,嵌入在源程序内部,用来说明程序段或语句的功能以及数据的状态。,2 数据说明 基本原则 (1)说明顺序应规范,使数据的属性易于查找,如按照常量说明、类型说明、局部变量说明等。 (2)一个语句说明多个变

7、量时,各变量名按字典序排列。 (3)复杂的数据结构要加注释说明实现时的特点。3 语句构造 基本原则为简单直接,避免复杂的判定条件,避免多重的循环嵌套,不要一行写多个语句。,4 输入和输出 编写输入和输出程序时的原则 (1)输入操作步骤和输入格式尽量简单 (2)应检查输入数据的合法性、有效性,报告必要的输入状态信息及错误信息 (3)输入一批数据时使用数据或文件结束标志 (4)交互式输入时,提供可用的选择和边界值 (5)在程序设计语言有严格的格式要求时,应保持输入格式的一致性 (6)输出数据表格化、图形化,5 效率 效率是指处理机时间和存储空间的使用,对效率的要求: (1)效率是一个性能要求,目标

8、在需求分析阶段给出; (2)追求效率但不损害程序的可读性和可靠性; (3)根本途径在于选择良好的设计方法和良好的数据结构与算法,而不是对程序语句进行调整。,第三节 软件测试,软件测试是指用人工或自动的方法执行和评价各个模块的过程。其目的在于验证模块是否满足规定的要求。 软件测试在软件生存期中横跨两个阶段: 单元测试:通常在编写出每一个模块之后对其所做的测试,编码与单元测试属于软件生存期中的同一个阶段; 独立测试:在结束编码和单元测试后对软件系统进行的综合测试,是软件生存期的一个独立阶段,即测试阶段。,一 软件测试的要求1 软件测试的目的 从用户角度出发,希望通过软件测试暴露软件中的错误和缺陷,

9、以考虑是否可以接受该产品; 从软件开发者角度出发,希望测试成为表明软件产品中不存在错误的过程,验证软件已正确实现了用户的要求。 软件测试阶段的基本任务是根据软件开发各阶段的文档资料和程序的内部结构,利用一些测试用例,找出软件中潜在的错误和缺陷。,2 软件测试的原则(1)尽早和不断进行软件测试(2)测试用例应包括数据输入与输出两个部分(3)程序员应避免检查自己的程序(4)设计用例应包括合理的和不合理的输入条件(5)充分注意测试中的群集现象(6)严格执行测试计划,排除测试的随意性(7)应当对每一个测试结果做全面检查(8)妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便,二 软件测

10、试的过程1 软件测试过程中的信息,测试,结果分析,可靠性分析,排错,软件配置,测试配置,测试工具,预期结果,测试结果,出错率数据,错误,改正的软件,预测的可靠性,测试信息流,测试过程需要三类输入 (1)软件配置:包括软件需求规格说明书、软件设计规格说明、源代码等 (2)测试配置:包括测试计划、测试用例、测试驱动程序等 (3)测试工具:如测试数据自动生成程序、静态分析程序、动态分析程序、测试结果分析程序等 测试之后,要对所有测试结果进行分析,即将实测的结果与预期的结果进行比较。如果发现数据出错,需要排错,同时修改相关文档,再次测试,直到通过测试。,2 软件测试的步骤及与各阶段的关系,单元测试,单

11、元测试,单元测试,集成测试,确认测试,系统测试,模块,模块,模块,设计信息,软件需求,其他系统元素,已集成软件,确认软件,可交付软件,软件测试的步骤,需求分析,编码,详细设计,总体设计,单元测试,集成测试,确认测试,修改,修改,修改,修改,通过,通过,通过,软件设计与软件开发过程的关系,三 单元测试1 测试的内容 单元测试主要针对模块的5个基本特征进行。(1)模块接口 主要检查数据能否正确地通过模块。检查的主要内容是参数的个数、属性及对应关系是否一致。(2)局部数据结构 主要检查:说明不正确或不一致,初始化或缺省值错误,变量名错误,数据类型错误等。此外,还应注意全局数据与模块的相互影响。,(3

12、)重要的执行路径 重要模块要进行基本路径测试,仔细选择测试路径是单元测试的一项基本任务。(4)错误处理 主要测试程序对错误处理的能力,检查是否存在以下问题:不能正确处理外部输入或内部处理错误,对发生的错误不能正确描述或描述内容难以理解等。(5)边界条件 程序最容易在边界上出错,如选择条件和循环条件的边界,复杂数据结构的边界等应进行测试。,2 测试方法 由于被测试的模块往往不是独立的程序,它处于整个软件结构的某一层上,被其他模块调用或调用其他模块,其本身不能单独运行,因此在单元测试时,需要为被测试模块设计驱动模块和桩模块。 驱动模块的作用是用来模拟被测模块的上级调用模块,功能比真正的上级模块简单

13、,它只完成接受测试数据,以上级模块调用被测模块的格式驱动被测模块,接受被测试模块的测试结果并输出。 桩模块用来代替被测试模块所调用的模块,其作用是返回被测试模块所需的信息。,驱动模块和桩模块带来额外的开销,但是与被测试模块有联系的那些模块尚未编写好或未测试情况下,设计驱动模块和桩模块是必要的。,M,A,D,B,C,E,测试用例,驱动模块,测试结果,B,桩模块1,桩模块2,(模拟M),软件结构图 模块B的测试环境,四 集成测试1 集成测试的目的 集成测试是指在单元测试的基础上,将所有模块按照设计要求组装成一个完整的系统而进行的测试,也称为组装测试或联合测试。 集成测试的原因: (1)单元测试使用

14、的驱动模块和桩模块,与他们所代替的模块并不完全等效; (2)各个模块组装起来,穿越模块接口的数据可能会丢失; (3)一个模块的功能可能会对另一个模块的功能产生不利影响;,(4)各个模块的功能组合起来可能达不到预期要求的功能; (5)单个模块可以接受的误差,组装起来可能累积和放大到不能接受的程度; (6)全局数据可能出现问题。 必需进行集成测试,用于发现模块组装中可能出现的问题,最终构成符合要求的软件系统。 集成测试的重点在于检查模块之间接口的有关问题,发现公共数据与全局变量引起的模块间干扰相互作用。,2 集成测试的方法 主要有非渐增式和渐增式测试两种方法。(1)非渐增式测试 该测试是首先对每个

15、模块分别进行单元测试,然后再把所有的模块按设计要求组装在一起进行。(2)渐进式测试 该测试是逐个把未经测试的模块组装到已经测试过的模块上去,进行集成测试。每加入一个新模块就进行一次集成测试,重复此过程直到程序组装完成。,二者的区别 非渐增式方法把单元测试和集成测试分成两个不同的阶段,而渐增式测试把单元测试与集成测试合在一起,同时完成。 非渐增式需要更大的工作量,因为每个模块都需要驱动模块合桩模块,而渐增式利用已测试过的模块作为驱动模块或桩模块。 渐增式可以较早发现接口之间的错误,非渐增式最后组装时才发现。,渐增式有利于排错,因为发生错误的往往与最近加入的模块有关,而非渐增式发现接口错误要推迟到

16、最后,很难判断是那一部分接口出错。 渐增式比较彻底,已测试的模块和新的模块组装在一起再测试。 渐增式占用的时间较多,但非渐增式需要更多的驱动模块和模块,也占用一定时间。 非渐增式开始可并行测试所有模块,能充分利用人力,对测试大型软件很有意义。 一般情况下采用渐增式测试较好,也可以采用两种方法结合起来。,3 渐增式测试的组装模块的方法(1)自顶向下结合 该方法不需要编写驱动模块,只需要编写桩模块。其步骤是从顶层模块开始,沿被测试程序的软件结构图的控制路径逐步向下测试,从而把各个模块都结合起来,有两种组合策略。 深度优先策略: 先从软件结构中选择一条主控路径,把该路径上的模块一个一个结合起来进行测

17、试,以便完成一个特定的子功能,接着再结合其他需要优先考虑的路径进行。主控路径一般选择系统的关键路径或输入、输出路径。,M,A,D,B,C,E,M,S,S,S,M,A,S,S,S,S,M,A,D,S,S,S,M,A,D,S,S,E,上图是一个自顶向下以深度优先策略组装模块的例子,其中S模块表示桩模块。 宽度优先策略: 逐层结合直接下属的所有模块,例如对于上图中的例子,结合顺序为M、A、B、C、D、E。,M,A,D,B,S,E,M,A,D,B,C,E,自顶向下测试的优点 能较早发现高层模块接口、控制等方面的问题,初期的概貌可以较早看到程序的主功能,增强开发信心。 缺点 桩模块不可能提供完整的信息,

18、因此许多测试推迟到用实际模块代替桩木块之后; 设计较多的桩模块,测试开销大; 早期不能并行工作,不能充分利用人力。,(2)自底向上结合 仅需编写驱动模块,不需编写桩模块,步骤为 (i)把低层模块组合成实现一个个特定子功能的族(如下图所示); (ii)为每一个族编写一个驱动模块,以协调测试用例的输入和测试结果的输出(如下图所示,其中d1模块为驱动模块);,族,(iii)对模块族进行测试; (iv)按软件结构图依次向上扩展,用实际模块替换驱动模块,形成一个个更大的族; (v)重复(2)至(4),直到软件系统全部测试完毕。,优点: 随着上移,驱动模块逐步减少,测试开销小一些;比较容易设计测试用例,早

19、期可以并行工作;低层模块的错误能较早发现。 缺点: 系统整体功能最后才能看到;上层模块错误发现的晚,而该问题是全局性问题,影响范围大。 由于自顶向下渐增式测试和自底向上渐增式测试方法各有利弊,因此实际应用中应根据软件的特点、任务的进度安排选择合适方法。一般是将这两种方法结合起来。,五 确认测试 确认测试又称为有效性测试,主要任务是检查软件的功能与性能是否与需求说明书中确定的指标相符合,是否达到系统设计的全部要求。需求说明是确认测试的基础,测试的对象是系统整体。 此阶段包括进行测试和软件配置审查两个方面。1 进行确认测试 确认测试一般是在模拟环境下运用黑盒测试方法,由专门测试人员和用户参加的测试

20、。 确认测试要制定测试计划,确定测试的项目,说明测试内容,描述具体的测试用例。 测试结束后要写出测试分析报告。,测试的内容包括 (1)功能测试,检查是否能实现设计要求的全部功能,哪些功能不能实现; (2)性能测试,检查和评估系统执行响应的时间、处理速度、方便灵活程度及可靠性等; (3)安全性测试,检查系统容错功能、恢复功能、并发控制、安全保密等是否符合要求。 经过确认,可能有两种情况 其一,功能、性能与需求说明一致,说明该系统可以接受; 其二,功能、性能与需求说明有差距,要提交一份问题报告。,2 软件配置审查 软件配置审查的任务是检查软件的所有文档资料的完整性和正确性。如果发现错误和遗漏,应改

21、正和补充,同时要编好目录,为以后的软件维护工作奠定基础。 软件经过确认后,最终还要与系统中的其他部分,如计算机硬件、外部设备等结合在一起,在实际使用环境下运行,测试其能够协调工作,即系统测试。,六 软件测试的方法 可以分为静态测试方法和动态测试方法。1 静态测试方法 静态测试方法是指被测试程序不在计算机上运行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测,具体分为两种方法。 (1)人工测试,是指靠人工审查程序的办法。 人工审查程序偏重于程序质量的检验,而软件审查除了审查程序质量外还要对各阶段的软件产品进行检验。人工检验可以发现计算机不易发现的错误。,(2)计算机辅助静态分析 指利用

22、静态分析工具对被测试程序进行特征分析,从程序中提取一些信息,以便检查程序逻辑的各种缺陷和可疑的程序构造,如用错的局部变量和全局变量、不匹配参数、不恰当的循环嵌套等。2 动态测试方法 动态测试是指通过运行程序发现错误,一般意义上的测试大多是指动态测试。(1)黑盒测试法 该方法把测试对象看成一个黑盒子,不需要考虑程序的内部结构和处理过程,只在软件的接口处进行测试,检查是否满足功能需求。,通过黑盒测试主要发现的错误有 是否有不正确或遗漏的功能;接口处是否能正确输入和输出数据;访问外部信息是否有错;性能上是否满足要求等。(2)白盒测试法 将测试对象看作打开的盒子,在了解程序内部结构和处理过程的基础上,

23、对程序中尽可能多的逻辑路径进行测试。 白盒测试法存在的缺点: 一般不可能进行穷举测试,往往不能遍历所有路径;即使每条路径都测试了,程序仍可能有错。,第四节 测试用例的设计,一 测试用例的设计原则 (1)测试用例应由输入数据和预期的输出数据两个部分组成,便于对照检查; (2)不仅选用合理的输入数据,还要选用不合理的输入数据,能更多地发现错误,提高程序的可靠性; (3)长期保留测试用例,必须作为文档保存,因为修改后的程序可能有新的错误,需要进行多次反复的测试。,二 黑盒测试方法用例的设计1 等价类划分 等价类划分方法将输入数据按照合理或不合理划分为若干个等价类,测试每个等价类的代表值就等于对该类其

24、他值的测试。(1)划分等价类 可以采用下列的经验方法 1)如果输入条件规定了取值范围,则可以确定一个合理的等价类和两个不合理等价类。 例如,学生成绩,范围0100,则合理等价类为0成绩100,不合理等价类为成绩100。,2)如果规定了输入数据的一组值,且程序对不同输入值做不同的处理,则每个允许的输入值是一个合理等价类,此外还有一个不合理等价类。 例如,教师职称为助教、讲师、副教授、教授,则分别取这4个值作为合理等价类,其他的任何职称称为不合理等价类。 3)如果规定了输入数据的规则,则符合规则的称为合理等价类,不符合的为不合理等价类。 4)如果划分的等价类中各元素处理方式不同,需要进一步划分为更

25、小的等价类。 输出数据也可以按这种方法处理。,(2)确定测试用例 根据已划分的等价类,按以下步骤设计用例 1)为每一个等价类编号 2)设计一个测试用例,使其尽可能多覆盖尚未被覆盖过的合理等价类,重复该步骤,直到所有合理等价类被测试用例覆盖 3)设计一个测试用例,使其只覆盖一个不合理等价类,重复该步骤,直到所有不合理等价类被覆盖。,2 边界值分析 边界情况指输入等价类和输出等价类边界上的情况,检查边界情况的测试用例比较高效。 在使用边界值分析方法设计测试用例时,一般与等价类划分结合起来。 (1)如果输入条件规定了值的范围,可选择正好等于边界值的数据作为合理的测试用例,同时选择刚好越过边界值的数据

26、作为不合理的测试用例。 (2)如果输入条件指出了输入数据的个数,则按照最大个数、最小个数、最大个数加1、最小个数减1等分别设计测试用例。,(3)对每个输出条件分别按照以上两个原则确定输出值的边界情况。 (4)如果程序的需求说明给出的输出或输入域是个有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。3 错误推测 根据经验或直觉推测程序中可能存在的各种错误,编写测试用例,即为错误推测。 错误推测一般凭经验进行,其基本思想是列出程序中可能发生错误的情况,根据这些情况选择测试用例。,如对于一个排序程序,列出需特别测试情况(1)输入表为空(2)输入表只含有一个元素(3)输入表中所有元素均相同

27、(4)输入表中已排好序4 因果图 等价类划分和边界值分析方法分别考虑各个输入数据的测试功能,没有考虑其组合情况。因果图能有效检测输入条件的各种组合可能会引起的错误。基本原理是通过画因果图,把功能说明转换为判定表,为判定表的每一列设计一个测试用例。,第五节 软件调试,一 调试目的 软件测试的目的是尽可能多发现程序中的错误,而调试则是在进行了成功测试之后进行的。 调试的目的是确定错误的原因和位置,并改正错误,因此调试也称为纠错。 与测试相比教,调试技术缺乏系统的理论研究,多以经验为主。,二 调试的步骤 测试活动由两个部分组成:其一是确定程序中可疑错误的确切性质和位置;其二是对程序进行修改,排除错误

28、。 调试的执行步骤如下 (1)从错误的外部表现形式入手,确定程序中出错位置 (2)研究有关部分的程序,找出错误的原因 (3)修改设计和代码以排除这个错误 (4)重复进行暴露这个错误的原始测试或某些有关测试,并进行以下确认:,是否排除了该错误 是否引进了新的错误 (5)如果所做的修正无效,则撤销这次改动,回复程序修改之前的状态。 重复上述过程,直到找到有效的解决办法为止。 调试之所以困难,除了有技术方面的原因外,也与人的心理因素有关,调试过程中出现的困难和挫折极易影响调试人员的心理,同时,程序员很多认为自己编制的程序不会出现问题,不会积极配合查错,也增加了调试难度。,三 调试的原则1 确定错误的

29、性质和位置的原则(1)用头脑分析与错误征兆有关的信息(2)避开死胡同(3)只把调试工具当作辅助手段来使用(4)避免用试探法,最多只能做最后手段2 修改错误的原则(1)出错的地方可能还有其他的错误(2)修改了一个错误往往只是修改了其表象(3)修改一个错误时避免引入另外的错误(4)修改错误可能会回到程序设计阶段,四 调试的方法1 简单的调试方法(1)强行排错 通过内存全部打印来排错 在程序特定部位设置打印语句(2)运行部分程序 使被测试程序只执行需要检查的程序段,以提高效率。(3)借助于调试工具,2 归纳法调试 基本思想:从测试结果发现的线索入手,分析他们之间的联系,导出错误原因的假设,然后再证明

30、或否定这个假设。 基本步骤 (1)收集数据,列出测试运行结果,找出正确的和错误的运行结果; (2)组织数据,用3W1H表形式组织数据,Yes NoWhatWhenWhereHow,其中,What列出一般现象,Where说明发现现象的地点,When列出现象发生时所有已知情况,How说明现象的范围和量级;Yes描述出现错误现象的情况,No描述没有错现错误现象的情况。 (3)提出假设,分析线索之间的关系,利用观察到的矛盾现象,设计关于出错原因的假设;如果不能提出假设,需要进一步收集数据和组织数据。 (4)证明假设,把假设与原始线索或数据进行比较,如果能够完全解释一切现象,则假设得到证明,否则就认为假

31、设不合理。,3 演绎法调试 测试人员首先根据已有的测试用例,设想及枚举出所有可能出错的原因作为假设;然后再用原始测试数据或新的测试,从中逐个排除不可能正确的假设;最后,再用测试数据验证余下的假设的确是出错的原因。主要步骤如下图所示。,第六节 软件试运行,1 软件试运行 GIS软件试运行由系统开发人员和用户共同进行,在试运行中进行正确性完善和适应性完善。 最终用户结合实际业务工作进行试用,在试用过程中发现问题,此阶段的测试称为测试。 软件开发人员应为用户调试好系统实际运行环境,提供用户手册和测试记录表,为用户进行演示和培训。 试运行的时间应根据系统的规模和复杂程度确定,一般为13个月。,2 系统正确性完善 正确性完善是指系统在运行过程中出现错误,需要进行的完善。3 应用系统适应性完善 是指由于系统运行环境改变需要进行的完善。4 用户使用 经过试运行和完善的GIS即可交付使用。,本章小结 1 GIS软件工程实施阶段的准备工作,硬件和软件的引进,软件工程对编程的技术和质量要求 2 程序编制的一般要求,编程语言的特征,程序设计风格 3 软件测试及其要求、过程,单元测试,集成测试,确认测试,测试方法 4 测试用例的设计原则,黑盒测试用例设计 5 软件调试的目的、步骤、原则和方法 6 软件试运行,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号