最新十四章节关联对象访问AssociativeObjectAccessppt课件.ppt

上传人:豆**** 文档编号:24231276 上传时间:2022-07-04 格式:PPT 页数:54 大小:478KB
返回 下载 相关 举报
最新十四章节关联对象访问AssociativeObjectAccessppt课件.ppt_第1页
第1页 / 共54页
最新十四章节关联对象访问AssociativeObjectAccessppt课件.ppt_第2页
第2页 / 共54页
点击查看更多>>
资源描述

《最新十四章节关联对象访问AssociativeObjectAccessppt课件.ppt》由会员分享,可在线阅读,更多相关《最新十四章节关联对象访问AssociativeObjectAccessppt课件.ppt(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、多态的关联选择操作定义及其实现多态的关联选择操作定义及其实现 关联选择操作需要一个操作对象说明关联选择操作需要一个操作对象说明在在某个对象实例集合上,需要一个条件表达某个对象实例集合上,需要一个条件表达式作为选择的依据式作为选择的依据选择谓词选择谓词 当定义一个多态的选择操作时,选择谓词当定义一个多态的选择操作时,选择谓词将以函数变元的方式作为操作变元将以函数变元的方式作为操作变元 当选择谓词本身需要参数时,该参数必须当选择谓词本身需要参数时,该参数必须在选择操作的参数表中说明在选择操作的参数表中说明 多态的选择操作的共同名字为多态的选择操作的共同名字为Select带参数的选择谓词带参数的选择

2、谓词 该参数是为选择谓词服务的,所以需要在该参数是为选择谓词服务的,所以需要在谓词函数中说明谓词函数中说明 由于在引用时,显然需要由由于在引用时,显然需要由Select来引用,来引用,因此,在因此,在Select的参数表中也要说明,规的参数表中也要说明,规则如下:则如下:poly overload select (t1 bool), t3 - t1 语义:其中类型语义:其中类型t3可以是任何类型,它的可以是任何类型,它的约束条件是约束条件是Select的第三个参数类型的第三个参数类型t3,必,必须与选择谓词所需一个参数类型一致须与选择谓词所需一个参数类型一致Select的重载的重载 Selec

3、t函数不但是多态的,而且是重载的,函数不但是多态的,而且是重载的,它可以根据选择谓词的需要,设定多个参它可以根据选择谓词的需要,设定多个参数数 编译器根据重载规则,从参数的个数,寻编译器根据重载规则,从参数的个数,寻找到正确的实现版本找到正确的实现版本 其约束条件为:在哑、实结合时,其约束条件为:在哑、实结合时,Select的参数个数和各自类型必须与选择谓词的的参数个数和各自类型必须与选择谓词的参数个数、类型完全一致参数个数、类型完全一致示例示例1一个参数的选择谓词一个参数的选择谓词 对对Cuboid定义一个选择谓词定义一个选择谓词bigCuboid,它能选择体积大于某个阈值的立方体对象它能选

4、择体积大于某个阈值的立方体对象 定义定义declare bigCuboid: Cuboid | float - boolcode bigCuboidCode; define bigCuboidCode(threshold) isreturn(self.volume threshold); 引用引用 var myCuboids, myBigCuboids: CuboidSet; myBigCuboids:= myCuboids.select(bigCuboid, 200.0);示例示例2二个参数的选择谓词二个参数的选择谓词 选择体积在一个范围选择体积在一个范围(上限上限high,下限为,下限为l

5、ow)的立方体的立方体declare volumeRange: Cuboid | float, float - bool; define volumeRange(low, high) isreturn (self.volume=low);迭代迭代Iterators 可以在筛选的基础上利用循环进行各种进一步的可以在筛选的基础上利用循环进行各种进一步的操作操作 例如:求符合体积要求的例如:求符合体积要求的Cylinders的体积累加值的体积累加值declare bigCyl: Cylinder | float - boolcode bigCylCode; define bigCylCode(thr

6、eshold)return(self.volume= threshold); var c: Cylinder;myCylinders: CylinderSet;bigCylindersTotalWeight: float:=0.0;foreach (c in myCylinders.select(bigCyl, 20.0)bigCylindersTotalWeight:=bigCylindersTotalWeight + c.weight;说明性查询语言说明性查询语言GOMql 多态选择函数只是一个关联查询实现的基础,对多态选择函数只是一个关联查询实现的基础,对于复杂的嵌套查询及其优化,表达力

7、度不够,需于复杂的嵌套查询及其优化,表达力度不够,需要通过定义相关的查询语言来实现要通过定义相关的查询语言来实现 查询优化有两个方面解决查询优化有两个方面解决 关系代数的优化:编译时进行关系代数的优化:编译时进行 物理查询路径的优化:执行时进行物理查询路径的优化:执行时进行 下面的内容从用户角度出发,如何查询需求正确下面的内容从用户角度出发,如何查询需求正确地用相应的查询语言序列来表达地用相应的查询语言序列来表达 GOMql是基于是基于QUEL的扩展的扩展一个对象实例库一个对象实例库 类型定义类型定义Type Emp is name:string ; working:Dept; salary:

8、int; type Dept is name:string; mgr:Manager; profit:int;Type Manager Supertype Emp is cars:Car; type Car is license:string; make:string; horsepower:int; 路径表达式为查找引用链的引用序列路径表达式为查找引用链的引用序列示例:示例:Emp.worksIn.mgr.cars.make 示例的类型定义中,关联对象的联接,仅示例的类型定义中,关联对象的联接,仅仅采用一个进入点的方式仅采用一个进入点的方式worksIn-mgr-cars-make-Emp

9、Dept Manager Car stringEMPworkInDeptN1DeptmgrManager11ManagercarsCarNMGOMql表达式表达式 单目标查询表达式单目标查询表达式rang r1:s1,rm:smretrieve riwhere p(r1, rm) 多目标查询表达式多目标查询表达式rang r1:s1,rm:smretrieve a1:r1,aj:rjwhere p(r1, rm) Range子句:范围说明子句子句:范围说明子句其中:其中:rj(1jm)为范围变量表达式,它)为范围变量表达式,它用于用于range子句中子句中其中,其中,sj(1jm)必须是下列情

10、况之一)必须是下列情况之一Sj是一个类型扩展是一个类型扩展EXT(用类型名表达用类型名表达)一个集合对象变量一个集合对象变量一个列表对象变量一个列表对象变量一个包含有集合结构的对象变量一个包含有集合结构的对象变量一个包含有表结构的对象变量一个包含有表结构的对象变量一个计算一个集合结构对象的表达式一个计算一个集合结构对象的表达式一个计算一个表结构对象的表达式一个计算一个表结构对象的表达式总之,变量总之,变量rj被约束到一个相应的聚集类型被约束到一个相应的聚集类型sj的元素类型的元素类型 retrieve子句子句 查询说明子句查询说明子句 简单形式:只有一个范围变量简单形式:只有一个范围变量单目标

11、查询单目标查询 复杂形式:通过投影到多个范围变量,构造的复杂形式:通过投影到多个范围变量,构造的多元组多元组多目标查询多目标查询 实现方法:对目标的范围变量与相应的对象分实现方法:对目标的范围变量与相应的对象分别进行捆绑,并进行选择谓词查询别进行捆绑,并进行选择谓词查询 Where子句:选择谓词中,子句:选择谓词中,P的变元的变元(r1rm)(s(s1 1xsxs2 2xsxsm m)(m)(m个联接个联接) )当目标当目标r rj j( (或者多目标或者多目标r1rj) )与某一对象捆与某一对象捆绑,使绑,使P P (r1rj)为真,则该对象被选中为真,则该对象被选中GOMql查询示例查询示

12、例(一一) 简单选择谓词示例简单选择谓词示例查询所有工资超过查询所有工资超过100000的的Empsrange e:Empretrieve ewhere e.salary100000.0查询结果为查询结果为id3,id4,id8,id9,id10 上述查询需要输出姓名,则为:上述查询需要输出姓名,则为:range e:Empretrieve e.namewhere e.salary100000.0name“LeMond”“Hinault”“Boss”GOMql查询示例查询示例(二二) 问题:找出其经理为驾驶问题:找出其经理为驾驶Jaguar汽车的汽车的Emps 该查询的路径表达式为:该查询的路

13、径表达式为:p=Emp.workIn.mgr.cars.make = “Jaguar” 查询表达式为:查询表达式为:range e:Empretrieve ewhere “Jaguar” in e.worksIn.mgr.cars.make 系统检测范围变量系统检测范围变量e的每个捆绑的对象,通的每个捆绑的对象,通过路径可以达到的串值是否为给定的过路径可以达到的串值是否为给定的“Jaguar”,若是,则该对象被选中,若是,则该对象被选中 该选择查询代价巨大,它需要进行如下多该选择查询代价巨大,它需要进行如下多个联接:个联接:Emp x Dept x Manager x Car 选择结果为选择结

14、果为id1,id2,id8 更复杂的查询更复杂的查询(一一) 例例3:找出选择的经理:他的部门亏损,但仍支付:找出选择的经理:他的部门亏损,但仍支付给至少一个雇员工资超过二十万元给至少一个雇员工资超过二十万元range e:Emp,m:Managerretrieve mwhere m=e.workIn.mgr ande.salary200000.0 ande.workIn.profit0.0 这里,这里,m=e.worksIn.mgr称为功能联接称为功能联接( (对象的对象的“相等相等”操作子隐含地表示为操作子隐含地表示为“标识标识”) ) 例例3的优化处理的优化处理 如果在如果在Dept类型

15、中增加一个关联属性类型中增加一个关联属性Emp,则例,则例3可以表示为:可以表示为:range d:Dept,m:Managerretrieve mwhere m=d.mgr and d.profit200000.0更复杂的查询更复杂的查询(二二) 例例4:查找这样的经理:他驾驶过贵重的汽车,:查找这样的经理:他驾驶过贵重的汽车,而他管理的部门获利很低而他管理的部门获利很低range d:Dept,m:Manager,c:Carretrieve mwhere m=d.mgr and d.profit150 or c.make=“Jaguar”)量词的使用(一)量词的使用(一) (一一)全称量词

16、表达式全称量词表达式for all rj in sj p语义为:若集合语义为:若集合sj中所有成员中所有成员rj均满足选择谓词均满足选择谓词p(rj),则表达式为真,否则为假则表达式为真,否则为假示例:查询其经理只开宝马车的雇员示例:查询其经理只开宝马车的雇员range e: Emps,c: Charretrieve ewhere forall c in e.worksIn.mgr.cars(c.make=”BMW”)量词的使用(二)量词的使用(二) (二二)存在量词表达式存在量词表达式 EXIST rj IN sj P(rj)语义为:若在集合语义为:若在集合S中至少有一个成员中至少有一个成员

17、rj满足满足P(rj) ,则表达式为真则表达式为真,否则为假否则为假示例:查询其经理所用额轿车中有一辆为美洲虎的示例:查询其经理所用额轿车中有一辆为美洲虎的雇员雇员range e: Emps,c: Carretrieve ewhere exists c in e.worksIn.mgr.cars(c.make=”Jaguar”)嵌套查询嵌套查询 在任何一个集合可以出现的地方,都可以在任何一个集合可以出现的地方,都可以使用使用range-retrive-where表达式,因此,表达式,因此,Gomql允许表达式嵌套允许表达式嵌套 表达式嵌套可以发生在三个子句的任何一表达式嵌套可以发生在三个子句的

18、任何一个中,因为三个子句本身均要求一个集合个中,因为三个子句本身均要求一个集合表达式表达式 示例:查询那些只驾驶美洲虎牌或宝马牌,示例:查询那些只驾驶美洲虎牌或宝马牌,或马力或马力200的汽车经理的汽车经理range m: Manager , c: Carretrieve mwhere forall c in m.cars(c in (range v: Carretrieve vwhere v.horsePower200 or v.make=”Jaguar” or v.make=”BMW”)查询表达式中聚集函数和查询表达式中聚集函数和类型操作的使用类型操作的使用 关系查询语言关系查询语言QUE

19、L仅提供少量的聚集函数如仅提供少量的聚集函数如count,sum,min,max,avg等等 Gomql允许类型操作作为函数使用。其约束条件允许类型操作作为函数使用。其约束条件为:类型操作不会改变对象的状态,且应当返回为:类型操作不会改变对象的状态,且应当返回一个值一个值 函数的范围:在函数的范围:在where子句和子句和retrieve子句中都可子句中都可以使用以使用 由于类型操作含有子类型的继承,因此,在执行由于类型操作含有子类型的继承,因此,在执行时,每个对象实例仍然需要动态捆绑相应精化的时,每个对象实例仍然需要动态捆绑相应精化的操作操作示例示例 示例示例1:查许体积大于:查许体积大于1

20、50.0的圆柱体的圆柱体range c: Cylinderretrieve cwhere c.volume150.0 示例示例2:查询所有金子做的几何体的总重量:查询所有金子做的几何体的总重量range g: GeometricPrimitiveretrieve sum(g.weight)where g.mat.name=”Gold”基于基于SQL的对象查询语言的对象查询语言GOMsql GOMsql是是O2SQL的一个子集,它是针对的一个子集,它是针对Gom的的ODL设设计的查询语言计的查询语言 GOMsql的目标是向用户以供基于的目标是向用户以供基于SQL的声明和面向集合的声明和面向集合的

21、查询接口的查询接口 面向对象的基于面向对象的基于SQL的查询语言强调的是对象类型,而对的查询语言强调的是对象类型,而对象关系的象关系的SQL扩展(扩展(SQL-99)强调的仍然是关系,即)强调的仍然是关系,即如何通过关系模型的扩展将对象和类引入如何通过关系模型的扩展将对象和类引入 其他的面向对象的查询语言其他的面向对象的查询语言-OQL。它是针对。它是针对ODL设计的设计的查询语言,而查询语言,而ODL是是IDL(接口描述语言)接口描述语言)-CORBA的一的一个组件的扩展。个组件的扩展。*CORBA是分布式面向对象的计算的一种标准是分布式面向对象的计算的一种标准示例数据库边界标识的几何示例数

22、据库边界标识的几何体数据库体数据库type BRep with extension isbodyname: string; weight: float; faces: FaceSet;end type BRep;type FaceSet is bodyFaceend type FaceSet;type EdgeSet isbodyEdgeend type EdgeSet;查找引用链查找引用链type Face is bodysurface: float; edegs: EdgeSet;end type Face;type VertexSet is body Vertexend type Ver

23、texSet;type Edge is body length: float; vertices: VertexSet;end type Edge;type Vertex is bodyx,y,z: float;end type Vertex;GOMsql的基本查询结构的基本查询结构 GOMsql的基本结构为:的基本结构为:select-from-where-记记为为SFW表达式表达式 示例示例 selectb.weightfrombinBRepwhere b.name = “cubo#5” 在在Select子句中,可以引入类型操作函数子句中,可以引入类型操作函数 在在from子句中,给出了一

24、个显式定义的范围变量子句中,给出了一个显式定义的范围变量b,b属于属于BRep类型的对象实例集类型的对象实例集 在在where子句中,子句中,b的名字要等于的名字要等于cubo#5与与GOMsql等价的等价的SQL查询表达式查询表达式(1)selectweightfrom BRepwherename = “cubo#5”(2)selectb.weightfrom BRepasbwhereb.name = “cubo#5” 范围变量在范围变量在SQL中被称为别名(中被称为别名(aliases) 方式(方式(1)没有显式的范围变量)没有显式的范围变量 方式(方式(2)通过别名,定义了一个显式的范围

25、变量)通过别名,定义了一个显式的范围变量bGOMsql与与SQL的主要区别的主要区别 SQL:From子句中范围变量必须约束到一个已存子句中范围变量必须约束到一个已存在的,旦已被命名的元组赋值的对象集合上,即在的,旦已被命名的元组赋值的对象集合上,即捆绑到一个关系或一个已建立的捆绑到一个关系或一个已建立的 视图上视图上 结论:结论:SQL的的From子句中不允许嵌套子句中不允许嵌套SFW的结构的结构 GOMsql:From子句中的范围变量可以定义在任子句中的范围变量可以定义在任何的对象集合上。即无论是持久的命名集合,还何的对象集合上。即无论是持久的命名集合,还是一个临时建立的对象集合,即允许捆

26、绑到另一是一个临时建立的对象集合,即允许捆绑到另一个个SFW表达式上。表达式上。 结论:结论:GOMsql的的From子句支持子句支持SFW结构的嵌套结构的嵌套 范围变量在范围变量在From子句中必须显式说明子句中必须显式说明范围变量的形式化定义范围变量的形式化定义 GOMsql中,范围变量被捆绑到中,范围变量被捆绑到From子句子句中的对象集合上中的对象集合上 形式化描述为:形式化描述为: :fromin, in :=()|嵌套查询表达式嵌套查询表达式 示例:查找重量大于示例:查找重量大于1000的几何体中表面积大于的几何体中表面积大于10的表面集合。的表面集合。 方法:先查找重量大于方法:

27、先查找重量大于1000的几何体,再从中挑的几何体,再从中挑出表面积大于出表面积大于10的子集的子集 Select fForm f in(select b.facesfrom b in Brepwhere b.weight1000)where f.surface10 这里,外层范围变量这里,外层范围变量f被限定在内部的被限定在内部的SFW表表达式所返回的达式所返回的Face对象集合上。对象集合上。 需要注意的约束条件是:保证范围变量必须有需要注意的约束条件是:保证范围变量必须有一个唯一的类型,这个类型可以在编译时推导一个唯一的类型,这个类型可以在编译时推导出来出来 一个嵌套查询表达了查询的路径表

28、达式是一个嵌套查询表达了查询的路径表达式是faces 更广泛地,一个范围变量不仅被限定在通过路更广泛地,一个范围变量不仅被限定在通过路径表达式检索的对象集合上,而且可以捆绑在径表达式检索的对象集合上,而且可以捆绑在任何一个集合上。任何一个集合上。BrepFace示例示例2 查询重量在查询重量在1001000之间的几何体之间的几何体 笨办法:先找出重量大于笨办法:先找出重量大于100的几何体,再从的几何体,再从中挑出小于中挑出小于1000的来的来 select b2.nameform b2 in(select b1from b1 in Brepwhere b1.weight100)where b

29、2.weight1000 优化的结果优化的结果 select b.nameform b in Brepwhere b.weight100范围变量可以限定到范围变量可以限定到实例集合的属性域上实例集合的属性域上示例:查询立方体示例:查询立方体cubo#5的的8个顶点坐标。个顶点坐标。select v.x, v.y, v.zfrom v in( select e.vertices from e in( select f.edges from f in( select b.faces from b in BRep where b.name=cubo#5 ) ) ) 从最内层的从最内层的SFW开始(开

30、始(7-9句):句):b被限定在被限定在BRep的类型扩展上的类型扩展上 谓词谓词b.name=Cubo#5将将b限定到满足谓词的限定到满足谓词的BRep的一个子集上,返回每个几何体的的一个子集上,返回每个几何体的6个面个面f1-f6。 56行的行的SFW接受由内层返回的接受由内层返回的6个面,并计个面,并计算它们的边的并集:算它们的边的并集: 产生产生12个不同的个不同的edge对象对象 语句语句34产生产生24个点的并集为个点的并集为8个不同的个不同的点点 语句语句12产生产生8个点个点x.y.z值值,61.f ffedgesf嵌套查询和路径表达式嵌套查询和路径表达式 如下抽象的类型模式如

31、下抽象的类型模式 type T0 is type Tn-1 istype Tn is body body body ; ; A1: T1; An: Tn; ; ; end type Tn end type T0end type Tn-1 即元组类型即元组类型Ti通过它的属性通过它的属性Ai1产生对类型产生对类型Ti的引用的引用 一个嵌套查询的一个嵌套查询的SFW表达式表达式 假如从引用链的始端假如从引用链的始端T0开始,到开始,到Tn终止,查询终止,查询一个原子类型一个原子类型SomeAttr的值,那么它的查询的值,那么它的查询如下:如下: select an.someAttrfrom an

32、in( select an-1.Anfrom an-1 in( select a1.A2 from a1 in( select s.A1 from s in someSet ) ) 利用路径表达式,其查询可以缩短为:利用路径表达式,其查询可以缩短为: select an.someAttrfrom an in someSet.A1.A2.An嵌套查询的数学表示嵌套查询的数学表示 数学上的表示:结果集合可以表示为并数学上的表示:结果集合可以表示为并集集Un,其中,其中Ui被递归定义成:被递归定义成:11.1:iiUain)ifor(1 Aia0)if(i someSetiu不同的不同的Join类型

33、类型 不同类型的联系不同类型的联系 基于值的基于值的Join:关系查询传统的:关系查询传统的Join操作操作 标识标识Join 函数函数Join基于值的基于值的Join 传统的连接操作,通过给定的传统的连接操作,通过给定的Join属性的值的比属性的值的比较来联系对象较来联系对象 示例:查询两个示例:查询两个BRep对象,它们之间,第二个对象,它们之间,第二个变量为第一个的两倍变量为第一个的两倍 select b1.name,b2.name from b1 in BRep, b2 in BRep where b1.weight * 2.0 = b2.weight+ 对象对象b1,b2之间通过变量

34、值来关联之间通过变量值来关联标识标识Join-同一同一Jion 标识标识Join-基于对象的相等,而不是值相等,基于对象的相等,而不是值相等,因此,是基于因此,是基于OID值相等的连接值相等的连接 示例示例. 谓词谓词O1O2-表示表示O1与与O2OID相等而不是相等而不是O1与与O2的状态相等的状态相等 谓词谓词O-当且仅当当且仅当O是是Object集合中集合中的一个对象实例时为真,而不是说的一个对象实例时为真,而不是说Object中有中有一个对象状态与一个对象状态与O的状态相等的状态相等标识标识Join示例示例 父,母,子三个对象类型及其实例库父,母,子三个对象类型及其实例库 type M

35、an with extention is name: string;.;hasKids:Child; type WOMan with extention is name: string;.;hasKids:Child; type Child with extention is name: string;.;father:Man;mother:Woman; 查询同一个父亲的两个孩子查询同一个父亲的两个孩子C1,C2 select c1.name,c2.name form c1 in child;c2 in child where c1.father=c2.father and c1!=c2 这里

36、这里c1.fatherc2.father是标识相等,是标识相等,而不是值相等而不是值相等 如果是这样的谓词如果是这样的谓词Where c1.father.name=c2.father.name and c1!=c2 -值相值相等查询等查询 查询一个孩子的父母亲查询一个孩子的父母亲 select m.name,w.name,c.name from m in Man,w in Woman,c in Child where c in m.hasKids and c in w.hasKids 利用重载操作,测试对于利用重载操作,测试对于woman集合和集合和man集合,是否包含有同一个孩子的偶对。集合

37、,是否包含有同一个孩子的偶对。 也可以通过孩子类型的引用点来完成上述查询也可以通过孩子类型的引用点来完成上述查询 select m.name,w.name,c.name from m in Man,w in Woman,c in Child where c.father=m and c.mother=w 函数联接函数联接 利用引用链建立两个对象集合间的联接利用引用链建立两个对象集合间的联接 当引用路径表达式中如果有集合属性,当引用路径表达式中如果有集合属性,则需要连接则需要连接 示例示例select b.name,f.name from b in BRep, f in b.faces wher

38、e f.surface 20 范围变量范围变量b与与BRep类型对象集合捆绑,类型对象集合捆绑,而而b.faces寻找通过寻找通过faces属性与属性与b相关联相关联的的Face类集合类集合总结总结-面向对象的查询与关系查询面向对象的查询与关系查询的区别的区别(1)查询对象集查询对象集 关系的元组关系的元组 对象集,包括了继承的子对象集对象集,包括了继承的子对象集(2)谓词表达:面向对象的查询在谓词里允许类型谓词表达:面向对象的查询在谓词里允许类型属性的引用链组成的路径表达式。属性的引用链组成的路径表达式。(3)谓词表达式允许对象的操作作为表达式的一个谓词表达式允许对象的操作作为表达式的一个因子因子(4)范围变量允许由中间结果产生的集合来说明,范围变量允许由中间结果产生的集合来说明,即在即在From子句中允许嵌套子句中允许嵌套SFW表达式表达式(5)标识标识Join(6)函数函数Join54 结束语结束语

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁