软件工程学概述sml.ppt

上传人:牧羊曲112 文档编号:6610846 上传时间:2023-11-17 格式:PPT 页数:117 大小:2.94MB
返回 下载 相关 举报
软件工程学概述sml.ppt_第1页
第1页 / 共117页
软件工程学概述sml.ppt_第2页
第2页 / 共117页
软件工程学概述sml.ppt_第3页
第3页 / 共117页
软件工程学概述sml.ppt_第4页
第4页 / 共117页
软件工程学概述sml.ppt_第5页
第5页 / 共117页
点击查看更多>>
资源描述

《软件工程学概述sml.ppt》由会员分享,可在线阅读,更多相关《软件工程学概述sml.ppt(117页珍藏版)》请在三一办公上搜索。

1、软件工程,任课教师:施美玲联系方式,第一章 绪论,软件工程Software Engineering,水利工程,建筑工程,机械工程,软件工程,本章将对软件的地位和作用、软件的特点、软件 的发展、软件的危机以及软件工程学科的形成、软件 生存期等方面的问题和基本概念做详细介绍。,传统工程,新兴工程,气象工程,生物工程,本章内容,思考?,什么是软件?在软件开发过程中遇到哪些问题?如何解决这些问题?,第1章绪论,什么是软件?有何特点?何谓软件危机?如何解决?软件工程是一门什么学科?什么是软件的生存期?有哪些软件开发模型?,因为软件危机,所以要通过软件工程的方法加以解决。,一、软件及其发展,软件角色演化软

2、件的组成软件的特点软件的发展,软件角色演化,早期软件往往作为计算机硬件的附加件奉送。软件的角色在跨越60余年的时间内已经经历了很大的变化:硬件性能的极大提高;计算机体系结构的深远变化;内存和硬盘容量的快速增加;奇特的输入输出的多种选择;这些,促进了更为高级和更为复杂的基于计算机的系统。,软件角色演化,硬件芯片的集成度按摩尔定律翻番,并朝着通用化和标准化的方向发展,以便大规模批量生产。软件朝着专业化和多样化的方向发展,以满足不同的需要。20世纪80年代以来,以微软为首的一批新兴软件企业,开辟了全新的独立软件产业,并逐渐取代了硬件产业。,软件角色演化,今天的信息产业,软件占有绝对主导地位。今天,软

3、件担任着双重角色。它是一个产品,同时又是产品交付使用的载体。它表达了由计算机硬件或更广地说可通过局部硬件访问的计算机网络所体现的计算潜能。,1.软件的组成,software=programsoftware developing=programming/coding,1983年IEEE为软件下的定义是:计算机程序、方法、规则和相关的文档资料以及在计算机上运行所必需的数据。,20世纪50年代:software=program20世纪60年代:software=program+documents20世纪70年代:software=program+documents+data,1.软件的组成,soft

4、ware=program+documents+datasoftware developing programming/coding,目前对软件比较公认的解释是:软件是程序,支持程序运行的数据以及与程序有关的文档的完整集合。,程序按事先设计的功能和性能要求执行的指令序列文档与程序开发,维护和使用有关的图文材料数据使程序能正常操纵信息的数据结构,KeyPoint:关于软件是什么的错误认识.。,程序 用程序设计语言描述的,适合于计算机处理的语句序列,文档,分类 开发文档 用户文档 管理文档,作用 记录 通信和交流 管理和维护,2.软件的特点,(1)软件是逻辑的,而不是物理的产品。逻辑往往实际只存在于

5、人的头脑当中,软件的开发过程极难加以控制。定义“需要做什么”成为软件开发的根本问题,这些可视化建模技术仍然无法给出准确的、完整的描述和度量。(模型vs现实),(2)软件是由开发或工程化而形成的,没有明显的制造过程。软件成本集中于“开发”上,意味着软件项目不能像硬件制造项目那样来管理。(硬成本),(3)软件在运行和使用期间,不存在硬件那样的磨损和老化问题,但它存在退化问题,开发人员必须维护软件。(改动困难),软件可长期使用,人们总是认为软件是容易修改的,但忽视了修改所带来的副作用,不断的修改最终导致软件的退化,软件退化问题,图a是硬件故障率的变化曲线,即硬件在生命初期具有较高的故障率,这些故障主

6、要是由于设计或制造的缺陷造成的。当这些缺陷修正后,故障率在一段时期内会降低到一个稳定的曲线上。随着时间的推移,硬件构件由于种种原因受到不同程度的损害,故障率又升高了。也就是说,硬件已经开始磨损了。图b是软件的故障率曲线,在软件的生命初期隐藏的错误会使程序具有较高的故障率,理想的情况下当这些错误改正后曲线便趋于平稳,但实际情况是随着这些修改有可能引入新的错误,从而使故障率曲线呈现图中所示的锯齿状。于是,软件的退化由于修改而发生了,(4)大多数软件是自定的,而不是通过已有构件组装而成的。迄今为止,软件的开发尚未完全摆脱手工的方式。,(5)软件成本相当昂贵。IBM360操作系统的研制人员最多时可达1

7、000多人,从1963年到1966年共花了4年时间才完成,总计耗费了5000多人/年,以后又进行了不断的修改和补充。该系统的整个研制费用为5亿美元,其中近一半花在软件上。,(6)软件本身是复杂的。软件比任何其他人类制造的结构更复杂,甚至硬件的复杂性和软件相比也是微不足道的。软件本质上的复杂性是软件产品难以理解,影响软件过程的管理,并使维护过程十分复杂。,2.软件的特点,软件的本质特征,软件的本质特征,软件的本质特征,软件的本质特征,软件的本质特征,软件的本质特征,早期阶段程序设计阶段在计算机发展的早期阶段,人们认为计算机的主要用途是快速计算,软件编程简单,不存在什么系统化的方法,开发没有任何管

8、理,程序的质量完全依赖于程序员个人的技巧。编程是在一种无序的、崇尚个人技巧的状态中完成的。当时的软件特点:1)规模小、无规范与标准;2)编程作为一门技艺,程序员的素质决定软件质量;3)缺少有效方法与软件工具的支持;4)不重视软件开发的管理;5)软件的维护工作很难进行。,3.软件的发展,2.第二阶段-程序系统阶段,从60年代中期到70年代末期多用户系统引入了人机交互的新概念,实时系统能够从多个源收集、分析和转换数据,从而使得进程的控制和输出的产生是以毫秒而不是分钟来进行,产生了第一代数据库管理系统出现了软件产品和“软件作坊”的概念,设计人员开发程序不再像早期阶段那样只为自己的研究工作需要,而是为

9、了用户更好地使用计算机。被开发的软件可以在较宽的范围内使用。主机、微机上的程序可以有数百上千的用户。出现了“软件危机”问题。在开发大型软件时,遇到了许多困难:1)有些系统彻底失败;2)有些系统比原计划推迟了好几年;3)有些系统的费用大大超过了预算;4)有些系统未能圆满符合用户的当初期望;5)有些系统无法进行维护。采用“软件工程”的方法来解决“软件危机”问题。,3.软件的发展,3.第三阶段软件工程阶段,1970年代中期-1980年代末期分布式系统极大地提高了计算机系统的复杂性,网络的发展对软件开发提出了更高的要求,特别是微处理器的出现和广泛应用,孕育了一系列的智能产品。软件开发技术的度量问题受到

10、重视,最著名的有软件工作量估计COCOMO模型、软件过程改进模型CMM等。,3.软件的发展,4.第四阶段,强大的桌面系统和计算机网络迅速发展的时期计算机体系结构由中央主机控制方式变为客户机/服务器方式专家系统和人工智能软件进入了实际应用,出现了并行计算和网络计算的研究,面向对象技术在许多领域迅速取代了传统软件开发方法软件从个性化的程序变为工程化的产品,从“软件程序”发展为“软件程序数据文档”。软件的需求成为软件发展的动力,软件工作的考虑范围不再只顾及程序的编写,而是涉及到软件的整个生命周期。,3.软件的发展,二、软件危机,含义 表现 原因 克服危机的途径,(1)软件危机含义,Software

11、Crisis所谓软件危机,就是指在软件开发和软件维护过程中所存在的一系列严重问题。现代计算机应用系统中,软件的地位日益重要和突出。开发:如何满足日益增长的软件需求。维护:如何维护应用中的大量已有软件。已经成为了计算机应用系统进一步发展的瓶颈。,(2)软件危机的表现,软件开发没有真正的计划性,对软件开发进度和软件开发成本的估计常常很不准确,计划的制定带有很大的盲目因素。对于软件需求信息的获取常常不充分,软件产品往往不能真正地满足用户的实际需求。缺乏良好的软件质量评测手段,从而导致软件产品的质量常常得不到保证。,(2)软件危机的表现,对于软件的可理解性、可维护性认识不够;软件的可复用性、可维护性不

12、如人意。软件开发过程没有实现“规范化”,缺乏必要的文档资料或者文档资料不合格、不准确,难以进行专业维护。软件开发的人力成本持续上升。缺乏自动化的软件开发技术,软件开发的生产率依然低下,远远满足不了急剧增长的软件需求。,软件危机的例子,IBM 360操作系统开发时间:1963-1966年投入人力:5000人/年代码量:近100万行新版本:从上一版本中找出1000个错误修订而成结果:软件质量非常糟糕,软件几乎无法维护负责人总结:“正像一只逃亡的野兽落到泥潭中做垂死的挣扎,越是挣扎,陷的越深,最后无法逃脱灭顶的灾难,程序设计工作就像这样一个泥潭,一批批程序员被泊在泥潭中拼命挣扎,谁也没有料到问题竟会

13、陷入这样的困境”。,软件危机的例子,为什么?为什么需要那么长时间才能结束开发?为什么成本如此之高?为什么我们不能在把软件交给客户之前就发现所有的错误?为什么在软件开发过程中我们难以度量其进展?大型系统的软件生产已经成了管理人员担惊受怕的项目。于是,20世纪60年代后期,人们惊呼发生了软件危机(Software crisis)。软件危机主要包含两方面问题:1)如何开发软件以满足对软件日益增长的需求;2)如何维护数量不断增长的已有软件。,(3)原因,产生软件危机的原因可以归纳为主、客观两个方面。从客观上来看,软件不同于硬件,它的生产过程和产品都具有明显的“不可视”特征,这就导致在完成编码并且上机运

14、行之前,对于软件开发过程的进展情况较难衡量,软件产品的质量也较难进行先期评价,因此,对于开发软件的过程进行管理和控制比较困难。,(3)原因,产生软件危机的原因可以归纳为主、客观两个方面。从主观上分析,导致软件危机发生的另一大原因,可以归于在计算机系统发展的早期,软件开发的“个体化”特点,主要表现为忽视软件需求分析的重要性、忽视软件的可理解性、文档不完备、轻视软件的可维护性、过分强调编码技巧等等方面。,(4)克服危机的途径,基于软件危机产生的主、客观原因,应从软件工程技术和软件工程管理两方面来采取措施,防范软件危机的发生。从管理层面上考虑,应当注意推广和使用在实践中总结出来的开发软件的成功的技术

15、和方法,并且探索更好的、更有效的技术和方法,注意积累软件开发过程中的经验数据财富,逐步消除在计算机系统早期发展阶段形成的一些错误概念和做法。,(4)克服危机的途径,从技术角度考虑,应当开发和使用更好的软件开发工具,提高软件开发效率和开发工作过程的规范化程度目前广为使用的统一建模语言(UML)、各种配置管理工具、缺陷管理工具和自动测试工具都在软件工程活动中发挥了很好的作用。计算机辅助软件工程(CASE)更是目前备受重视的一个旨在实现软件开发自动化的新的领域。,三.软件工程,研究“大型”软件开发和维护的技术、方法、工具、环境和管理的工程学科。,(1)工程,工程是对技术(或社会)实体的分析、设计、建

16、造、验证和管理。,工程的含义,工程的特征,工程的特征,(2)软件工程,提出1968年,Fritz Bauer正式提出SE概念定义软件工程是指导计算机软件开发和维护的工程学科。它采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明是正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。,软件工程三要素,方法为软件开发提供“如何做”的技术。包括多方面的任务,如项目计划与估算、软件系统需求分析、数据结构、系统总体结构的设计、算法的设计、编码、测试以及维护等。常采用某种特殊的语言或图形的表达方法及一套质量保证标准工具(如,Rational R

17、ose)为软件工程方法提供了自动的或半自动的软件支撑环境。过程将软件工程的方法和工具综合起来以达到合理、及时地进行计算机软件开发的目的。回答:“何时做”。过程定义了方法使用的顺序、要求交付的文档资料、为保证质量和协调变化所需要的管理、及软件开发各阶段完成的里程碑(基线),软件工程的目标,成功地建造一个大型软件系统,具体地讲:付出较低的开发成本达到要求的软件功能取得较好的软件性能开发的软件易于移植需要较低的维护费用能按时交付用户使用开发的软件可靠性高,软件工程目标之间的关系,互斥关系,互补关系,软件工程关注的焦点问题,理解软件质量,理解软件质量,软件工程的基本原理,用分阶段的生命周期计划严格管理

18、 六类重要计划:项目概要、里程碑、项目控制、产品控制、验证、运行维护坚持进行阶段评审(必须遵循的重要原则)实行严格的产品控制(基线配置管理)采用现代程序设计技术结果应能清楚地审查开发小组的人员应少而精承认不断改进软件工程实践的必要性 是确保软件产品质量和开发效率的重要因素,软件工程的内容,软件开发的技术主要研究:开发方法、开发过程、开发工具和开发环境其中,方法、工具、过程是软件工程的三要素软件开发的管理主要研究:软件管理学、软件经济学、软件心理学软件过程管理技术主要研究:软件过程的优化技术,变更管理。,软件工程面临的问题,降低软件的费用人力资源远远不能适应迅速增长的软件社会需求提高软件的可靠性

19、指软件系统能否在既定的环境条件下运行并实现所期望的结果提高软件的可维护性维护费用占整个软件系统费用的2/3提高软件的生产率提高软件的重用性,软件工程方法学,通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称为范型。传统方法面向对象的方法,传统方法(生命周期方法),结构化方法学(结构化范型)采用结构化技术(结构化分析、结构化设计、结构化程序设计)完成软件的开发。它是一种面向数据流的开发方法。该方法采用自顶向下、逐步求精的指导思想,应用较广,技术成熟。结构化分析是根据分解与抽象的原则,按照系统中数据处理的流程,用数据流图来建立系统的功能模型,从而完成需求分析工作。结构化设计是根

20、据模块独立性准则、软件结构准则将数据流图转换为软件的体系结构,用软件结构图来建立系统的物理模型,实现系统的概要设计。结构程序设计是根据结构程序设计原理,将每个模块的功能用相应的标准控制结构表示出来,从面实现详细设计。结构化方法不适应规模大的项目,对于特别复杂的项目,该方法难于解决软件重用问题,难于适应需求变化的问题,难于彻底解决维护问题。,面向对象的方法,面向对象的开发方法完全不同于传统开发方法,它是90年代的主流开发方法。面向对象开发方法包括面向对象分析、面向对象设计、面向对象实现。面向对象开发方法有Booch方法、Coad方法和OMT方法等。为了统一各种面向对象方法的术语、概念和模型,97

21、年推出了统一建模语言,即UML(Unified Modeling Language)语言。它是面向对象的标准建模语言,通过统一的语义和符号表示,使各种方法的建模过程和表示统一起来,将成为面向对象建模的工业标准。,开发方法比较,结构化范型生命周期的各个阶段中使用的概念及应完成的任务性质显著不同。分析阶段:任务:回答做什么?概念:功能设计阶段:任务:回答怎么做?把软件分成模块。概念:模块详细设计:任务:设计实现每个模块的数据结构和算法。概念:算法和数据结构。,开发方法比较,面向对象范型利用现实世界的概念思考问题,从而自然地解决问题。面向对象分析。提取应用领域有意义的对象。面向对象软件的模块就是对象

22、。实际上在面向对象分析阶段就开始做设计了。面向对象设计。基本任务是扩充和完善面向对象分析所建立的对象模型,把它转化为解空间的对象模型。面向对象范型软件开发各个阶段使用的概念和表示方法一致。,四、软件的生命周期(Software Life Cycle),软件产品从形成概念开始,经过开发、使用和维护,直到最后退役的全过程。,软件生存期的3个时期、6个阶段,维护,软件生存期,软件有一个孕育、诞生、成长、成熟、衰亡的生存过程。这个过程即为计算机软件的生存期。软件生存期的六个步骤,即制定计划、需求分析、设计、程序编码、测试及运行维护,软件生存期,软件的生存期,软件生存期,(1)制订计划 确定要开发软件系

23、统的总目标 给出功能、性能、可靠性以及接口等方面的要求 完成该软件任务的可行性研究 估计可利用的资源(硬件,软件,人力等)、成本、效益、开发进度 制定出完成开发任务的实施计划,连同可行性研究报告,提交管理部门审查,软件生存期,(2)需求分析和定义对用户提出的要求进行分析并给出详细的定义编写软件需求说明书或系统功能说明书及初步的系统用户手册提交管理机构评审,软件生存期,(3)软件设计概要设计 把各项需求转换成软件的体系结构。结构中每一组成部分都是意义明确的模块,每个模块都和某些需求相对应详细设计 对每个模块要完成的工作进行具体的描述,为源程序编写打下基础编写设计说明书,提交评审。,软件生存期,(

24、4)程序编写 把软件设计转换成计算机可以接受的程序代码,即写成以某一种特定程序设计语言表示的“源程序清单”写出的程序应当是结构良好、清晰易读的,且与设计相一致的,软件生存期,(5)测试阶段 单元测试,查找各模块在功能和结构上存在的问题并加以纠正 组装测试,将已测试过的模块按一定顺序组装起来 按规定的各项需求,逐项进行有效性测试,决定已开发的软件是否合格,能否交付用户使用,软件生存期,(6)运行/维护 改正性维护 运行中发现了软件中的错误需要修正 适应性维护 为了适应变化了的软件工作环境,需做适当变更 完善性维护 为了增强软件的功能需做变更,软件生存期,分析与设计的比较,分析能很好地将系统需求映

25、射到软件设计师所关注的领域形式关注的是确保系统的功能性需求可以忽略许多非功能性需求,以及实现环境的约束最终展示的是一幅近乎理想的系统画面,设计使分析的结果能适应非功能性需求、实现环境、性能需求等产生的约束是分析的精化关注的是确保完全覆盖需求,以及系统设计的优化如果设计非常精确,代码就可以完全依赖于设计,五、软件开发的目标,六、软件开发模型,常用的开发模型编码修正模型瀑布模型快速原型模型增量模型螺旋模型喷泉模型,六、软件开发模型,1.编码修正模型(code and fix model),软件开发只有两个阶段编写程序代码修改程序代码 作坊式生产方式 缺点低估分析和设计,代码结构差,难修改不重视需求

26、,开发风险大,用户不满意难修改、难维护,1.编码修正模型(code and fix model),在这个模型中,开发人员拿到项目立即根据需求编写程序,调试通过后生成软件的第一个版本。在提供给用户使用后,如果程序出现错误,或者用户提出新的要求,开发人员重新修改代码,直到用户满意为止。这是一种类似作坊的开发方式,对编写几百行的小程序来说还不错,但这种方法对任何规模的开发来说都是不能令人满意的,其主要问题在于:(1)缺少规划和设计环节,软件的结构随着不断的修改越来越糟,导致无法继续修改;(2)忽略需求环节,给软件开发带来很大的风险;(3)没有考虑测试和程序的可维护性,也没有任何文档,软件的维护十分困

27、难,2.瀑布模型(Waterfall Model),1970,W.Royce提出 软件生存周期模型,流水式过程模型 生命周期方法学 阶段划分方法 控制复杂性,Definition,Feasibility Study,Requirements Analysis,System Design,Program Design,Coding&Module Testing,Integration&System Testing,Delivery&Maintenance,System Lifecycle,Waterfall Model,传统的瀑布模型,瀑布模型的特点,基本思想:“分而治之”特点相邻阶段依赖性推迟

28、实现的观点质量保证的观点(文档与评审)优点 迫使开发人员采用规范的方法严格规定了每阶段必须提交的文档要求各阶段的产品必须经过质量验证缺点 需求难开始就完全确定 文档驱动,风险大 开发期长,一旦修改,则损失惨重不支持软件复用和集成技术,传统的瀑布模型,带“反馈环”的瀑布模型,瀑布模型的特点,适用范围 结构化方法,面向过程的软件开发方法 需求变化少 开发人员熟悉领域 低风险项目 使用环境稳定,3.原型模型(Prototyping Model),针对:软件开发初期需求难以确定 工程上经常使用的“原型”快速原型法(Rapid Prototyping)基本思想:快速建立原型,完善用户需求 快速建立起来的

29、可以在计算机上运行的程序,他所能完成的功能往往是最终产品能完成的功能的一个子集。,原型模型,Prototyping Model,需求的采集和细化,快速设计,建造原型,客户评价原型,针对原型完善需求,生产样品,开始,停止,快速开发原型的途径,模拟软件系统的人机界面和人机交互方式 开发工作原型,实现软件系统的部分功能 找来正在运行的类似软件,原型模型的特点,特点线性开发模型(不带“反馈环”)减少开发活动的盲目性和需求不确定开发的系统能满足需求,修改较小优点处理模糊需求 用户参与 快速 缺点 快速(弱功能)资源规划和管理较为困难 对开发环境要求高,适用范围已有产品(原型)简单而熟悉的领域有快速原型开

30、发工具进行产品移植或升级,软件开发的风险,产品交付给用户之后用户可能不满意到了预定的交付日期软件可能还未开发出来实际的开发成本可能超过预算产品完成前一些关键的开发人员可能“跳槽”了产品投入市场之前竞争对手发布了一个功能相近、价格更低的软件,4.螺旋模型(Spiral Model),1988,TRW公司BARRY W.Boehm提出 风险分析,Waterfall Model,Prototyping Model,Risk Analysis,Spiral Model,螺旋模型的特点,针对:前面的模型没有提供“驾驭软件风险”功能 基本思想:降低风险制定计划 planning 定目标,选方案,明确开发限

31、制条件风险分析 risk analysis分析所选方案,识别风险,通过原型消除风险实施工程 engineering,construction and release开发实施软件开发(利用快速原型构造方法)客户评估 customer evaluation评价开发工作,提出修正建议,PART ONE The Process,螺旋模型,风险分析,Prototype 1,模拟、建模、基线,需求计划与生命周期计划,操作概念,Prototype 2,风险分析,软件需求,需求确认,开发计划,风险分析,Prototype 3,软件产品设计,设计验证与确认,集成与测试计划,风险分析,可运行的原型,详细设计,单元

32、测试,编码,集成测试,验收测试,实现,计划下一阶段,开发、验证下一级产品,确定目标,选定方案,设定约束条件,评估方案,识别并排除风险,累计费用,各步骤的进度,Not yet widely used.,螺旋模型的特点,优点风险驱动质量保证利于维护 缺点 风险驱动 对开发人员要求高要求用户参与阶段评价,对用户来说比较困难,不易取得好的效果,适用范围庞大、复杂、高风险的系统内部开发的大规模软件项目,5 增量模型(Incremental Model),基本思想:遵循递增方式来进行软件开发 优点 任务或功能模块驱动,可以分阶段提交产品 缺点 条件比较苛刻,PART ONE The Process,Inc

33、remental Model,Core product,More features and functionality,Makes a better use of resources.,增量模型的特点,适用范围在整个项目开发过程中,需求都可能发生变化,客户接受分阶段交付分析设计人员对应用领域不熟悉,难以一步到位中等或高风险项目用户可参与到整个软件开发过程中使用面向对象语言或第四代语言软件公司自己有较好的类库、构件库,6 喷泉模型(Fountain Model),基本思想在软件的分析、设计、实现等阶段之间或者一个阶段内的工作步骤之间是重叠的,可以并行工作。特点 迭代、演进 无缝(在分析、设计、实现之间没有明显的边界)适用于面向对象的开发方法,支持复用技术。,典型模型特征比较,小 结,软件及其发展 软件危机 软件工程 软件的生存期 软件过程模型,思考题,什么是软件?它具有哪些区别于硬件的特点?试详细说明“软件生存周期”的概念。什么是软件危机?产生原因和主要表现是什么?如何解决?有人说:软件开发时,一个错误发现得越晚,为改正它所付出的代价就越大。对否?请说明理由。怎样的软件是一个好的软件?软件开发的主要目标?各软件开发模型的特点及优缺点?,软件工程发展历史,软件工程的发展历史,软件工程的发展历史,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号