分享
 
 
 

为 DB2 数据库设计对象模型

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

简介

在这篇文章中,我想要演示如何使用 Borland® Delphi TM 8 for the Microsoft® .NET Framework(缩写为“Delphi 8 for .NET”)的 Architect 版本,特别是 Borland Enterprise Core Object(ECO TM)部分中的功能,来设计一个持久存储在 IBM® DB2® Universal Database TM(UDB)SAMPLE 数据库中的对象模型(Object Model)。

从 ECO 着手

Enterprise Core Object 功能只能在 Delphi 8 for .NET 的 Architect 版本中获得。

执行 File | New - Other,并从 Object Repository 的 Delphi for .NET Projects页中选择 ECO Windows Forms Application图标(见图 1)。

图 1. Delphi 8 for .NET Object Repository

这将显示一个对话框,您可以在其中指定新的 ECO 项目的名称和位置(见图 2)。

图 2. 新建 ECO 应用程序

图 2. 新建 ECO 应用程序" src="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0401swart2/figure2.gif" width=444 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/"

正如可在 Project Manager 中看到的,DB2ECO 项目包含三个单元:CoreClassesUnit.pas、DB2ECOEcoSpace.pas 和 WinForm.pas。Project Manager 面板上有三个选项卡:一个用于 Project Manager(默认视图),一个用于 Model View,还有一个用于 Data Explorer。Model View 对于 ECO 项目特别有用(见图 3)。

图 3. Model View

CoreClasses 包节点(带有灰色文件夹图标)包含一个 CoreClasses 图节点。双击 CoreClasses 图节点来启动 Delphi 8 for .NET IDE 中的 UML Designer。您可以使用 UML 技术在这里设计您的对象。例如,通过右击 UML Designer,您可以创建新的类,并且可在类中添加属性、操作或构造函数。此外,您还可以使用 Tools Palette上专门的 UML Class Diagram类别中的画图组件(见图 4)。

图 4. UML Class Diagram

构建对象模型

通过这些构建块,您可以构建一个对象模型。例如,右击 UML Designer并创建一个新类。称其为 Person。右击 Person 并添加四个 string 类型的属性: FIRSTNME、 MIDINIT、 LASTNAME 和 SEX。请注意与数据库表不同的是,无法指定字符串(string)属性的长度 —— 只有指定它们为字符串类型的选项。现在,再次右击该类并添加第五个属性,该属性称作 BIRTHDATE 并且为 DateTime 类型。请注意, Object Inspector会将该类型自动更改为 System.DateTime。

除了通用的 Person 类,我还想要再添加一个特定的 Employee 类 —— 例如一个模仿 DB2 UDB SAMPLE 数据库中 EMPLOYEE 表的布局的类(这或许可以解释我在 Person 类中所使用的属性名)。因此,右击 UML Designer并创建一个新类,这次称作 Employee。因为 Employee 是一个特殊化的 Person,所以您应该单击工具面板(tool palette)上 UML Class Diagram类别中的 Generalization/Implementation 画图组件,然后从新的 Employee 类画一条直线到 Person 类。这将在 UML 图以及 Delphi 源代码中描绘以下事实:Employee 是从 Person 派生的。

Employee 当然也具有一些特定的属性,因此请右击 Employee 类并添加四个新的字符串类型的属性,分别称作 EMPNO、 WORKDEPT、 PHONENO 和 JOB。还要添加一个 System.DateTime 类型的属性 HIREDATE,一个 Smallint 类型的属性 EDLEVEL,以及三个 Decimal 类型的属性,分别称作 SALARY、 BONUS 和 COMM。这将产生图 5 所示的小型 UML 图。

图 5. UML 模型

我将之作为练习留给读者来扩展 UML 模型。较好的实践同样是仿效 IBM DB2 UDB SAMPLE 数据库中的其他表(如 DEPARTMENT 表,或 EMP_ACT、EMP_PHOTO 和 EMP_RESUME 表 —— 将后者集成到 Employee 类中)。

在 DB2 中持久存储模型

除了提供 UML Designer,Delphi 8 for .NET 中的 Enterprise Core Object 还提供持久存储该对象模型的能力。这可以在一个简单的 XML 文件或真正的 DBMS(例如 IBM 的 DB2 UDB)中完成。

对于持久性的功能,您需要转移到 Object Manager中的 DB2ECOEcoSpace.pas 单元。该单元定义您的 EcoSpace,并且可通过工具面板(Tool Palette)上 Enterprise Core Objects 类别中的组件来定制。您可能需要特别查看其中三个 PersistenceMapper 组件:PersistenceMapperXml、PersistenceMapperSqlServer 和 PersistenceMapperBdp。PersistenceMapperXml 组件可以在 XML 文件中保存 EcoSpace,而其他两个在 DBMS 中保存 EcoSpace。对于 DB2,您必须使用 PersistenceMapperBdp组件,因此请在您的 EcoSpace 模块上放置一个。

您必须执行三个步骤来使应用程序使用该组件。首先,您需要配置 SqlDatabaseConfig 属性,该属性默认地包含一个 <<EMPTY PERSISTENCE MAPPER CONFIG>> 值。您可以通过使用 Object Inspector底部的一个动词来指定正确的值。因为您需要将 DB2 用作持久性数据库,所以您必须单击 DB2 setup链接。单击该动词不见得会完成许多工作(不会启动对话框),但是如果您再看一下,您将注意到 SqlDatabaseConfig 属性现在已被赋予了一个专用于 DB2 设置(setup)的值。

下一步将涉及 BdpConnection 组件,该组件映射到您需要用以存储对象模型的特定的 DB2 UDB 数据库。从 Data Explorer中,仅将针对 DB2 UDB SAMPLE数据库的 Db2Connection 拖至 EcoSpace 模块。这将产生一个 BdpConnection 组件,该组件被配置为使用 IBM DB2 UDB SAMPLE 数据库。现在选择 PersistenceMapperBdp 组件,并将其 Connection 属性指向 BdpConnection 组件。

现在,您只需要告诉您的 EcoSpace 模块要将 PersistenceMapperBdp 组件用作它的 PersistenceMapper(即作为持久存储模型的方法),因此要单击 EcoSpace 模块,并在 Object Inspector中选择 PersistenceMapperBdp 作为 PersistenceMapper 属性的值。请注意,您可以在运行时动态地指定该属性,这允许您切换持久性策略(例如,当未连接网络和 DB2 UDB 数据库时,使用单独的 XML 持久性文件作为本地公文包模型,然后当返回办公室时,重新连接 DB2 数据库为持久性方法)。

生成 DB2 模式

您完成了持久存储模型的大多数工作。剩下的就是 UML 模型和数据库模式之间的真正链接。虽然 IBM DB2 UDB SAMPLE 数据库已经包含了一个名为 EMPLOYEE 的表,但是该表不能直接与您 UML 模型中的 EMPLOYEE 类相兼容。为了自动创建正确的数据库模式(本例中,针对 DB2 SAMPLE 数据库),您应该单击 EcoSpace 模块上左下方的按钮来生成数据库模式,这将告诉您哪些表需要重新创建(如果 UML 模型中修改了它们相应的类定义),以及哪些表可以被删除 —— 如果您希望如此 —— 由于 UML 模型未使用它们,因此系统将之看作是“不必要的”。

对于本例,默认的 IBM DB2 UDB SAMPLE 数据库中,要(可选地)删除的表列表可在图 6 中看到,该图还显示了 PersistenceMapperBdp、BdpConnection 组件,以及 Tools Palette 中的 Enterprise Core Objects 组件。

图 6. 生成模式

比起您可以删除的表(应该为无),更令人感兴趣的是必须被删除和重新创建的表。对于这些表,没有任何选择。在本例中,这意味着要重新创建 EMPLOYEE 表(见图 7)。前一 EMPLOYEE 表及其所有数据都将被删除,并且将创建一个新的 EMPLOYEE 表和一个新的 PERSON 表(但是因为已经不存在 PERSON 表了,所以无需删除它)。

图 7. 必须被删除/重新创建的表

如果您曾修改过 UML 模型,您就可以重新创建数据库模式,以便确保数据库表和 UML 模型以后保持同步。

生成数据库模式之后,DB2 UDB SAMPLE 数据库将获得新版本的 EMPLOYEE 表,以及 PERSON 表和六个新的特定于 ECO 的表,分别称作 ECO_ID、ECO_MEMBERMAPPING、ECO_R_CLSMAP、ECO_TABLES、ECO_TYPE 和 ECO_W_CLSMAP。

使用对象模型

我已经展示了如何使用 UML Designer 定义对象模型,以及如何使用 PersistenceMapperBdp 组件持久存储 EcoSpace。但是,我还未向您展示如何真正地使用 EcoSpace 中的对象。为此,让我们转移到 WinForm.pas 单元,该单元已经在设计器(designer)的非可视组件区域中包含了五个 ECO 组件。

您需要添加来自于 Enterprise Core Objects 类别的附加组件,即 ExpressionHandler。将 ExpressionHandler 的 RootHandle 属性指向 rhRoot 组件。通过 ExpressionHandle,您可以构建可被显示的 OCL 表达式;例如,DataGrid 中所有 Employee 或 Person 的集合。要构建 OCL 表达式,请选择 ExpressionHandle 组件,并双击 Expression 属性,这将显示 OCL Expression Editor(见图 8)。

图 8. OCL Expression Editor

例如,我已经构建了 EMPLOYEE.allInstances 表达式,但是您还可以构建 PERSON.allInstances 表达式或任何其他需要显示的 OCL 表达式。

要真正显示该 OCL 表达式的结果,您可以使用 Tool Palette上 Data Controls类别中的 DataGrid 控件,并将其 DataSource 属性指向 ExpressionHandler 组件。这将产生如图 9 所示的结果。

图 9. 带有 DataGrid 的 WinForm

您或许还需要做一件事:虽然当前的应用程序在 DataGrid 中显示了所有的 Employee,并且带有编辑和持久性存储它们的选项,但是您仍然需要一种方式来创建新的 Person 或 Employee(以便在 DataGrid 中显示它们,然后您可以在 DataGrid 对它们进行编辑)。

为此,要在 Windows Form上放置一个按钮,并将其 Text属性设置为“New”,以及在 Click 事件处理程序中编写一行代码:

procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);

begin

Employee.Create(EcoSpace)

end;

最初,这感觉有点奇怪,因为您创建了一些东西,却没有使用它。但是如果您仔细观察,就将注意到您是在 EcoSpace 的上下文中创建新的 Employee —— 这意味着它将生存于 EcoSpace 中,并且将在 DataGrid 中进行显示(因为它连接了 OCL 表达式 EMPLOYEE.allInstances)。

最后一步包含用以保存模型(以及持久存储在 IBM DB2 UDB SAMPLE 数据库中)的显式动作。放置第二个按钮,将其 Text 属性设置为 Save 并且在 Click 事件处理程序中同样编写下面一行代码:

procedure TWinForm.Button2_Click(sender: System.Object; e: System.EventArgs);

begin

EcoSpace.UpdateDatabase

end;

这将为您持久存储模型并且更新 IBM DB2 UDB SAMPLE 数据库。

结束语

本文中,我展示了 IBM DB2 UDB 是一个功能强大的 DBMS,可用作 Delphi 8 for .NET 的 Enterprise Core Object 的持久层,以构建持久性的对象模型。ECO 和 DB2 UDB 的集成是无缝的,并且产生了功能强大、模型驱动的应用程序。

关于作者

Bob Swart(也称为 Dr.Bob - www.drbob42.com)在他自己的公司 Bob Swart Training & Consultancy(eBob42)(位于荷兰 Helmond)的身份是作家、教员、顾问和 Web 管理员。Bob 编写了自己的 Delphi 培训教材,并且从 1993 年以来一直在 Delphi 和 Borland 开发者大会上发表演讲。Bob 已经撰写了数百篇文章,并且还是 Revolutionary Guide to Delphi 2、 Delphi 4 Unleashed、 C++Builder 4 Unleashed、 C++Builder 5 Developer's Guide、 Kylix Developer's Guide、 Delphi 6 Developer's Guide和 C++Builder 6 Developer's Guide的合著者。

简介

在这篇文章中,我想要演示如何使用 Borland® Delphi TM 8 for the Microsoft® .NET Framework(缩写为“Delphi 8 for .NET”)的 Architect 版本,特别是 Borland Enterprise Core Object(ECO TM)部分中的功能,来设计一个持久存储在 IBM® DB2® Universal Database TM(UDB)SAMPLE 数据库中的对象模型(Object Model)。

从 ECO 着手

Enterprise Core Object 功能只能在 Delphi 8 for .NET 的 Architect 版本中获得。

执行 File | New - Other,并从 Object Repository 的 Delphi for .NET Projects页中选择 ECO Windows Forms Application图标(见图 1)。

图 1. Delphi 8 for .NET Object Repository

这将显示一个对话框,您可以在其中指定新的 ECO 项目的名称和位置(见图 2)。

图 2. 新建 ECO 应用程序

图 2. 新建 ECO 应用程序" src="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0401swart2/figure2.gif" width=444 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/"

正如可在 Project Manager 中看到的,DB2ECO 项目包含三个单元:CoreClassesUnit.pas、DB2ECOEcoSpace.pas 和 WinForm.pas。Project Manager 面板上有三个选项卡:一个用于 Project Manager(默认视图),一个用于 Model View,还有一个用于 Data Explorer。Model View 对于 ECO 项目特别有用(见图 3)。

图 3. Model View

CoreClasses 包节点(带有灰色文件夹图标)包含一个 CoreClasses 图节点。双击 CoreClasses 图节点来启动 Delphi 8 for .NET IDE 中的 UML Designer。您可以使用 UML 技术在这里设计您的对象。例如,通过右击 UML Designer,您可以创建新的类,并且可在类中添加属性、操作或构造函数。此外,您还可以使用 Tools Palette上专门的 UML Class Diagram类别中的画图组件(见图 4)。

图 4. UML Class Diagram

构建对象模型

通过这些构建块,您可以构建一个对象模型。例如,右击 UML Designer并创建一个新类。称其为 Person。右击 Person 并添加四个 string 类型的属性: FIRSTNME、 MIDINIT、 LASTNAME 和 SEX。请注意与数据库表不同的是,无法指定字符串(string)属性的长度 —— 只有指定它们为字符串类型的选项。现在,再次右击该类并添加第五个属性,该属性称作 BIRTHDATE 并且为 DateTime 类型。请注意, Object Inspector会将该类型自动更改为 System.DateTime。

除了通用的 Person 类,我还想要再添加一个特定的 Employee 类 —— 例如一个模仿 DB2 UDB SAMPLE 数据库中 EMPLOYEE 表的布局的类(这或许可以解释我在 Person 类中所使用的属性名)。因此,右击 UML Designer并创建一个新类,这次称作 Employee。因为 Employee 是一个特殊化的 Person,所以您应该单击工具面板(tool palette)上 UML Class Diagram类别中的 Generalization/Implementation 画图组件,然后从新的 Employee 类画一条直线到 Person 类。这将在 UML 图以及 Delphi 源代码中描绘以下事实:Employee 是从 Person 派生的。

Employee 当然也具有一些特定的属性,因此请右击 Employee 类并添加四个新的字符串类型的属性,分别称作 EMPNO、 WORKDEPT、 PHONENO 和 JOB。还要添加一个 System.DateTime 类型的属性 HIREDATE,一个 Smallint 类型的属性 EDLEVEL,以及三个 Decimal 类型的属性,分别称作 SALARY、 BONUS 和 COMM。这将产生图 5 所示的小型 UML 图。

图 5. UML 模型

我将之作为练习留给读者来扩展 UML 模型。较好的实践同样是仿效 IBM DB2 UDB SAMPLE 数据库中的其他表(如 DEPARTMENT 表,或 EMP_ACT、EMP_PHOTO 和 EMP_RESUME 表 —— 将后者集成到 Employee 类中)。

在 DB2 中持久存储模型

除了提供 UML Designer,Delphi 8 for .NET 中的 Enterprise Core Object 还提供持久存储该对象模型的能力。这可以在一个简单的 XML 文件或真正的 DBMS(例如 IBM 的 DB2 UDB)中完成。

对于持久性的功能,您需要转移到 Object Manager中的 DB2ECOEcoSpace.pas 单元。该单元定义您的 EcoSpace,并且可通过工具面板(Tool Palette)上 Enterprise Core Objects 类别中的组件来定制。您可能需要特别查看其中三个 PersistenceMapper 组件:PersistenceMapperXml、PersistenceMapperSqlServer 和 PersistenceMapperBdp。PersistenceMapperXml 组件可以在 XML 文件中保存 EcoSpace,而其他两个在 DBMS 中保存 EcoSpace。对于 DB2,您必须使用 PersistenceMapperBdp组件,因此请在您的 EcoSpace 模块上放置一个。

您必须执行三个步骤来使应用程序使用该组件。首先,您需要配置 SqlDatabaseConfig 属性,该属性默认地包含一个 <<EMPTY PERSISTENCE MAPPER CONFIG>> 值。您可以通过使用 Object Inspector底部的一个动词来指定正确的值。因为您需要将 DB2 用作持久性数据库,所以您必须单击 DB2 setup链接。单击该动词不见得会完成许多工作(不会启动对话框),但是如果您再看一下,您将注意到 SqlDatabaseConfig 属性现在已被赋予了一个专用于 DB2 设置(setup)的值。

下一步将涉及 BdpConnection 组件,该组件映射到您需要用以存储对象模型的特定的 DB2 UDB 数据库。从 Data Explorer中,仅将针对 DB2 UDB SAMPLE数据库的 Db2Connection 拖至 EcoSpace 模块。这将产生一个 BdpConnection 组件,该组件被配置为使用 IBM DB2 UDB SAMPLE 数据库。现在选择 PersistenceMapperBdp 组件,并将其 Connection 属性指向 BdpConnection 组件。

现在,您只需要告诉您的 EcoSpace 模块要将 PersistenceMapperBdp 组件用作它的 PersistenceMapper(即作为持久存储模型的方法),因此要单击 EcoSpace 模块,并在 Object Inspector中选择 PersistenceMapperBdp 作为 PersistenceMapper 属性的值。请注意,您可以在运行时动态地指定该属性,这允许您切换持久性策略(例如,当未连接网络和 DB2 UDB 数据库时,使用单独的 XML 持久性文件作为本地公文包模型,然后当返回办公室时,重新连接 DB2 数据库为持久性方法)。

生成 DB2 模式

您完成了持久存储模型的大多数工作。剩下的就是 UML 模型和数据库模式之间的真正链接。虽然 IBM DB2 UDB SAMPLE 数据库已经包含了一个名为 EMPLOYEE 的表,但是该表不能直接与您 UML 模型中的 EMPLOYEE 类相兼容。为了自动创建正确的数据库模式(本例中,针对 DB2 SAMPLE 数据库),您应该单击 EcoSpace 模块上左下方的按钮来生成数据库模式,这将告诉您哪些表需要重新创建(如果 UML 模型中修改了它们相应的类定义),以及哪些表可以被删除 —— 如果您希望如此 —— 由于 UML 模型未使用它们,因此系统将之看作是“不必要的”。

对于本例,默认的 IBM DB2 UDB SAMPLE 数据库中,要(可选地)删除的表列表可在图 6 中看到,该图还显示了 PersistenceMapperBdp、BdpConnection 组件,以及 Tools Palette 中的 Enterprise Core Objects 组件。

图 6. 生成模式

比起您可以删除的表(应该为无),更令人感兴趣的是必须被删除和重新创建的表。对于这些表,没有任何选择。在本例中,这意味着要重新创建 EMPLOYEE 表(见图 7)。前一 EMPLOYEE 表及其所有数据都将被删除,并且将创建一个新的 EMPLOYEE 表和一个新的 PERSON 表(但是因为已经不存在 PERSON 表了,所以无需删除它)。

图 7. 必须被删除/重新创建的表

如果您曾修改过 UML 模型,您就可以重新创建数据库模式,以便确保数据库表和 UML 模型以后保持同步。

生成数据库模式之后,DB2 UDB SAMPLE 数据库将获得新版本的 EMPLOYEE 表,以及 PERSON 表和六个新的特定于 ECO 的表,分别称作 ECO_ID、ECO_MEMBERMAPPING、ECO_R_CLSMAP、ECO_TABLES、ECO_TYPE 和 ECO_W_CLSMAP。

使用对象模型

我已经展示了如何使用 UML Designer 定义对象模型,以及如何使用 PersistenceMapperBdp 组件持久存储 EcoSpace。但是,我还未向您展示如何真正地使用 EcoSpace 中的对象。为此,让我们转移到 WinForm.pas 单元,该单元已经在设计器(designer)的非可视组件区域中包含了五个 ECO 组件。

您需要添加来自于 Enterprise Core Objects 类别的附加组件,即 ExpressionHandler。将 ExpressionHandler 的 RootHandle 属性指向 rhRoot 组件。通过 ExpressionHandle,您可以构建可被显示的 OCL 表达式;例如,DataGrid 中所有 Employee 或 Person 的集合。要构建 OCL 表达式,请选择 ExpressionHandle 组件,并双击 Expression 属性,这将显示 OCL Expression Editor(见图 8)。

图 8. OCL Expression Editor

例如,我已经构建了 EMPLOYEE.allInstances 表达式,但是您还可以构建 PERSON.allInstances 表达式或任何其他需要显示的 OCL 表达式。

要真正显示该 OCL 表达式的结果,您可以使用 Tool Palette上 Data Controls类别中的 DataGrid 控件,并将其 DataSource 属性指向 ExpressionHandler 组件。这将产生如图 9 所示的结果。

图 9. 带有 DataGrid 的 WinForm

您或许还需要做一件事:虽然当前的应用程序在 DataGrid 中显示了所有的 Employee,并且带有编辑和持久性存储它们的选项,但是您仍然需要一种方式来创建新的 Person 或 Employee(以便在 DataGrid 中显示它们,然后您可以在 DataGrid 对它们进行编辑)。

为此,要在 Windows Form上放置一个按钮,并将其 Text属性设置为“New”,以及在 Click 事件处理程序中编写一行代码:

procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);

begin

Employee.Create(EcoSpace)

end;

最初,这感觉有点奇怪,因为您创建了一些东西,却没有使用它。但是如果您仔细观察,就将注意到您是在 EcoSpace 的上下文中创建新的 Employee —— 这意味着它将生存于 EcoSpace 中,并且将在 DataGrid 中进行显示(因为它连接了 OCL 表达式 EMPLOYEE.allInstances)。

最后一步包含用以保存模型(以及持久存储在 IBM DB2 UDB SAMPLE 数据库中)的显式动作。放置第二个按钮,将其 Text 属性设置为 Save 并且在 Click 事件处理程序中同样编写下面一行代码:

procedure TWinForm.Button2_Click(sender: System.Object; e: System.EventArgs);

begin

EcoSpace.UpdateDatabase

end;

这将为您持久存储模型并且更新 IBM DB2 UDB SAMPLE 数据库。

结束语

本文中,我展示了 IBM DB2 UDB 是一个功能强大的 DBMS,可用作 Delphi 8 for .NET 的 Enterprise Core Object 的持久层,以构建持久性的对象模型。ECO 和 DB2 UDB 的集成是无缝的,并且产生了功能强大、模型驱动的应用程序。

关于作者

Bob Swart(也称为 Dr.Bob - www.drbob42.com)在他自己的公司 Bob Swart Training & Consultancy(eBob42)(位于荷兰 Helmond)的身份是作家、教员、顾问和 Web 管理员。Bob 编写了自己的 Delphi 培训教材,并且从 1993 年以来一直在 Delphi 和 Borland 开发者大会上发表演讲。Bob 已经撰写了数百篇文章,并且还是 Revolutionary Guide to Delphi 2、 Delphi 4 Unleashed、 C++Builder 4 Unleashed、 C++Builder 5 Developer's Guide、 Kylix Developer's Guide、 Delphi 6 Developer's Guide和 C++Builder 6 Developer's Guide的合著者。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有