软件工程课程考试重点知识汇总.docx

上传人:b****6 文档编号:7051956 上传时间:2023-01-16 格式:DOCX 页数:20 大小:308.47KB
下载 相关 举报
软件工程课程考试重点知识汇总.docx_第1页
第1页 / 共20页
软件工程课程考试重点知识汇总.docx_第2页
第2页 / 共20页
软件工程课程考试重点知识汇总.docx_第3页
第3页 / 共20页
软件工程课程考试重点知识汇总.docx_第4页
第4页 / 共20页
软件工程课程考试重点知识汇总.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

软件工程课程考试重点知识汇总.docx

《软件工程课程考试重点知识汇总.docx》由会员分享,可在线阅读,更多相关《软件工程课程考试重点知识汇总.docx(20页珍藏版)》请在冰豆网上搜索。

软件工程课程考试重点知识汇总.docx

软件工程课程考试重点知识汇总

概论

1.软件的定义

软件是计算机系统中与硬件相互依存的一个部分,它是包括程序、数据及其相关文档的完整集合。

其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正常操纵信息的数据结构;文档是与程序开发、维护和使用有关的图文材料。

2.软件工程的定义和三要素

IEEE:

软件工程是开发、运行、维护和修复软件的系统方法。

FritzBauer:

建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。

三个要素:

方法、工具和过程。

方法为软件开发提供了“如何做”的技术。

它包括了多方面的任务,如项目计划与估算、软件系统需求分析、数据结构、系统总体结构的设计、算法过程的设计、编码、测试以及维护等。

工具为软件工程方法提供了自动的或半自动的软件支撑环境。

目前,已经推出了许多软件工具,这些软件工具集成起来,建立起称之为计算机辅助软件工程(CASE)的软件开发支撑系统。

CASE将各种软件工具、开发机器和一个存放开发过程信息的工程数据库组合起来形成一个软件工程环境。

过程则是将软件工程的方法和工具综合起来以达到合理、及时地进行计算机软件开发的目的。

过程定义了方法使用的顺序、要求交付的文档资料、为保证质量和协调变化所需要的管理、及软件开发各个阶段完成的里程碑。

3.软件工程和软件危机的关系

现有软件危机后有软件工程

为了解决软件危机,既要有技术支持措施(方法和工具),又要有必要的组织管理措施。

软件工程正是从管理和技术两方面研究如何更好的开发和维护计算机软件的一门新兴学科。

4.软件生命周期的概念,划分的三个时期和八个阶段

概念:

软件生命周期是软件的产生直到报废的生命周期

三个时期:

软件定义,软件开发,运行维护

8个阶段:

问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃

5.理解结构化软件开发方法和面向对象软件开发方法

结构化开发方法:

早期的程序开发,如C语言,都是用结构化开发方法。

结构化开发又叫做面向过程开发,具体原理是将一个软件分为多个过程(函数)进行开发,用结构体管理数据。

这种开发方式使得代码的可读性变得很低,并且代码难以移植。

面向对象软件开发方法:

这是一种自底向上和自顶向下相结合的方法,而且它以对象建模为基础,从而不仅考虑了输入、输出数据结构,实际上也包含了所有对象的数据结构。

6.软件生命周期模型(又称做过程模型)各自阶段、特点和适用项目

瀑布模型

阶段:

特点:

1),阶段间具有顺序性和依赖性

2),推迟实现的观点

3),质量保证的观点

瀑布模型适用于结构化方法,也就是面向过程的软件开发方法。

规模小、需求明确、无须维护

 

快速原型模型

特点:

快速建立起能够在计算机上运行的程序。

优点:

软件产品的开发基本上是线性的

缺点:

必须迅速地构建原型然后根据用户意见循序的修改原型

适用范围:

用户需求不明确,需要通过构建原型来清楚的了解用户的真实需求。

无须维护

增量模型

特点:

增量模型的特点是引进了增量包的概念,无须等到所有需求都出来,只要某个需求的增量包出来即可进行开发。

虽然某个增量包可能还需要进一步适应客户的需求并且更改,但只要这个增量包足够小,其影响对整个项目来说是可以承受的。

 

增量模型具有较大的灵活性,适合于软件需求不明确、设计方案有一定风险的软件项目

 

螺旋模型

螺旋模型最大的特点在于引入了其他模型不具备的风险分析,使软件在无法排除重大风险时有机会停止,以减小损失。

同时,在每个迭代阶段构建原型是螺旋模型用以减小风险的途径。

螺旋模型更适合大型的昂贵的系统级的软件应用。

 

喷泉模型

喷泉模型适应于面向对象的软件开发过程。

特点:

相互迭代:

软件的某个部分常常被重复工作多次,相关对象在每次迭代中随之加入渐进的软件成分

无间隙性:

它在各项活动之间没有明显边界

 

RUP

四个阶段

先启阶段:

建立业务模型,定义最终产品视图,并且确定项目的范围。

精化阶段:

设计并确定系统的体系结构,制定项目计划,确定资源需求。

构建阶段:

开发出所有构件和应用程序,把它们集成为客户需要的产品,并且详尽地测试所有功能。

移交阶段:

把开发出的产品提交给用户使用。

RUP最重要的它有三大特点:

软件开发是一个迭代过程

软件开发是由UseCase驱动的

软件开发是以架构设计(ArchitecturalDesign)为中心的。

RUP适用于大型软件团队开发大型项目。

敏捷过程

特点:

具备可视、可集成和可运行使用的特点

敏捷过程的适用于:

软件需求经常变化或者需求变化比较大;项目团队与用户之间进行沟通比较容易;项目的开发风险比较高;规模比较小,一般项目组成员在50人之内;项目团队的成员能力比较强,而且具有责任感;项目的可测试性比较好。

可行性研究与需求分析

1.可行性研究和需求分析要解决的问题

确定问题是否值得去解决;目标系统到底要做什么

2.软件需求的含义、分类

软件需求:

系统或系统部件要满足合同、标准、规范或其它正式规定文档所需具有的条件或权能。

分类:

业务需求、用户需求和功能需求,非功能需求。

业务需求反映了组织机构或客户对系统、产品高层次的目标要求,它们在项目视图与范围文档中予以说明。

用户需求文档描述了用户使用产品必须要完成的任务,这在使用实例文档或方案脚本说明中予以说明。

功能需求定义了开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足了业务需求。

所谓特性是指逻辑上相关的功能需求的集合,给用户提供处理能力并满足业务需求。

非功能需求,描述了系统展现给用户的行为和执行的操作等。

它包括产品必须遵从的标准、规范和合约;外部界面的具体细节;性能要求;设计或实现的约束条件及质量属性。

所谓约束是指对开发人员在软件产品设计和构造上的限制。

质量属性是通过多种角度对产品的特点进行描述,从而反映产品功能。

多角度描述产品对用户和开发人员都极为重要。

3.获取用户需求的常用方法

电话,即时通讯工具,电子邮件,面对面交谈,会议讨论,定性定量结合的调查问卷,观察,用户日记分析法,将自己变成目标用户等

4.需求分析的定义

需求分析是在可行性研究的基础上进行的更细致的分析工作,是软件定义时期的最后一个阶段对软件目标及范围的求精和细化。

通过调查研究和分析,充分了解用户对软件系统的要求,把用户要求表达出来,解决“软件系统必须做什么”的问题。

5.主流需求分析方法(结构化分析建立的模型)

1)步骤:

确定系统边界,画出顶层DFD;自顶向下,对每个加工进行内部分解,画出分层DFD;对数据流图进行复审求精。

2)分层优点:

便于实现采用逐步细化的扩展方法,利于控制问题复杂度;一组图代替一张总图,业务人员可选择相关图形。

3)画分层DFD图的指导原则:

注意父子图的平衡;区分局部文件和局部外部项;掌握分解速度;遵守加工编号规则;确定数据定义和加工策略。

6.绘制数据流图(DFD)

按照软件内部数据传递、变换关系,自顶向下逐层分解

软件的功能,建立软件系统的逻辑模型。

数据流图基本元素

DFD实例:

储户到银行取款

数据流图的画法:

自外向内,自顶向下,逐层细化,逐步求精

 

①画顶层数据流图:

包括系统的输入数据流和输出数据流、I/O数据流的源

点和终点、一个处理(代表整个系统)。

顶层DFD表示系统的范围、系统和外界的数据交换关系。

②画分层数据流图:

按功能将一个处理逐步细化成若干处理;最低层数据流

图中的处理称为“原子处理”,表示独立的功能。

l画数据流图的注意事项:

①每个处理至少有一个输入数据流和一个输出数据流。

②数据流图的细化过程中,要保持信息的连续性(信息平衡)

◇当把一个处理分解为一系列处理时,分解前和分解后的输入/输出数据流必须相同。

③图中每个元素都要恰当命名。

④对处理进行合理编号。

数据流图的绘制步骤

 

(1)顶层DFD:

确定整个系统的输入数据流及其源点、输出数据流及其

终点;把整个系统作为一个处理(加工)。

 

(2)一层DFD:

确定系统的主要处理功能,按此将整个系统(顶层DFD中

的处理)分解成若干个处理(加工),确定每个处理的

输入与输出数据流以及与这些处理有关的数据存储。

 

 (3)根据自顶向下,逐层分解的原则,对上层图中全部或部

分处理进行分解。

(4)重复步骤(3),直到逐层分解结束。

工具:

MicrosoftOfficeVisio

总体设计

1.总体设计的概念,任务(DFD映射为MSD)

将软件需求转化为系统结构(程序结构、接口)和数据结构。

通过仔细分析软件需求规格说明,确定组成系统的模块及各模块之间的关系,设计出完成预定功能的

模块结构(软件结构),并建立接口。

2.模块和模块化的含义

模块是由边界元素限定的程序单元,是构成程序的基本构件,是指用一个名字可以调用的一段程序语句。

例如子程序、函数、过程和宏等都可以作为模块。

模块化就是将程序划分成独立命名且可独立访问的若干模块,每个模块完成一个子功能;将模块集成起来构成一个整体,完成指定的系统功能。

3.什么是模块独立性;如何度量和设计模块独立性(几种内聚和耦合的强弱,高内聚低耦合)

模块独立性是指模块内部各部分之间、以及模块之间关系的一种度量标准。

模块独立性的含义为:

软件结构中的每个模块完成一个相对独立的特定子功能,并且和其它模块的接口是简单的。

度量:

模块之间的耦合尽可能弱;每个模块的内聚尽可能强。

内聚:

偶然内聚:

逻辑内聚:

时间内聚:

过程内聚:

通信内聚:

顺序内聚;功能内聚

4.变换分析设计方法和事务设计分析方法

变换:

(1)分析具有变换特征的数据流图,确定输入流和输出流的边界、孤立出变换中心

(2)完成一级分解,设计软件结构的顶层和第二层

l 顶层模块Cm:

代表系统

l 第二层模块:

①输入信息处理模块Ca:

协调对所有输入数据的接收

②变换中心控制模块Ct:

管理对内部形式的数据的所有

操作

③输出信息处理控制模块Ce:

协调输出信息的产生过程

3)完成二级分解:

把数据流图中的每个处理映射成软件结构中一个适当的模块

①在数据流图上,沿变换中心的输入边界开始向外移动,将输入通路中的每个处理映射成Ca模块下的一个直接或间接低层模块。

②在数据流图上,沿变换中心的输出边界开始向外移动,将输出通路中的每个处理映射成Ce模块下的一个直接或间接低层模块。

③将变换中心内的每个处理映射成Ct模块下的一个直接或间接模块。

(4)精化软件结构:

适当分解或合并模块

(5)简要描述每个模块(可以用IPO图描述):

①接口说明②内部逻辑描述③全局和局部数据结构的说明④设计约束和限制

事务:

◆由事务型数据流图映射成的软件结构包括一个接收分支和一个发送分支。

◆映射出接收分支结构的方法和变换分析映射出输入结构的方法很相像,即从事务中心的边界开始,把沿着接收流通路的处理映射成模块。

◆发送分支的结构包含一个调度模块,它控制下层的所有活动模块;然后把数据流图中的每个活动流通路映射成与它的流特征相对应的结构。

详细设计

1.总体设计和详细设计的区别

详细地设计每个模块,即确定完成每个模块功能所需要的算法和数据结构。

1、总体设计的主要任务是把需求分析得到的系统扩展用例图转换为软件结构和数据结构。

总体设计建立的是目标系统的逻辑模型.

2、详细设计是软件工程中软件开发的一个步骤,就是对总体设计的一个细化,就是详细设计每个模块实现算法,所需的局部结构。

在详细设计阶段,主要是通过需求分析的结果,设计出满足用户需求的嵌入式系统产品。

3、总体设计阶段通常得到软件结构图,详细设计阶段常用的描述方式有:

流程图、N-S图、PAD图、伪代码等。

4、详细设计阶段就是为每个模块完成的功能进行具体的描述,要把功能描述转变为精确的、结构化的过程描述。

2.掌握三种基本控制结构:

顺序、选择和循环

顺序结构:

顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。

选择结构:

选择程序结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程。

使用选择结构语句时,要用条件表达式来描述条件。

循环结构:

循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构。

循环结构可以看成是一个条件判断语句和一个向回转向语句的组合。

循环结构的三个要素:

循环变量、循环体和循环终止条件.循环结构在程序框图中是利用判断框来表示,判断框内写上条件,两个出口分别对应着条件成立和条件不成立时所执行的不同指令,其中一个要指向循环体,然后再从循环体回到判断框的入口处

2.结构化详细设计的常见描述工具

(1)图形工具:

程序流程图、N-S图、PAD图

(2)表格工具:

判定表、判定树

(3)语言工具:

过程设计语言(PDL)

4.绘制程序流程图(将盒图、PDL转换为程序流程图)

程序流程图又称为程序框图,它是历史最悠久、使用最广泛的一种描述程序逻辑结构的工具,程序流程图常用符号及基本控制结构来描述。

程序流程图的基本符号

编码及测试

1.白盒测试:

逻辑覆盖

以程序内部逻辑结构为基础,通过对程序逻辑结构遍历实现程序测试的覆盖

从覆盖源程序语句的详尽程度,可以分为语句覆盖、判定覆盖、条件覆盖、条件判定覆盖、条件组合覆盖和路径覆盖

1)语句覆盖:

选择足够多的测试数据,使被测程序中每一可执行语句至少执行一次。

 

执行路径(ace)可满足要求,

取条件:

(A=2)and(B=0)

测试用例:

输入数据(A,B,X)取值(2,0,4)

输出结果(A,B,X)的预期值为(2,0,3)

 

2)判定覆盖:

使每个判定的每种可能结果至少执行一次。

执行路径(ace)和(abd)

可满足要求,取条件:

(A=2)and(B=0)和(A≤1)and(X≤1)

测试用例1:

(A,B,X)的输入值取(2,0,4);预期输出值为(2,0,3)

 测试用例2:

(A,B,X)的输入值取(1,1,1);预期输出值为(1,1,1)

 

3)条件覆盖:

每个判定表达式中每个条件的可能取值至少执行一次。

每个判断条件的可能取值:

第一个判定表达式中条件1:

A≤1和A>1

第一个判定表达式中条件2:

B=0和B≠0

第二个判定表达式中条件1:

A≠2和A=2

第二个判定表达式中条件2:

X>1和X≤1

 测试用例1(取条件A≤1、B=0、A≠2、X>1,通过路径abe):

(A,B,X)的输入值取(1,0,3),预期输出值为(1,0,4)

 

测试用例2(取条件A>1、B≠0、A=2、X≤1,通过路径abe):

(A,B,X)的输入值取(2,1,1),预期输出值为(2,1,2)

4)判定/条件覆盖:

每个判定表达式中每个条件的可能取值至少执行一次;同时每个判定表达式的可能判定结

果至少执行一次。

每个判断条件的可能取值:

第一个判定表达式中条件1:

A≤1和A>1

第一个判定表达式中条件2:

B=0和B≠0

第二个判定表达式中条件1:

A≠2和A=2

第二个判定表达式中条件2:

X>1和X≤1

测试用例1(取条件A>1、B=0、A=2、X>1,通过路径ace):

(A,B,X)的输入值取(2,0,4),预期输出值为(2,0,3)

测试用例2(取条件A≤1、B≠0、A≠2、X≤1,通过路径abd):

(A,B,X)的输入值取(1,1,1),预期输出值为(1,1,1)

 

5)条件组合覆盖:

每个判定表达式中的所有可能的条件取值组合至少执行一次。

条件组合覆盖:

每个判定表达式中的所有可能的条件取值组合至少执行一次。

第一个判定表达式

组合1:

A>1和B=0;组合2:

A>1和B≠0;

组合3:

A≤1和B=0;组合4:

A≤1和B≠0;

第二个判定表达式

组合5:

A=2和X>1;组合6:

A=2和X≤1;

组合7:

A≠2和X>1;组合8:

A≠2和X≤1

 

测试用例1(取组合1和5,执行路径ace):

(A,B,X)的输入值取(2,0,4),预期输出值为(2,0,3)

测试用例2(取组合2和6,执行路径abe):

(A,B,X)的输入值取(2,1,1),预期输出值为(2,1,2)

测试用例3(取组合3和7,执行路径abe):

(A,B,X)的输入值取(1,0,3),预期输出值为(1,0,4)

测试用例4(取组合4和8,执行路径abd):

(A,B,X)的输入值取(1,1,1),预期输出值为(1,1,1)

2.黑盒测试:

边界值划分法

经验表明,程序在处理边界情况时最容易发生错误,从而设计使程序运行在边界情况附近的测试方案、暴露出程序错误的可能性会更大些。

边界值分析法主要用来选择等价类的边界值作为测试用例检查程序边界运行情况,是一种补充等价分类法的测试用例设计技术。

取输入等价类和输出等价类的边界值及边界附近的值做测试用例:

应当选取正好等于、刚刚大于、刚刚小于边界的值作为测试数据。

通常联合使用等价划分和边界值分析两种技术

3.区分黑盒测试和白盒测试

黑盒测试

白盒测试

不涉及程序结构

考察程序逻辑结构

用软件规格说明书生成测试用例

用程序结构信息生成测试用例

可适用于从单元测试到系统验收测试

主要适用于单元测试和集成测试

某些代码段得不到测试

对所有逻辑路径进行测试

 

4.三个测试阶段,每个阶段应采用的测试方法

1.单元测试:

集中对用源代码实现的每一个程序模块进行测试。

◆检查每个单元(模块)控制结构中的特定路径,以确保做到完全覆盖并发现最大数量的错误。

◆检查各个程序模块是否正确地实现了规定的功能。

◆主要发现编码和详细设计的错误。

单元测试方法:

主要使用白盒测试技术、辅助使用黑盒测试技术

2.集成测试:

把模块装配(即集成)在一起形成完整的软件包,在装配的同时进行测试。

◆模块相互间的协调和通信是集成测试过程中的主要问题。

◆集成测试中将发现软件设计中的错误,也可能发现需求说明中的错误。

集成测试常用黑盒测试方法,可能使用一定的白盒测试。

3.确认测试:

验证软件的有效性(功能和性能等)是否与用户的要求一致,即软件是否满足需求规格说明书中的确认标准。

确认测试仅使用黑盒测试方法

5.可靠性和可用性的区别

软件可靠性:

程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。

可靠性随着给定的时间间隔的加大而减少

软件的可用性:

程序在给定的时间点,按照规格说明书的规定成功地运行的概率。

①可靠性意味着在0到t时间间隔内系统没有失效

②可用性意味着在时刻t,系统是正常运行的

面向对象分析(OOA)

1.三种面向对象模型、各自表示的内容和表达工具

对象模型

对象模型描述了现实世界中的“类与对象”以及它们之间的关系,表示了目标系统的静态数据结构。

建立对象模型的信息来源:

需求陈述、应用领域知识及常识

动态模型

在一些系统中,需要了解在所有时间内对象的变化和对象之间关系的变迁,即时序关系。

这就产生了一种与静态结构(对象模型)相对应的、与时间和变化有关的内容,即动态模型。

表达工具和步骤

1、每个功能对应的典型交互行为的脚本

2、根据每个脚本画事件追踪图

3、根据事件追踪图画每个类(对象)的状态图

功能模型

功能模型由一组数据流图或者一组用例图组成

功能模型表明一个计算如何从输入值得到输出值,它不考虑计算的次序。

功能模型由多张数据流图组成。

数据流图用来表示从源对象到目标对象的数据值的流向,它不包含控制信息,控制信息在动态模型中表示,同时数据流图也不表示对象中值的组织,值的组织在对象模型中表示。

系统数据流图是一种表达功能模型的工具

2.绘制类图、用例图(用例之间《include》和《extend》关系)

面向对象设计(OOD)

1.OOA和OOD的联系和区别。

面向对象设计(OOD)就是在面向对象分析模型基础上运用面向对象方法进行系统设计,目标是产生一个符合具体实现条件的设计模型。

OOA和OOD采用一致的概念与原则,但属于软件生命周期的不同阶段,有不同的目标。

OOA目标是建立一个直接映射问题域的OOA模型OOD目标是产生一个可以实现的OOD模型

2.四个子系统都是什么?

各自用什么图表达?

大多数系统的面向对象设计模型,在逻辑上都可以划分为:

问题域子系统:

根据实现条件(编程语言、可复用构件、设备性能、存储方案等),对OOA中建立的对象模型做必要的补充与调整。

用类图表达

人机交互子系统:

根据选用的图形用户界面(GUI)系统和特定用户对人机界面的要求,定义关于人机界面的类与对象及其关系。

用界面类图表达

任务管理子系统:

确定各类任务,并把任务分配给适当的硬件或软件去执行。

用集中式类图表达

数据管理子系统:

根据选定的数据管理系统,设计负责对象存储和检索的系统组成部分。

用数据库表表达

 

面向对象实现

1.面向对象单元测试:

最小的可测试单元

(1)最小的可测试单元:

封装起来的类&对象

(2)不能孤立的测试单个操作,应该把操作作为类的一部分进行测试

2.面向对象测试方法中:

设计类测试方法

测试单个类的方法主要有随机测试、划分测试和基于故障的测试3种。

软件项目管理

1.软件项目管理的任务

通过计划、组织和控制等一系列活动,合理地配置和使用各种资源,以便在预定成本和期限内开发出符合既定需求的软件的过程。

主要职能:

制定计划:

规定待完成的任务、要求、资源、人力和进度等。

建立组织:

为实施计划,保证任务的完成,需要建立分工明确的责任机构。

配备人员:

任用各种层次的技术人员和管理人员。

指导:

鼓励、动员、协调软件人员完成所分配的任务。

2.现代程序员小组结构(包含哪些类人员)

由行政组长,技术组长和程序员组成

3.度量软件规模有哪两种方法,各自的单位是什么?

1.代码行技术:

根据以往开发类似产品的经验和数据,估计实现软件功能所需要的源程序行数。

由多名有经验的软件工程师分别估计程序的最小规模a、最大规模b、最可能的规模m,分别算出这3种规模的平均值。

则程序规模的估计值为:

L=

程序规模单位:

代码行数(LOC)或千行代码数(KL0C)。

2.功能点技术:

根据对软件信息域特性和复杂性的评估结果,计算功能点数,以此度量软件规模。

单位:

功能点(FP)

4.工作量估算单位,估算方法(3个)

1.静态单变量模型:

E=A+B×(ev)C,其中:

E表示工作量;A、B、C是经验常数;ev表示软件规模估算值(代码行数或功能点数)

2.动态多变量模型:

E=[LOC×B0.333/P]3×(1/t)4其中:

t是项目持续时间;B是技术因子(经验常数);

P是生产率参数(经验常数);LOC表示软件规模估算值(代码行数)

◆LOC值固定的情况下,通过延长项目时间、可以降低工作量

3.COCOMO2模型(COnstructiveCOstModel构造性成本模型):

将软件开发工作量表示成代码行数的非线性函数

三个层次的估算模型:

(1)应用系统组成模型:

主要用于

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

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1