`
何必如此
  • 浏览: 53585 次
社区版块
存档分类
最新评论

规则引擎Visual Rules Solution开发基础教程【连载7】--VisualRules实例二(上)

阅读更多
VisualRules实例二(上)


一、准备数据库
         我们以Mysql作为数据库,在Mysql中建立一个hr数据库,并且建立三张表。一张是部门信息表,一张是员工信息表,一张是月工资表。
         我们通过Mysql自带的建表工具Mysql Administrator来建立以下三张表:




         部门表用于对用户进行分类,以便于树状菜单分类展示用户的效果。




         员工信息中记录了该用户的基本工资,这个基本工资可能会随着工龄的增加有所调整。




         每月工资计算时,首先会从用户信息中取出当前的基本工资,然后输入该员工当月的奖金以及罚款。计算得到当月工资、所得税扣除以及实发工资。

二、配置数据源
         建好表之后,需要为规则库配置该数据源,这样规则里面就可以直接调用该数据库,操作其中的表,或者执行该数据库支持的sql语句。
         打开VisualRules安装时自带的数据库配置器 ,出现如下操作界面:





         数据库配置器,是一个数据库结构的管理器。其可以将已经在数据库创建的表导入到此管理器中。配置表的各个字段信息,以及相关的外键关联信息。通过此数据库配置器,可以生成规则库所需要的数据源,以及直接将配置好的表结构信息导入到规则包的对象库中。

三、新建数据源
         点击上图中文件菜单中的新建菜单,选择从MySql数据库导入。(如果数据库是其他的,可以选择从其他数据库导入)。




         弹出新建数据源的输入窗体,在以下的窗体中,输入数据源名称以及数据库名称,用户名和密码,如下所示:




         由于我们在mysql数据库中建立了hr数据库,因此数据源名称我们定义为hr,数据库名称也定义为hr。点击确定后,会显示已经在数据库中建立的表,可以选择其中规则库需要用到的表进行定义。




         导入后,会从数据库中将表的信息取出来。如下所示:




         上图中左侧部分为表名,其中表按照其名称进行了分类。由于hr_department, hr_employee, hr_salary三个表,都以 hr_作为开头,因此系统会将这个三个表放到hr目录下。系统是以表名中的“_”来进行区分表的。
四、配置表结构信息
         导入了表之后,就可以设置表的结构信息。依次设置三张表的中文描述。首先设置表的中文描述。
         右键点击上图左侧的表名,选择弹出菜单中的属性菜单。如下所示:




         弹出之后,可以在表的属性窗口中,输入表的中文描述信息,如下所示:




         并且如下图所示,在后侧表的字段信息窗体中,将字段的显示名设置成中文描述:



         按上述方法设置员工信息表,如下所示:



         再设置月工资表,如下所示:



五、设置表之间的关系
         设置完表的信息之后,我可以设置表之间的关系。表之间的关系采用外键关联的方式来进行设置。本工具设置的外键关联关系,可以直接通过数据库表已经设置的外键关联关系取得,也可以单独进行设置,作为对数据库表的一个补充。
         这些外键关系,会在自动生成联合查询的sql语句时,有用处。

         点击工具栏上的按钮,新建一个外键,在下面的输入框中,输入外键相关的信息,如下所示,我们新建一个用户表中的depid和部门表中的depid进行的外键关联。



         我们在新建一个月工资表中的empid和员工表中的empid进行外键关联。



六、导出数据源配置
         设置好了数据库的信息之后,就可以将他保存到文件系统中,在下面的例子中,我们将这个数据库结构信息文件保存到桌面上。
         点击工具栏中的按钮,保存到桌面,命名为hr。这样在桌面就会生成一个hr.dbs文件,这个文件可以通过数据库配置器打开。




         保存后,可以为规则包执行环境生成一个数据源配置。
         在数据库配置器左侧的编辑框中,右键点击数据库名,如下所示:




         选择生成数据库连接配置文件,点击后,将此文件生成在规则包执行环境的classpath路径中,一般是 tomcat\webapps\ROOT\WEB-INF \classes目录下:



         这样会在该classes目录下生成一个hr.conf文件。同理,如果规则包应用的工程,在别的路径中,就将此文件复制到该工程的classes目录下。
七、员工信息管理
         我们已经建立了员工信息管理所需要的表hr_employee,下面我们举例建立这个表的维护程序。基本上这是一个单表的维护程序,因此主要包括员工信息列表页面、新增员工信息页面、修改员工信息页面、删除功能。
1.员工信息规则组
         首先我们在原先工资管理规则工程的基础上,建立一个员工信息的规则组,如下所示:



         在工资管理的规则工程上,点击鼠标右键,在弹出的菜单中,选择新建规则组,并将规则组的名称变更为员工信息:



2.员工信息列表规则包
         以下我们在员工信息工程下面,建立一个员工信息列表规则包。这个规则包,包含了列表形式展示员工信息的页面和逻辑。
         展现的逻辑,就是将员工信息表的内容,用select语句从数据库中查询出来。页面就是提供一个table形式的页面,并且提供翻页功能。

(1)新建规则包
         右键点击员工信息的规则组,选择新建规则包菜单。



         输入规则包的名称为员工信息列表。



(2)配置数据源
         创建好规则包之后,我们需要配置从表hr_employee中读取数据的数据源。这个数据源已经在数据库配置工具中得到了定义,因此只要导入就行。
         右键点击“员工信息列表”规则包所属的对象库,选择从dbs文件中导入表。




         然后选择数据库配置器保存在桌面上的hr.dbs文件,打开:



         然后选择该规则包需要的表hr_employee,hr_department,如下所示:



         点击确定后,对象库中就自动加入hr数据库源,并且在该数据库源下面加入了员工信息表。并且自动添加对该表操作的方法,以及该表的字段信息、相关外键信息以及数据查询等操作。如下所示:



         导入了员工信息表之后,就可以对这个表进行操作,包括查询所有数据。不过这个信息列表中,我们希望可以取出该部门下的所有员工信息。因此需要根据sql语句来作为列表的数据源。以下建立一个sql查询,先右键点击已经导入的hr数据源,然后选择根据向导生成查询语句,如下所示:



         然后选择已经存储在目录中的hr.dbs文件,作为导入的源。



         接下来选择关联查询对应的表,在以下的操作界面中,选择hr_employee:



         接下来,选择需要查询出来的字段,我们需要显示员工信息表所有的字段,以及该员工所在的部门信息。
         在以下的输入框中,选择员工信息表所有字段如下所示:




         选择完显示字段后,需要选择条件字段。在本例子中,我们查看所有员工,不根据条件来进行选择。如下所示,我们直接点击完成:



         确定后,会显示一个添加sql查询的录入界面,此界面已经生成了关联查询sql,注意检查这个语句的正确性。另外我们将此sql查询命名为所有员工信息,如下所示:



         点击确定后,在hr数据源下面,就会建立一个所有员工信息的查询。对这个查询结果的字段和方法,已经得到了定义。



         导入后我们需用到部门表中已定义好的方法,在selectAll,getListResult方法前面打勾,我们就可以在规则中直接调用该方法了:



         最后,我们要定义有部门编号传入时,我们就需要显示该部门下的的所有员工信息的数据源。选择“根据向导生成查询语句”,选择员工表:












         我们可以看到数据库中的对象有:



(3)定义表格类型的变量
         定义完所有员工信息的sql查询,我们在对象库中定义一个变量,来存储取所有员工信息的数据。
         如下所示,我们在对象库中定义名为emplist的变量名称,并将其类型定义为list<list>,其中文描述我们定义为员工信息;定义一个deplist对象,类型为list<list>,表示部门信息;再定义id变量,这个id是我们从树状部门结构中传过来的,表示当前部门编号,用于显示该部门下的所有员工信息:




(4)定义查询规则
         定义完变量和数据源之后,我们定义将数据源的数据分配给变量的规则。
         首先,我们在规则属性窗口的初始化打勾:




         然后在规则中定义逻辑,如下:



         此操作是用来显示该员工所输部门名称。
         其次,我们在读取员工列表时需要判断是否有传入部门编号(id),如果有我们就显示该部门下所有的员工信息;如果没有,则我们就显示所有员工信息。
         首先,我们定义逻辑,判断部门编号是否大于零:







         如果大于零,则我们根据传入的部门编号查询高部门下的所有员工信息:



         然后我们要添加部门号不是大于零(等于零)情况,我们在属性面板添加否则动作:



         没有传入部门编号,我们则显示该部门下的所有员工信息,其逻辑如下:



(5)定义列表显示页面
         定义完后端的业务逻辑以及数据源之后,就需要再定义前端的显示页面。我们用列表页面来显示所有员工信息。
         如下,我们右键点击“员工信息列表”规则包,然后选择“添加jsp页面”。




         这样就会在规则包下面新建一个名为wage/employee/list.jsp的jsp页面。点击这个页面,在其属性窗口,将其模板类型修改为 “分类浏览页面”,如下所示:



         如下所示,在其属性设置其他的属性,将权限控制设置为“session级控制”,将显示导航设置为“显示”,将检索条件设置为“显示”,将显示分页设置为“底部显示”,将增加页面设置为“add.jsp”,将编辑页面设置为“edit.jsp”,将删除页面设置为“del.jsp”,将提交页面设置为“list.jsp”。



         接下来在该页面的编辑窗口,点击编辑窗口中已经存在的名为emplist的字段,注意其输出方式已经设置为列表显示。右键点击该字段,在弹出的菜单中,选择“添加列字段向导”,如下所示:



         接下来需要选择列表显示时需要显示的列,由于emplist是从所有员工信息的查询中取得的,因此可以根据查询的结果集的字段描述中,取得对应的列表需要的列的名称,在以下的选择框中,选择所有员工信息,下面的员工姓名、员工性别、手机号、生日、加入公司日期、职位、基本工资、部门名称。这些列来进行显示,如下所示:



         点击确定后,该页面中emplist列表下面就会自动增加上这些列的说明。下面就要对这些列的显示进行设置。首先将生日和加入公司日期列的类型设置为date型,如下所示:



         由于显示员工性别时,数据的类型是int型,是0、1在表示男女,因此,需要在页面上做一下转化。将员工性别的录入方式类型设置为“下拉式菜单选择框”,如下所示:



         然后双击员工性别的右边的扩展属性位置,设置员工性别列的扩展属性。在弹出的扩展属性窗口中,添加添加按钮,然后在弹出的输入框中,选择“单个菜单项”,然后设置属性值为0,属性名为o_男,如下所示:



         同理在增加一个属性值为1,属性名为o_女,添加完后,在扩展属性框中会如下所示:



         然后我们把所属部门的录入字段也设置为“下拉式菜单选择框”如:



         再设置其拓展属性,将p_options属性设置为deplist,如图所示:



         最后设置id(部门号),deplist(部门列表)录入方式为不设置,然后把他移至最上面:



         这样我们就完成了页面的设置,可以选择保存。系统会自动在指定的服务器路径中添加该jsp页面,以及对应的规则包编译文件。
         保存后我们点击jsp web浏览器按钮,显示该jsp页面时,看到如下界面:




         由于还没有添加数据,因此列表记录是0.以下,我们在分别制作增加、修改和删除页面。
3.增加员工信息规则包
         在员工信息规则组下面,新建一个“增加员工信息”规则包,将该规则包的外部调用名设置为“wage.employee.add”。
(1)添加数据源
         然后在该规则包的对象库中增加hr数据源以及增加一个hr_employee表。可以采用和上面同理的方法操作,从dbs文件中导入员工信息表:



         我们还需要在hr数据源中,定义一个部门信息的sql查询,作为该员工所在的部门信息的源,在hr数据源中,选择根据向导生成sql查询,然后选择hr_department表,以及depid、depname作为选择字段。最后生成sql语句如下所示:



         根据需要将显示名称修改为所有部门信息,点击确定后,就会增加一个可选部门的sql查询。
(2)定义变量
         设置完数据源之后,需要设置与页面交互的变量。也就是增加员工信息时,需要录入的字段。这些字段从页面接收之后,再录入到数据库中。在定义变量时,我们可以通过向导从表结构中将需要录入的字段信息读取出来,作为变量。如下,右键点击对象库,在弹出的下拉式菜单中,选择“根据表字段定义变量”,如下所示:



         然后在弹出的窗口中,选择需要定义的表字段。在这个例子中,我们需要录入hr_employee表的各个字段,我们选择除了empid字段的其他所有字段。(empid是自动递增的,不需要录入)。如下所示:



         点击确定后,在对象库中,就会自动增加这些字段作为变量,变量的名称和字段名一致。注意将生日和加入公司日期的类型修改为date类型,另外我们还需要定义一个tijiao字段,这个字段用于区分是否页面中按了提交按钮。我们还需要定义一个成功字段su,表示数据录入成功了,并且存储成功提示信息。而且由于部门是一个外键关联,因此我们还需要定义一个deplist字段,用于作为所属部门的可选择项。如下所示:



(3)定义规则
         定义了变量以及数据源后,我们就可以定义变量和数据源交互的业务逻辑。在这个例子中,变量从页面接收到数据。我们先判断是否有数据提交上来,如果有,就将他添加到数据库表中,如果没有,就显示录入页面,并且提供可选部门给页面。
         首先我们来定义提交的逻辑:我们新建一个规则集,命名为提交不为空,设置其编辑逻辑为只有公共条件:




         进入条件设置为调教按钮不为空:



         然后在该规则集下添加添加记录的规则,右键添加规则记录的规则,选择表字段赋值向导,因为我们是添加记录所有选择插入操作:



         确认后如下添加记录规则逻辑如下:



         我们还需添加成功字段的赋值逻辑:



         然后我们需要定义部门信息的逻辑,新建个规则命名为部门信息(部门信息是用于显示所属部门下拉菜单框信息):



(4)定义页面
         定义完业务逻辑之后,就可以定义页面。在规则包下面添加jsp页面,会自动添加一个名为wage/employee/add.jsp的jsp页面。在这个jsp页面的属性窗口中,将其模板文件设置为“录入提交页面”,如下所示:



         另外在编辑窗口,将字段信息进行调整,首先将照片的字段放到第二个字段的位置,可以通过ALT+↑或者ALT+↓来移动位置。将员工性别的录入方式设置为“下拉式菜单选择框扩展属性中,增加两个属性,一个属性名为o_男,属性值为0;另一个属性名为o_女,属性值为1;并将其校验类型设置为“不校验”。将生日字段设置为“日期输入框”,注意其变量类型设置为date。将加入公司日期设置为“日期输入框”,其变量类型设置为date型。将所属部门设置为“下拉式菜单选择框”,并且在其扩展属性中,设置其p_options为deplist。设置tijiao字段的录入方式为“提交按钮”,并将其显示名称定义为“提交”。将成功提示字段的字段类型定义为成功字段。将部门信息段的录入方式和输出方式都定义成“不设置”,如下所示:



         设定完字段的这些属性之后,还需要设置字段的长度和非空设置。我们可以通过向导从数据库的表结构中初始化具体的值。
         右键点击jsp页面编辑窗口中的字段,在弹出的右键菜单中选择“更新字段长度向导”:




         然后选择hr_employee表下面除了empid,pictrure外的所有字段来进行更新,如下所示:



         设置完jsp页面的字段的属性后,我们还需要设置jsp页面的属性窗口。如下所示,我们对jsp页面的显示方式进行设置:



         我们将显示导航属性设置为“显示并包含返回按钮”,将字符长度设置为“按字符数校验”,将数据提交区属性设置为“自定义”,将成功提示属性设置为“成功字段非空转到成功页面”,并将成功页面设置为“list.jsp”。
         这样就定义完了新增员工信息页面。我们点击jsp web浏览器,打开该页面,看到如下界面:




4.修改员工信息规则包
(1)新建规则包
         我们新建个规则包将将其命名为修改员工信息,外部调用名为wage.employee.edit:



(2)定义数据源、变量
         首先我们需要将hr_employee,hr_department导入到对象库中。



         我们需要定义一个empid的变量,这个变量用于定义员工编号。当第一次进入修改页面时会传递一个员工编号,然后根据这个编号查询数据库表取得员工信息,显示到页面供用户修改。修改完毕后,再提交到数据库表中。
         在本系统框架中,修改页面是由list.jsp页面中的修改按钮触发而进入的,因此缺省情况下,系统会提交一个id的变量到这个页面。因此我们只需在对象库中定义一个id的变量,就可以从页面上到empid的值,再定义string类型的提交按钮tijiao,string类型的成功字段su,list<list>类型的部门信息deplist。




(3)定义规则
         我们需要定义两个规则集一个是数据已提交,一个是数据未提交,一个是数据未提交。
         在未提交规则集下设置规则如下:




         在未提交数据的规则集下面添加一个“读取员工信息”的规则,将该规则的“初始化动作”以及“否则动作”的属性打上勾,并右键点击该规则,选择“对表字段取值向导”:



         在接下来的选择窗体中,选择员工信息表的除empid外其他所有字段,并且将“包含查询操作”打上勾:



         点击确定后,会在规则中设置好查询以及取值操作。将初始化中的设置员工信息表的员工编号字段的值为ID。



         在数据提交规则集下添加设置数据的规则,我们需在提交规则集设置规则为:






         在有提交数据时,我们需要先根据id找到那条记录,然后再对其进行修改。
         我们将原先的添加记录的规则名称,修改为修改记录。然后将此规则属性中的初始化动作打上勾,再右键点击这个“修改记录”规则包,选择“对表字段赋值向导”,如下:



         在规则属性初始化打勾。在接下来的操作界面中,我们选择员工信息表的empid字段,并且将“包含查询操作”以及“包含更新操作”打上勾,如下所示:



         点击确定后,我们将初始化中,设置员工信息表的员工编号字段的值为ID。同理,那么中的请选择,也设置为ID。设置完后,我们同时删除,在那么中的“添加员工信息表当前记录”。同时将成功提示设置为等于"修改员工信息成功!"。



         然后我们需要为所属部门添加部门名称,所以要为部门信息添加数据。
         新建部门信息规则包。
         由于我们需要在部门信息表添加两个方法,在前面打勾:




         我们再定义规则:



(4)定义jsp页面
         因此我们首先右键规则包,点击添加jsp页面,将字段属性修改为:



         然后修改页面属性如下:



         这样就定义完了修改员工信息页面。我们点击jsp web浏览器,打开该页面,看到如下界面:



         这是由于我们没有传入员工能够编号进去的,所以没法显示数据。当我们从员工列表点击修改将会出现下面的页面:



5.删除员工信息规则包
         在员工信息规则组下面,新建一个“删除员工信息”规则包,将该规则包的外部调用名设置为“wage.employee.del”。
(1)定义变量
         由于删除页面是从list.jsp页面传递进来的,因此在进入删除页面之前,会传递一个包含了多个删除id的nID变量,这个nID用“,”将多个id隔开。由于这些定义我们和以前定义的删除操作雷同,因此可以导入原先原先定义的对象库。
         我们在对象库中定义一个变量nID,其类型设置为string,并且在定义一个su的成功提示变量。




(2)添加数据源
我们将员工信息列表导入到对象库中:



         我们再添加一个删除语句,批量删除的操作,如下,首先右键点击hr数据源,选择“添加SQL执行语句”:


         然后将此SQL语句的显示名称命名为“批量删除员工信息”,并且将SQL语句设置为:delete from hr_employee where empid in ({string})。
         其中{list}表示此位置传入string类型的变量值,如下所示:




         点击确定后,在hr数据源下面就会有一个“批量删除员工信息”的SQL执行操作。
(3)定义规则
         定义了变量以及数据源后,我们就可以定义删除记录的业务逻辑。在这个例子中,我们将传入的nID直接传递给批量删除员工信息的string。
         我们在规则包下面添加一个“删除员工信息”的规则。
并且定义逻辑为如果需删除的编号不为空,则根据需删除编号执行批量删除员工信息的语句。如下:




(4)定义页面
         定义完业务逻辑之后,就可以定义页面。在规则包下面添加jsp页面,会自动添加一个名为wage/employee/del.jsp的jsp页面。在这个jsp页面的属性窗口中,将其模板文件设置为“判断处理页面”,再将成功提示属性设置为“成功字段非空forward”,并且设置成功页面为list.jsp。如下所示:



         我们在设置jsp的编辑窗口。设置su字段的字段类型为成功字段,如下所示:



         这些信息设置完后,就完成了删除页面的设置,由于,删除页面不能单独执行,因此不能以单独的页面进行显示。以上我们设置了员工信息的增、删、改、查的操作。
         对于“部门信息管理”和“ 员工月工资管理”与“员工信息管理”类似。如果感兴趣的话可以试着做一下。具体的操作在下一篇博客中进行详细的说明。
  • 大小: 9.6 KB
  • 大小: 18.3 KB
  • 大小: 16.7 KB
  • 大小: 2.6 KB
  • 大小: 22 KB
  • 大小: 12.5 KB
  • 大小: 11.9 KB
  • 大小: 16.6 KB
  • 大小: 51.8 KB
  • 大小: 11.4 KB
  • 大小: 12.9 KB
  • 大小: 32.7 KB
  • 大小: 39.2 KB
  • 大小: 38.3 KB
  • 大小: 886 Bytes
  • 大小: 16.5 KB
  • 大小: 16.9 KB
  • 大小: 1 KB
  • 大小: 34.6 KB
  • 大小: 10.7 KB
  • 大小: 38.5 KB
  • 大小: 7.1 KB
  • 大小: 4.2 KB
  • 大小: 5.4 KB
  • 大小: 5.1 KB
  • 大小: 7.9 KB
  • 大小: 34.4 KB
  • 大小: 20.5 KB
  • 大小: 43.5 KB
  • 大小: 9.9 KB
  • 大小: 34 KB
  • 大小: 21.8 KB
  • 大小: 24.7 KB
  • 大小: 25.5 KB
  • 大小: 19.7 KB
  • 大小: 57.3 KB
  • 大小: 39.1 KB
  • 大小: 21.8 KB
  • 大小: 24.7 KB
  • 大小: 25.3 KB
  • 大小: 20.2 KB
  • 大小: 7.2 KB
  • 大小: 28.9 KB
  • 大小: 13.6 KB
  • 大小: 2.9 KB
  • 大小: 4.7 KB
  • 大小: 1.9 KB
  • 大小: 4.9 KB
  • 大小: 13.6 KB
  • 大小: 10.9 KB
  • 大小: 9.6 KB
  • 大小: 14.5 KB
  • 大小: 9.7 KB
  • 大小: 14.3 KB
  • 大小: 31 KB
  • 大小: 32.1 KB
  • 大小: 26.1 KB
  • 大小: 31.4 KB
  • 大小: 24.3 KB
  • 大小: 23.3 KB
  • 大小: 23.7 KB
  • 大小: 21.3 KB
  • 大小: 1.8 KB
  • 大小: 26.8 KB
  • 大小: 2.2 KB
  • 大小: 15.9 KB
  • 大小: 14.8 KB
  • 大小: 20.8 KB
  • 大小: 17.1 KB
  • 大小: 11.9 KB
  • 大小: 37.3 KB
  • 大小: 24.5 KB
  • 大小: 33.4 KB
  • 大小: 12.4 KB
  • 大小: 18.8 KB
  • 大小: 13.9 KB
  • 大小: 25.4 KB
  • 大小: 24.2 KB
  • 大小: 24.2 KB
  • 大小: 10.1 KB
  • 大小: 24.4 KB
  • 大小: 11.4 KB
  • 大小: 5.2 KB
  • 大小: 14.6 KB
  • 大小: 16.2 KB
  • 大小: 11.3 KB
  • 大小: 15 KB
  • 大小: 4.2 KB
  • 大小: 22.5 KB
  • 大小: 9.7 KB
  • 大小: 13.5 KB
  • 大小: 24.2 KB
  • 大小: 17 KB
  • 大小: 62.5 KB
  • 大小: 36.2 KB
  • 大小: 27 KB
  • 大小: 9.3 KB
  • 大小: 23.8 KB
  • 大小: 24 KB
  • 大小: 5.1 KB
  • 大小: 3.5 KB
  • 大小: 10.3 KB
  • 大小: 16.7 KB
  • 大小: 19.2 KB
  • 大小: 6.4 KB
  • 大小: 5.5 KB
  • 大小: 17.1 KB
  • 大小: 10.7 KB
  • 大小: 19.1 KB
  • 大小: 24.9 KB
  • 大小: 26.6 KB
  • 大小: 20 KB
  • 大小: 21.6 KB
  • 大小: 19.5 KB
  • 大小: 4.9 KB
  • 大小: 18 KB
  • 大小: 5.6 KB
  • 大小: 26.8 KB
  • 大小: 42.5 KB
  • 大小: 25 KB
  • 大小: 14.8 KB
  • 大小: 54.3 KB
  • 大小: 9.2 KB
  • 大小: 30.6 KB
  • 大小: 30.7 KB
  • 大小: 50.9 KB
  • 大小: 19.9 KB
  • 大小: 33.5 KB
  • 大小: 15.8 KB
  • 大小: 19.3 KB
  • 大小: 6.5 KB
  • 大小: 14.1 KB
  • 大小: 11.4 KB
  • 大小: 6.1 KB
  • 大小: 6.1 KB
  • 大小: 14.1 KB
  • 大小: 36.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics