分享
 
 
 

偶的构件

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

这实在不能算是一篇技术文章,只是对我曾经开发过的一些构件做个说明,希望能给大家做做组件化开发提供一些思路吧:

一、 Storm.Cryptography

用于对字符串加密解密以及散列的类。

字符串的加解密采用RC2算法,散列采用SHA1算法。

数据加解密的密钥初始化向量分别保存在*.appkey.sto和*.appIV.sto两个文件中,其中*号代表密钥标识符以区分要使用哪一对密钥文件

默认这两个文件会保存在应用程序安装目录下,但对于Web应用程序,这两个文件会保存在相对于应用程序启动目录下,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

建议在制作安装程序时,添加这两个文件(任意的二进制文件)以方便卸载应用程序时从系统中卸载。并注意备份文件。

SHA1Provider类用于对字符串散列,可以确认数据未被更改过。

建议在对数据加密时同时采用加密算法和散列算法。

二、 Storm.AppSetting

对应用程序配置进行读写的类,应用程序配置数据采用RC2算法进行加密,并且使用SHA1算法进行散列,以防止数据被修改。

构件中的配置文件路径由应用程序配置文件中“AppSettingFile”指定,若不指定,对于Windows应用程序配置文件会在程序安装目录下,对于Web应用程序,会保存在相对于应用程序启动目录下,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

若使用相对路径,Windows应用程序相对于程序安装目录,Web应用程序相对于应用程序启动路径,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

若不指定XML文件名,则文件名默认为"AppSetting.XML"

AppConfig.ApplicationName用于设置应用程序的名称,这个设置在许多地方将会有用。

数据字典

AppConfig(系统设置表)

Key:程序设置的键 PK

Value:程序设置的值

Hash:程序设置值的哈希

Remark:备注

三、 Storm.DBExcute

获取数据库连接配置并对数据库数据进行查询、添加、修改、删除的操作。

使用本构件可以使您的系统保持很灵活的通用性,不用再担心用户使用的是哪种数据库了。

Storm.DBExecute.DBConfig提供数据库连接的相关配置。

支持多数据库的连接配置

支持XML配置文件

同时支持SQL Server、Oracle、ODBC和OleDb

默认数据库连接XML格式配置由Storm.AppSetting的配置文件中“DBCon”的设置决定,数据库类型则是“DBType”

非默认数据库连接XML格式配置由Storm.AppSetting的配置文件中“*DBCon”的设置决定,,数据库类型则是“*DBType”

其中星号代表数据库标识

Storm.DBExecute.ModifyDatabase提供对数据库数据进行查询、添加、修改、删除的操作。

支持对多数据库进行操作

同时支持SQL Server、Oracle、ODBC和OleDb

自动生成SQL语句

支持同一数据库内多表同时操作

支持开放式并发

支持事务回滚

注意:

对于多表操作而言,因为表间有关联,所以操作的顺序很重要,本构件操作的顺序是从数据表数组的前向后处理,请千万注意表处理的顺序!

Storm.DBExecute.XMLExecute提供对以XML格式存放在硬盘上的数据集进行操作的类,

默认的XML格式文件的存放路径由Storm.AppSetting的配置文件中“XMLPath”的设置决定,否则,会直接置于应用程序目录下(对于Web应用程序,会保存在相对于应用程序启动目录下,IIS5为Windows\System32,IIS6Windows\System32\INetSrv)

支持绝对和相对路径,对于Web应用程序,相对路径表示相对于应用程序启动路径,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

例如:<add key="XMLPath" value="C:\DBExcuteTest\XMLFiles"/>

非默认的XML格式文件的存放路径由Storm.AppSetting的配置文件中“*XMLPath”的设置决定其中星号代表指定的XML文件集名称,否则,会直接置于应用程序目录下(对于Web应用程序,会保存在相对于应用程序启动目录下,IIS5为Windows\System32,IIS6Windows\System32\INetSrv)

支持绝对和相对路径,对于Web应用程序,相对路径表示相对于应用程序启动路径,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

例如:<add key="TESTXMLPath" value="C:\DBExcuteTest\TESTXMLFiles"/>

四、 Storm.ExceptionManager

本构件用于错误管理,

可以自定义错误的相关信息,以便向用户显示友好信息。

本构件有三个相关文件ExceptionLog.XML,CustomOutMessage.XML和ExceptionList.xml;

上述文件的存放路径由由Storm.AppSetting的配置文件中“ExceptionPath”的设置决定,否则,会直接置于应用程序目录下(对于Web应用程序,会保存在相对于应用程序启动目录下,IIS5为Windows\System32,IIS6Windows\System32\INetSrv)

支持绝对和相对路径,对于Web应用程序,相对路径表示相对于应用程序启动路径,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

例如:<add key="ExceptionPath" value="C:\ExceptionManager\ExceptionManager"/>

自定义的错误处理信息存储在ExceptionList.xml文件中,可以利用构件公开的LogAccess.SaveExceptionDetail方法写入,写入时要注意,构件是采取的覆盖写入方式而不是追加写入的方式。

发生错误时,构件会将错误日志写入ExceptionLog.XML中,可以利用构件公开的LogAccess.ReadLogFile方法在系统中读取。

或者可以把错误日志写入系统的事件日志中,在系统事件日志的名为“Storm”的日志中可以看到,日志的源由Storm.AppSetting的配置文件中“ApplicationName”的设置指定。

用户可以指定向XML文件中还是向系统的事件日志中写入,或者两个,这个设置保存在Storm.AppSetting的配置文件中“ExceptionLogType”的设置中,可以设置的选项为CanUseExceptionLogType枚举中的值

错误的分析和匹配依靠ExceptionDetail中当前线程语言相关记录的Type和InMessage1、InMessage2、InMessage3、InMessage4来判定,其中Type是异常的类型,采用完全限定名,InMessage1~4是错误信息中的关键字。

以上四个匹配条件构成层次化关系:

Type.InMessage1.InMessage2.InMessage3.InMessage4;

分析匹配时,首先搜寻Type.InMessage1.InMessage2.InMessage3.InMessage4完全匹配的错误类型,若找不到,再找Type.InMessage1.InMessage2.InMessage3完全匹配的错误类型,然后再找Type.InMessage1.InMessage2完全匹配的错误类型,以此类推。

找到匹配之后,构件即根据ExceptionDetail中的OutMessage和HelpLink向用户显示友好信息。

本构件多语言的友好信息和日志信息,ExceptionDetail记录中的Language字段即指定该记录用于哪种语言,如果为空,则为默认记录,是没有相关语言的记录时使用的。

CustomOutMessage是用于向用户显示通用的友好信息时使用的,如未找到匹配异常时的显示(UnchartedExceptionMessage,如“未知错误!”),通知用户发生异常的显示(SystemExceptionMessage,如“系统错误”),请做某些操作(PleaseDoSomethingMessage,如“请与管理员联系”)的显示。CustomOutMessage同样使用Language字段区分所适用的语言。Language字段为“Default”的是默认的,如果没有找到匹配当前线程语言的则使用它。

由于异常的错误信息会根据该线程的文化设置而使用不同的语言,故ExceptionDetail中的InMessage1、InMessage2、InMessage3、InMessage4应考虑不同语言的情况。

数据字典

CustomOutMessage(自定义输出信息)

Language:语言代码,如en-US,zh-CN PK

UnchartedExceptionMessage:未找到匹配异常时显示的信息,如“未知错误!”

EorrorExceptionMessage:找到错误等级为"Error"的匹配异常时通知用户发生异常时显示的信息,如“系统错误”

EorrorPleaseDoSomethingMessage:找到错误等级为"Error"的匹配异常时通知用户后续操作时显示的信息,如“请联系管理员!”

FailureAuditExceptionMessage:找到错误等级为"FailureAudit"的匹配异常时通知用户发生异常时显示的信息,如“系统错误”

FailureAuditPleaseDoSomethingMessage:找到错误等级为"FailureAudit"的匹配异常时通知用户后续操作时显示的信息,如“请联系管理员!”

InformationExceptionMessage:找到错误等级为"Information"的匹配异常时通知用户发生异常时显示的信息,如“系统错误”

InformationPleaseDoSomethingMessage:找到错误等级为"Information"的匹配异常时通知用户后续操作时显示的信息,如“请联系管理员!”

SuccessAuditExceptionMessage:找到错误等级为"SuccessAudit"的匹配异常时通知用户发生异常时显示的信息,如“系统错误”

SuccessAuditPleaseDoSomethingMessage:找到错误等级为"SuccessAudit"的匹配异常时通知用户后续操作时显示的信息,如“请联系管理员!”

WarningExceptionMessage:找到错误等级为"Warning"的匹配异常时通知用户发生异常时显示的信息,如“系统错误”

WarningPleaseDoSomethingMessage:找到错误等级为"Warning"的匹配异常时通知用户后续操作时显示的信息,如“请联系管理员!”

LogTimeHeader:异常发生时间的信息头

ExceptionTypeHeader:异常类型信息头

ExceptiomOriginalMessageHeader:异常原始信息信息头

ExceptionSourceHeader:发生异常的应用程序或对象信息头

ExceptionStackTraceHeade:发生异常的堆栈信息头

ExceptionTargetSiteHeader:引发异常的方法信息头

ExceptionHelpLinkHeader:异常的帮助链接信息头

CustomMessageHeader:异常的系统管理员自定义信息信息头

CustomHelpLinkHeader:异常的系统管理员系统管理员自定义帮助链接信息头

UserNameHeader:引发异常的用户名信息头

ExceptionInducedPathHeader:发生异常的模块路径信息头

ExceptionDetail(异常匹配表)

Guid:全句唯一标识符 PK

Language:语言代码,如en-US,zh-CN

EventLevel:事件等级,必须是EventLevel枚举中的值

Type:异常类型,采用完全限定名

InMessage1:异常原始信息关键字1

InMessage2:异常原始信息关键字2

InMessage3:异常原始信息关键字3

InMessage4:异常原始信息关键字4

OutMessage:异常的管理员定义用户提示信息

HelpLink:异常的管理员定义帮助链接

ExceptionLog(异常日志表)

Guid:全句唯一标识符 PK

EventLevel:异常等级,是EventLevel枚举中的值

LogTime:异常发生的时间

ExceptionType:异常类型

ExceptiomOriginalMessage:异常原始信息

ExceptionSource:发生异常的应用程序或对象

ExceptionStackTrace:发生异常的堆栈

ExceptionTargetSite:引发异常的方法

ExceptionHelpLink:异常的帮助链接

CustomMessage:异常的管理员定义信息

CustomHelpLink:异常的管理员定义帮助链接

UserName:引发异常的系统用户

ExceptionInducedPath:发生异常的模块路径

五、 Storm.AdvanceSearch

用于实现高级查询的构件,Storm.AdvanceSearch.AdvanceSearchOption用于将查询条件装配到Hash表中,Storm.AdvanceSearch.SearchAssemblage用于根据Hash表中的查询条件装配查询语句。

目前支持SQL

将来会支持Oracle

对于Web页面,只需要将Web控件传入构件,构件可自动判断查询条件,目前特殊字句如“--Select--”在一个专用的XML文件中定义,默认为“--Select--”

文件存放路径由Storm.AppSetting的配置文件中“XMLPath”的设置决定,否则,会直接置于应用程序目录下(对于Web应用程序,会保存在相对于应用程序启动目录下,IIS5为Windows\System32,IIS6Windows\System32\INetSrv),

支持绝对和相对路径,对于Web应用程序,相对路径表示相对于应用程序启动路径,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

文件名为MultiLanguageSelectData.XML

数据字典

MultiLanguageSelect(选择词多语言表)

LanguageCode:语言代码,如en-US,zh-CN PK

SelectString:用于下拉框的选择词,如"--Select--"

六、 Storm.WebserviceAuthenticationModule

用于实现WebServices自定义Soap头身份验证的构件。使用说明:

使用Soap来给Web服务传递账户信息是一个相对使用URL传递装户信息而言比较安全的方式,同时不必为每一个WebMethod传递证书(作为参数的一部份),如果仍然觉得不够安全则可以对Soap头进行加密,或者干脆使用Soap传递安全证书,这里只介绍使用Soap不加密传递用户名和密码进行身份验证的方式。

首先生成一个自定义的http模块(就是这个WebServiceAuthenticationModule),并在Webconfig中注册,如下所示:

<httpModules>

<add name="WebServiceAuthenticationModule" type="Storm.WebserviceAuthenticationModule.WebServiceAuthenticationModule, Storm.WebserviceAuthenticationModule" />

</httpModules>

在Web服务类中添加一个WebServiceAuthenticationModule中定义的SOAPAuthHeader字段类型,并将SOAPAuthHeader属性应用于我们的Web服务方法中,然后使用赋给这个字段类型的名称sHeader定义这个属性的构造函数;

对于客户端来说,每一次将请求发送到WebServices都需要填充Soap头,在WebServices定义了Soap头之后,客户端的代理类也会生成相应的类代理,使用时,首先创建一个服务的对象实例代表我们的Web服务,然后创建一个Soap头对象实例,并填充Soap头,接下来将Soap头与该代理程序相关联,以便使用我们的Web服务。

以上是实现方式,再来说一下这种身份验证方式的验证过程。当一个服务请求发送到服务端,请求会被WebServiceAuthenticationModule截获,WebServiceAuthenticationModule就开始分析该请求的Soap头,从中解析出客户端发送的用户名和密码,并进行身份验证。如果身份验证通过,WebServiceAuthenticationModule便会给用户签发身份验证票;如果身份验证失败,WebServiceAuthenticationModule便会抛出一个消息为”Access Deny!”的SOAPException,随后服务端和客户端均可截获该异常并进行处理。

具体实现方式请查看公司的WebServices示例。

本模块使用Storm.UserAuthentication提供的用户登录服务。

七、 Storm.MultiLanguage

用于读写多语言数据的类

本类可对数据库中的字符串数据表及XML格式的字符串数据表进行操作。默认的数据库表名为DisplayString,默认的XML文件名为DisplayStringData.XML

对数据库中的字符串数据表支持多数据库及同一数据下多数据表的操作。数据库连接字符串在Storm.AppSetting的配置文件中指定。

对XML格式的字符串数据表,默认存放路径由Storm.AppSetting的配置文件中“XMLPath”的设置决定,否则,会直接置于应用程序目录下,对于Web应用程序,会保存在相对于应用程序启动目录下,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

非默认的XML格式文件的存放路径由Storm.AppSetting的配置文件中“*XMLPath”的设置决定,其中星号代表指定的XML文件集名称,否则,会直接置于应用程序目录下, 对于Web应用程序,会保存在相对于应用程序启动目录下,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

LanguageData数据集用于记录应用程序中可用的语言,存放路径由应用程序配置文件配置节中“XMLPath”的设置决定,否则,会直接置于应用程序目录下, 对于Web应用程序,会保存在相对于应用程序启动目录下,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

支持绝对和相对路径,对于Web应用程序,相对路径表示相对于应用程序启动路径,IIS5为Windows\System32,IIS6Windows\System32\INetSrv

应用程序的默认语言在Storm.AppSetting的配置文件中“DefaultLanguage”来设置。

数据字典

DisplayString(数据显示表)

LanguageCode:语言代码,如zh-CN,en-US PK

RefGuid:相关号 PK

Display:显示字符

Language(系统可用语言表)

LanguageCode:语言代码,如zh-CN,en-US PK

Name:语言名称,如中文,English

八、 Storm.ExchRate

用于对汇率进行操作的类。

汇率的表现采用三张数据表来表现:Currency,DefaultExchRate,FloatExchRate

组件支持多语言和各个时期的不同汇率。对于多语言的支持需要另外的Storm.MultiLanguage组件来支持。

具备对多个数据库中的汇率模块进行操作的能力

在不使用Storm.MultiLanguage组件的情况下单用本组件一样能实现除多语言支持外的各种功能。

Currency表用于记录各种货币的基本信息

DefaultExchRate用于记录各种货币相对于美元的各个时期汇率

FloatExchRate则是考虑到某些货币两两之间通过美元来转换可能会有误差的情况下而提供的记录两货币之间直接转换的各个时期的汇率

调用类中的各个方法可以获得所有的汇率信息,或者某种货币长期的对美元的、对其他货币的、从其他货币来的汇率

或者可以获得长期的从某种货币到某种货币的汇率

或者可以获得某个时间的以某种货币为源或者为目的的汇率

或者可以获得某个时间某种货币对美元的、对某种货币到其他某个货币的的汇率

输入某种货币的数量,可以获得某个时间目标货币的数量

对于默认汇率和浮动汇率

可以通过参数getfloatExchRate指定优先使用哪种汇率

在调用方法后检查getfloatExchRate可以知道实际上是使用的哪种货币

如果两种汇率都不存在,计算会返回0

对于数据更新,模块提供更新整个数据集、更新汇率的汇率数组或者只更新单条汇率信息的功能

数据字典

Currency(货币表)

CurrencyID:货币ID PK

Symbol:货币符号

Abbr:货币简称

Name:货币名

NameGuid:货币名Guid

Remark:备注

DefaultExchRate(默认(对美元)汇率)

DExchRateID:默认汇率ID PK

CurrencyID:货币ID FK Currency

ExchRate:汇率

BeginDate:生效时间

Remark:备注

FloatExchRate(浮动(两货币之间)汇率)

FExchRateID:浮动汇率ID

OrigCurrencyID:源货币ID FK Currency

DestCurrencyID:目标货币ID FK Currency

ExchRate:汇率

BeginDate:生效时间

Remark:备注

九、 Storm.UserAuthentication

用于使用系统的用户登录和权限控制的组件。

登录使用Storm.AppSetting的配置文件中UserConnectionString提供数据库连接配置,后台数据库中有Users,Role,RUserRole,ModuleFunction,RoleFunction,UserFunction和UserCustomParam表提供用户身份数据

另外有XML格式的UserParamSettingData.XML文件提供用户可自定义的设置的列表

Users表中有Nvarchar 型的Name和Password字段以及有Bit型的InUse字段并使用Name作为主键而不使用Guid。

Role表中有Nvarchar型的RoleName并为主键

RUserRole表中有UserName,RoleName分别与Users和Role表相应字段关联并两个合起来作为主键

ModuleFunction表中有Nvarchar型FunctionID并为主键

RoleFunction表中有RoleName,FunctionID分别与Role表和ModuleFuntion表相应字段关联并两个合起来作为主键

UserFunction表中有UserName,FunctionID分别与Users表和ModuleFuntion表相应字段关联并两个合起来作为主键

UserCustomParam表中有UserName,Parameter分别与Users表和UserParamSettingData.XML中的UserParamSetting表相应字段关联并两个合起来作为主键,Value保存采用RC2算法加密后的用户自定义设置值,Hash保存用户自定义设置值采用SHA1算法散列后的值。

本模块只读取表中的信息,不对表进行任何维护操作。

Users表不使用Guid而直接使用Name做为主键的原因;在使用这个身份验证模块的系统中,使用.Net框架内置的public IPrincipal User作为身份标识,该IPrincipal使用Name作为唯一身份标识,由此,系统数据库中Users表不使用Guid,而是使用Name作为主键,同时这样也可以有效保证系统中使用同一用户名的用户只有一个。它基于如下一个前提:系统中用户名唯一并在用户创建后不再更改用户名,这个前提是合理而且必要的。

数据字典

Role(角色表)

RoleName:角色名称 PK

Users(用户表)

Name:用户名 PK

Password:用户密码

InUse:是否启用

RUserRole:(角色分配表)

UserName:用户名 PK FK Users

RoleName:角色名 PK FK Role

ModuleFunction(系统功能表)

FunctionID:功能ID PK

RoleFunction(角色权限表)

FunctionID:功能ID PK FK ModuleFunction

RoleName:角色ID PK FK Role

UserFunction(用户权限表)

UserName:用户名 PK FK Users

FunctionID:功能ID PK FK ModuleFunction

UserCustomParam(用户自定义设置表)

UserName:用户名 PK FK Users

Parameter:设置名 PK FK UserParamSetting

Value:用户自定义设置的值

Hash:用户自定义设置的哈希

UserParamSetting(系统可用户自定义设置表)

ParameterName:可用户自定义设置名

DefaultValue:默认值

Description:相关描述

十、 Storm.Common

本构件提供一些相对细碎但又很有用的功能。

本构件目前有三个命名空间Storm.Common.SQL、Storm.Common.Web和Storm.Common.Windows,分别提供相关领域的小而实用功能。

Storm.Common.SQL.Filter提供用于SQL的字符过滤器。

Storm.Common.Web.FileAccess用于在服务器上访问文件的类。

文件的默认存放路径由Storm.AppSetting的配置文件中“PostedFilePath”的设置决定,否则,会直接置于应用程序目录下,设置支持相对路径或绝对路径,相对路径指相对于应用程序路径

文件的非默认存放路径由Storm.AppSetting的配置文件中“*PostedFilePath”的设置决定,其中星号代表文件集的名称,否则,会直接置于应用程序目录下,设置支持相对路径或绝对路径,相对路径指相对于应用程序路径

为防止文件重名,在服务器端的文件是经过改名的,文件名格式为原文件名+当前时间,所以服务器文件列表应保存两个数据字段,原文件名和新文件名.

Storm.Common.Web.Filter用于Web页的字符过滤器。

Storm.Common.Web.Jscript有关Java脚本相关操作的类。

Storm.Common.Web.Message弹出窗口(提示,消息……)。

Storm.Common.Maths用于数学函数的计算

十一、 Storm.SmartClient.Client.FileTransfer

本构件封装SmartClient的Client端与服务器间的文件传输功能。

十二、 Storm.SmartClient.Client.LocalDataAccess

本构件封装SmartClient的Client端的本地数据读写功能。

十三、 Storm.SmartClient.Client.ModuleLoader

本构件封装SmartClient的Client端的模块加载功能。

十四、 Storm.SmartClient.Client.Interfaces

本构件封装SmartClient的Client端的常用接口。

十五、 Storm.SmartClient.Server.Common

本构件封装SmartClient的Server端如下通用功能:模块列表访问,与客户端间的文件传输。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有