壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17321|回复: 33

Oracle EBS R12二次开发与Java大讨论!

[复制链接]
发表于 2007/4/9 09:52:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
Oracle Application R12界面是比以前的版本漂亮了一些,jinit其实还是有的,只是不再像以前那样需要安装了,只要你置为可信控件,会自动下载到本地,直接运行,基本和以前是一样的。主体框架还是没有变,以前的核心还是核心,经典的模块还是FORM的程序,没本质变化。只是多了很多CRM的东西,甚至还有个职责是“理财”,另外多了很多i开头的应用。Oracle的产品还是和以前一样,在平稳中慢慢变化,大方向坚定。
      如果走Oracle EBS的技术开发之路,那么除了精通SQL、PL/SQL、Form,Report等传统的11i的开发工具外,还要学习Java!因为R12 已经推出,以后很可能都用Jdeveloper做开发了!也就是以后的极有都是用Java了!(当然在过渡时期,Form、Report、Java是并存的!)
      虽然新东西出来,还需要市场的考验,暂时R12不可能取代11i!目前看,R12 里不会完全淘汰FORM的,有些模块都还是基于FORM的,有些新模块是基于WEB的,这部分需要用Jdeveloper来开发!R12在很多功能还是保留的FORM,当然也有很多的地方采用新的ORACLE OAF的开发技术。在R12中,OAF的开发也不在像11.5.10中,是基于Oracle Jdeveloper9.0.3版本上,而是升级到了新的Oracle Jdeveloper10g上了。
      但我们必须未雨绸缪,防祸患于未然!11i 的确还能支持一段时间,可是多长?一年,两年?只要Oracle主动推,R12 会在未来几年起来的,如其等到起来后再转,还不如趁早做准备!主动出击才是上策!
      欢迎大家广泛参与讨论,畅所欲言!

[ 本帖最后由 bob 于 2007-4-9 09:54 编辑 ]
发表于 2007/4/9 10:10:00 | 显示全部楼层
现在有哪些企业上了Oracle EBS R12呢?

做技术的,继续学习是必然的
个人觉得用OAF做开发,好麻烦啊,
发表于 2007/4/9 11:34:28 | 显示全部楼层
我们今年要上EBS R12,听顾问说开发报表用XML Builder,等接触以后有好的资料在拿出和大家分享.
发表于 2007/4/9 13:02:41 | 显示全部楼层
原帖由 szypfhj 于 2007-4-9 11:34 发表
我们今年要上EBS R12,听顾问说开发报表用XML Builder,等接触以后有好的资料在拿出和大家分享.


期待ing..............
发表于 2007/4/9 19:56:19 | 显示全部楼层
xml publisher 好东西!!!
正在学习中
这种讨论贴很有意义
顶上去
发表于 2007/4/9 20:12:28 | 显示全部楼层
到目前为止,还不知道OAF 究竟有哪些优势.

oracle 为什么要采用OAF 架构呢?

哪位大侠说说OAF的原理....
 楼主| 发表于 2007/4/9 20:28:16 | 显示全部楼层

关于OAF

一OAF简介
    oaf实际上就是ORACLE为了能让自己的ERP不倒而自己开发的一个WEB框架,同样3层框架,按照下面次序依次调用:PG 〉CO 〉AM 〉 VO 〉 EO。PG顾名思义page,WEB层,通过JDeveloper9i来开发XML文件,这可不是像VB那样可以拖拉控件,但也不是全部用手去写XML文件,是一种基于两者之间,在JDeveloper9i中会出现XML的层次构架,可以在每个节点下添加控件,并设置控件属性来控制WEB控件的显示格式和显示位置(现在感觉真的很垃圾),在page上用的都是ORACLE封装过的控件(有些功能很容易实现,但有的功能你就是实现不了,真怀念JSP的时代),CO就是Controller(控制器),页面的任何动作都会在这里进行,可就是不能在触发submit请求后直接更改WEBBIN属性,AM ApplicationModule(中间控制层)只能通过CO调用,可以在这里对DB端进行调用(VO),但ORACLE不让在这里写太多的验证逻辑,VO ViewObject(说白了就是一段SQL),可以通过VO读取数据库里的数据并放到缓存或EO中

二应用开发涉及的三个方面与OAF的关系
1业务领域模型
在业务领域中,实体的生存期很长,反映了它的当前状态;作用域很广,表现为被各个流程所引用,被各
个流程所作用的属性可能各不一样,但同属于一个实体;这个实体概念在OAF中用EO来表示。
<1>保证某个属性状态改变前后的一致性,通过某个属性validate实现.
<2>保证多个相关属性状态联动改变前后的一致性,通过实体validate实现.
2针对某一次需求的用例
程序的作用在于提供实体状态的在各个时刻各个环节的合法改变。这种改变有如下特点:
<1>某个流程只是涉及实体众多属性中的一部分,并只是提供对这部分属性的状态改变的方法。在OAF中,
这种部分属性改变通过VO关联 EO的部分属性来实现。
<2>某个流程只是涉及众多实体的部分实体,通过filter实现。
<3>流程涉及属于不同类型的多个实体的交互的改变,在AM中实现。
3用例的界面表现
由于<1>社会分工,实体状态的改变,会涉及多个角色,每个角色关注状态改变的不同方面,比如专员负责数
据采集,主管负责采集的数据的合法性.<2>状态改变的复杂,需要分步骤.所以为了解决这个问题,对于一次
状态的改变,会涉及<1>为每个角色提供不同的同一状态改变的不同界面,针对关注状态改变的不同方
面;<2>为状态改变提供多个界面,针对此次状态改变的每一个步骤.以上这些通过webbean关联相应的vo实
现.
OAF为以上一个应用开发涉及的三个方面(<1>业务领域模型,<2>针对某一次需求的用例,<3>用例的界面表
现),提供了完整的框架,这是oracle application framework中application framework的含义.与其他
framework相比,framework针对application的特点,是其核心.

三 uml图如何与OAF映射
实际上OAF的框架原理可以和uml1.1很好的映射
1业务领域模型--eo--class diagram
业务领域模型是在应用开发中生存期最长的,并被在不同时间所提出的需求共同引用,各个需求所引用的模
型实体的属性可能只是一部分,但是实体概念本身是共享的.
2用例----------vo--use case
针对当前用例,会给各个用例共享的实体概念添加针对本用例的属性
3用例的界面表现--webbean--sequence,collabrative
针对当前用例,会通过界面对本用例相关的属性分步骤,分角色操作,以达到状态的合法改变.
 楼主| 发表于 2007/4/9 21:00:08 | 显示全部楼层

OAF与struts

时下ERP软件趋向web是一个潮流,因为B/S架构于C/S架构相比,凭借着夸平台性等优势使得原版庞大的ERP一下子瘦身,屏弃了客户端,我们只要有web浏览器就能使用软件。struts本身就是MVC的典型代表,许多其他框架都从它发展开来。而OAF是oracle公司2004年推出的全新B/S架构ERP。接下来我从MVC不同层次来分析一下两者的特点。     首先View:struts的页面是标准的Jsp,由于有struts标签以及JavaScript支持,页面可以自由设置更改,自主性较强。不过有时候太自由也不太好,今天我注意到页面上标题栏莫名地多了一行,使得页面看起来非常不协调,这要是交货的话,肯定要被指摘。所以我硬着头皮花了个把小时检查Jsp,但还是一筹莫展,撑到十点,罢了,明天再搞,随后灰溜溜地回来了。实际上我最怕动Jsp,就怕哪里多个标签什么的,使得编译过不了。因此开放的Jsp使得出错可能性大大增加。而OAF的页面恰恰相反,完全是封装过的Jsp。没有标签,只有控件。这使得OAF做页面更像是VB,而不是Jsp。由于是封装过的,这使得OAF做出来的页面都非常死板,整个页面被分成规定的几部分,在OAF框架下,没有个性,不容许你做出实现功能以外部分,事实上你也没有可能做出来。因为OAF就是为ERP而开发的。这与做普通网页有本质区别。
    其次是Controller: struts对于页面的控制是通过action进行的。对于event的捕捉也比较灵活。一个event对于一个Java类,这样的搭配非常一目了然。在业务逻辑上,struts从下至上又分为data层,function层,page层。个人认为这样的结构层次分明,简便,但对于复杂的页面来说,将形成庞大的Java类,不易维护。OAF通过CO控制页面,CO又包含processRequest与processFormRequest两个method,分别控制initialize以及event。但是我觉得对于复杂页面,OAF处理event稍显麻烦,试想大量的event集中在一个method里面控制,而struts却是对一个event对于一个class,哪个更复杂,已经很明了了。但是有失必有得,OAF这样的设置,对于页面的变换控制能力比struts更胜一筹,因为struts必须依靠JavaScript来控制,这样代码量惊人,非常不易维护。从业务逻辑上,OAF从下至上分PL/SQL,AM。struts对于数据的操作,是通过简单SQL语句进行的,需要频繁访问DB,经常一次业务对DB进行十几次操作,试想一下,要是瞬时访问量巨大的话,系统非常容易崩掉。所以对于访问量巨大的软件来说,这样的架构是非常不合适的。而这点却完全体现oracle在数据库上的强大能力。OAF通过PL/SQL在DB Server进行业务处理,省去了大量的与web Server之间的通讯,减少了web Server的访问压力,这对于超大型软件是非常合适的。但是OAF规矩的格式,使得对于transaction的处理非常不灵活,不能自由控制transaction,这增加了对页面控制
的难度。而struts,则能够自由控制,完全不用担心。
     最后是Module:struts的模型相当简单,仅仅是JavaBean,我想我找不出更多的理由来说明它。相反,OAF的模型非常完善,分成ViewObject,EntityObject。我觉得OAF的风格更接近EJB,简便分散的struts对于复杂业务的把握能力远比不上OAF,复杂的模型对于复杂的业务更具大局观。
    进过以上分析,或许你会想哪种框架更优秀?实际上这两种框架的风格完全相反,struts结构简单,分散,自由;而OAF结构复杂,紧密,拘束。这正好比问公共汽车好,还是豪华大巴好。因为它们在不同作用域里起着不同作用,正如高低搭配,是不能相互取代的。感觉还是挺有意思的!哈哈
 楼主| 发表于 2007/4/10 08:51:39 | 显示全部楼层

Oracle ADF 框架简介之一

主要讲述Oracle ADF框架的结构和关键功能,以及突出介绍了JDeveloper 10g IDE工具用Oracle ADFEJBOracle TopLink JSF 来开发web应用程序的典型过程。
1
Oracle ADF
框架简介

Oracle ADF (Oracle Application Development Framework)
是一个端对端的应用程序框架,且是建立在J2EE标准和开源技术上的。它用来简化和加速构建面向服务的web应用程序。比如开发企业级的解决方案,要使用web,无线网络,桌面应用程序,及web services 等接口来搜索,显示,创建,更改以及更新数据,Oracle ADF能简化你的工作。现在Oracle JDeveloper 10g Oracle ADF结合得相当好,开发速度更能提升。
2
Oracle ADF框架体系结构及支持的技术

Oracle ADF可以达到清晰的分离模型、视图、控制器,即完全实现了MVC设计模式。Figure1-1显示出每个ADF模块在框架体系结构中的位置。这个体系结构中的中心模块就是实现了JSR-227规格的数据绑定工具——Oracle ADF Model,它能用统一的途径且不用任何代码来绑定任意用户接口到任意业务服务。其他Oracle ADF模块包括:

Oracle ADF Controller 集成了StrutsJSF

Oracle ADF Faces 提供用JSF建立web应用程序的组件库。

Oracle ADF Swing SwingOracle ADF Model扩展到桌面应用程序。

Oracle ADF Business Components 使开发者用4GL工具来简化建立业务服务,比如用Oracle Forms
3
视图层技术支持

视图层是设计用户界面的地方,可以使用JSPJSF等技术来开发。当然在桌面应用程序中还可以用Swing组件库。无论选择那种,都是用WYSIWYG(所见即所得)的方式和drag-and-drop(拖放)数据绑定。但选择JSF是最适合的,因为ADF Faces模块提供了近100JSF组件的完全的组件库。

ADF Faces组件库包含了复杂的特征,例如换肤技术,使用了ajax技术等。
4
控制层技术支持

控制层是处理web应用程序页面流的关键业务。Oracle ADF集成了流行的Apache Struts框架和内置页面导航功能的JSF框架。不管用那个框架,JDeveloper提供了可视页面流图表来设计页面流,并且在控制层的页面处理周期ADF Controller模块也提供了合适插件集成到ADF模型数据绑定工具。
5
ADF Model支持的业务服务技术

在模型层,Oracle ADF模型实现了JSR-227中称为数据控制的抽象服务,并且提供实现多数共同业务服务的盒外数据控制技术。支持的技术有:
EJB会话bean
由于多数J2EE应用程序需要事务处理服务,EJB会话bean是一个合乎逻辑的选择,因为它提供了开放的事务处理控制。在业务服务的EJB会话bean的后面,可以使用java对象(POJOs)或者EJB实体bean来代表业务域对象。JDeveloper提供集成的可支持创建EJB会话bean的功能,产生初始会话外观工具,以及创建java类或实体bean。你也可以使用Oracle TopLink来配置ORM

JavaBeans
Web Services
当你的应用程序需要列出标准的web服务接口,仅仅需要提供给Oracle ADF以与web服务相联系的URL。这个服务端点的描述语言就绑定与用户交互的接口,然后显示出结果。
XML
ADF Application Modules
这些服务类是ADF业务组件模块的特征,它能自动执行业务规则列出可更新的SQL查询结SQL查询结果的数据集。
 楼主| 发表于 2007/4/10 08:53:01 | 显示全部楼层

Oracle ADF 框架简介之二

ADF是是一个end-to-end的框架。和Spring一样它在企业应用架构的每一个层次都提供了它的支持。ADF的架构如下图所示: 在每一层ADF都有它的一些组件。我这次主要想讲讲ADF的data binding,因为它隔离了业务逻辑层和web层,使得两个层次的独立性更强。但是,ADF似乎做得过于复杂,使得很难上手使用。 ADF中关键的数据绑定概念如下: Data Control: Data Control是对业务接口的抽象,也就是说所有访问业务对象的方法现在都通过Data Control来进行,这样使得绑定层使用一种方式来访问数据,不论后台的数据对象是种实现。可以把Data Control看做是一种代理机制。 Iterator Bindings and Control Bindings: Binding是一种轻量级的对象,它的主要目的就是让后台数据和前台显示解藕,这是老生常谈的问题,让我们看看ADF是怎么做的。Iterator Binding 和提供集合对象数据的Data Control合作。 Control Bindings 则提供了一个标准的接口让用户界面可处理集合对象或者调用业务方法。 Binding Containers: Binding Container 对象记录了某一个用户界面使用了哪些iterator binding、control binding。 有一个XML文件记录了这些内容,在运行时就会根据这个XML来生产一个Binding Container。 Binding Context: Binding Context 则是比Binding Container更大的一个概念,它包含了所有的Binding Container以及Data Control的信息。 下面介绍一个简单的应用蓝图: 这个应用是这样的, 现在有一个论坛,在这个论坛上有一个页面用来Review 一些Threads并指定一个team回复它,这个页面叫做ReviewThreads.jsp 。 这个页面需要从后台的ForumService来获得数据并指定回复的Team. ForumService是一个ADF的Application Module组件(Application module组件是对业务逻辑的一种抽象,它可以实现为java class,EJB,webservice等等,它也有自己的方法来调用View Object,这里大家只需要认为它是一种业务组件就行了)。另外,这个页面还需要一个所有可选Team的下拉框,这个下来框的数据来自一个web service LookupCodes。 对应每一个业务组件会有一个Data Control包装了该组件的业务方法。在该应用的Binding Context中包含了两个Binding Container, ReviewThreads和UnansweredPostings。前者提供给ReviewThreads.jsp使用,后者则同事支持uix页面(uix是一种基于XML的界面语言),以及Jclient的一个Swing Panel。 ReviewThreads绑定容器包含了以下Binding: 1. 三个指向该应用使用的数据集合的iterator binding。两个由ForumService提供,一个由LookupCodes提供,如图所示 2. 三个支持了界面上元素的Control Binding 首先是一个Attribute control binding 用来在页面上Name输入框中显示Forum名字 其次是一个list binding来支持下拉框 最后是一个range binding用来支持JSTL的 显示Team对象。 3. 一个control binding用来调用ForumService的一个方法,用来指定Team答复Thread. 需要注意的是,control value bindings 是需要通过iterator binding来获得他们的数据。特别是list value binding它同时需要使用两个iterator binding,一个用来取得所有的list中的值,另一个用来提供list中选择的值。 下图介绍了上述的组件在运行时是怎么样配合的。一个Binding Context包含了一个或者多个Data Control和Binding Container。每一个Binding Container会有一个或者多个iterator binding 指定了一个页面使用的数据集合。每一个iterator binding从一个特定的Data control获取及更改数据。Binding Container也会有一个或多个control binding 来支持页面控制。当Control binding需要和数据绑定时,就要一个iterator binding相关联。如果是一个control action binding,比如说和页面上的submit健关联的binding则会要和一个data control 关联用来调用service 层的方法。
 楼主| 发表于 2007/4/10 08:55:40 | 显示全部楼层

基于Oracle ADF的二次开发

ADF是Oracle公司为简化J2EE程序开发的复杂性专门开发的一种解决方案,ADF通过减少实现设计模式和应用程序框架的代码量,简化了J2EE的研发难度。其优点主要体现在以下四个方面:

  (1) 开发环境:大部分J2EE框架都没有与之配套的开发工具,ORACLE为ADF提供了JDEVELOPER开发工具,它和ADF实现了完美的结合,方便了程序的开发。

  (2) 平台独立:ADF能够运行在任何符合J2EE标准的应用服务器上。

  (3) 技术选择:对于应用程序的不同层,开发人员可以使用自己擅长的技术进行开发。

  (4) 端到端的解决方案:ADF不只关注应用程序的某一层,而是对应用程序的每一层,都提供了完整的解决方案。

  Oracle ADF的架构

  Oracle ADF的架构是基于MVC设计模式的,其架构如图1所示。从图1我们可以看出,ADF把应用程序分成了四层,下面我们分别介绍:

  1)Business Service 层

  Business Service 层包括三个小层(见图1),分别是持久层(Persistent Business Objects),数据访问层(Data Access)和接口层(ADF Application Module)。这三层建立的顺序是这样的,先建立持久层的实体对象(Entity Object),然后建立数据访问层的视图对象(ViewObject),最后建立接口层。其中建立持久层的实体对象主要是和数据库的表或者同义词对象建立关联,数据访问层的视图对象(ViewObject)是基于实体层的实体对象建立的,主要是进行数据库的访问,而接口层是整个Business Service 层和Model层的接口,在数据访问层建立的视图对象需要注册到接口层中,这样在Model层中才可以访问。

  2)Model 层

  该层包括两部分(见图1),分别是ADF Bindings和ADF DataControl,其中ADF Bindings是ADF提供的一种绑定技术,ADF DataConrol 是指我们已经在接口层中注册的视图对象(ViewObject)。这一层在实际开发中基本不需要开发者做太多的工作。

  3)Controller 层

  ADF 在Controller层中扩展了APACHE基金会的STRUTS框架,它为Struts提供了一个页面流转图,以简化应用程序的开发。开发者可以简单地拖拽Struts的组件到这个图表中,这个图表会自动地同步更新Struts-config.xml文件,其中我们最常用的是DataPage组件,该组件的作用主要是建立一个页面,并且自动为其建立一个DataForwardAction,如果我们有一些自定义的方法,也可以写一个Action,然后覆盖DataForwardAction。

  4)View 层

  在View层可以采用ORACLE 的UIX 技术,它里面定义了大量功能强大的组件。Oracle Jdeveloper 在View 层提供了一个可视化的布局编辑器,开发者可以使用组件面板向应用程序添加可视化的组件,并可以运用属性编辑器(Property Inspector)来定义这些组件的属性。可视化的编辑器是和源码同步的,所以开发者可以选择自己喜欢的开发方式。

  
  图1 Oracle ADF 架构图

  ADF应用开发过程

  下面给大家简单介绍一下ADF具体的实现过程,开发工具我们选择Oracle的Jdeveloper10g,因为在目前的各种开发工具中,Jdeveloper是对ADF这个框架支持最好的工具,它内部直接集成了ADF开发时所需要的各种工具,给开发带来很大的方便。我们以《某合同管理系统中的设备招投标》模块为例。

  第一步:在Jdeveloper中,创建一个工作区,工作区的名字取为TestProject,在应用程序模板一项中,选择WEB APPLICATION(DEFAULT),确认后的工作区如图2所示,按照我们上面讲述的ADF的架构,我们先建立Business Service层的持久层对象,在Model这个工程上边,右键单击新建,然后选择Business Tier 下的Business Component ,选择EntityObject,然后出现图3;schema Object是让我们选择数据库中的表或者同义词等对象,name 是我们建立的持久层对象的名字,这里我们把name命名为CdtEquipmentEO,package指定这个对象放在什么包下面。

  
  图2 workspace TestProject建立时的情况

  
  图3 EntityObject 向导第一步

  第二步:建完持久层的实体对象后,我们就需要建立数据访问层的视图对象(ViewObject)。右键单击Model,新建选择ViewObject出现图4,左边是供我们选择已经存在的持久层的实体对象(EntityObject),这里面我们选择刚建好的CdtEquipmentEO这个实体对象。

  
  图4 ViewObject向导第二步

  第三步:需要建立接口层(ApplicationModule),将数据访问层的视图对象(ViewObject)注册到ApplicationModule中,如图5所示,我们选择CdtEquipmentView1这个视图对象,并把它添加到AppModul1中。

  
  图5 ApplicationModule 建立向导

  第四步:按照ADF架构,Model层我们基本不需要作什么工作,那么我们下面开始建立Controller层,首先需要建立DataPage,可以是UIX格式的也可以是JSP,这里我们用UIX格式。在Struts-config.xml中,从右侧的component中,可以直接选择DataPage,拖拽过来,listEquipment是我们给定的名字。

  
  图6 Struts_config.xml截面图

  第五步:建完Controller层,需要建立展现层(View),在listEquipment.uix页面中设置页面布局,可以对DataControl中的View进行拖拽,如图7所示,我们选择Data Control 面板中的CdtEquipmentView1,这就是我们刚才建立的View,下面的拖拽类型选择只读表就可以了。

  
  图7 listEquipment.xml截面图

  第六步:我们单击listEquipment.uix这个文件,选择运行(图8示),就可以直接得出所有设备的数据了,运行的效果如图9所示。

  
  图8 struts_config.xml截面图

  
  图9 运行效果图

  结论

  在Jdeveloper10g中结合ADF框架,使开发人员能够从零开始构建J2EE应用程序和WEB服务。因为Oracle ADF的高度结合性,以及它里面提供的优秀技术,使得开发应用变得十分简单方便,从而大大提高了应用程序的开发效率,具有很高的应用价值。

评分

参与人数 1壹佰币 +1 收起 理由
itjane + 1 支持支持(^0^)我要学学jdeveloper了

查看全部评分

发表于 2007/4/10 10:39:23 | 显示全部楼层
真是详细啊,非常适用
发表于 2007/4/10 15:01:24 | 显示全部楼层
置顶一段时间,大家讨论
发表于 2007/4/10 15:03:14 | 显示全部楼层
可否谈谈为何 EBS采用OAF而非 ADF?
发表于 2007/4/10 15:48:56 | 显示全部楼层
这个非常的经典,学习
发表于 2007/4/11 13:56:38 | 显示全部楼层
经典的东西总是一大堆理论撑着.........
发表于 2007/4/12 10:53:32 | 显示全部楼层
值得学习。
发表于 2007/4/16 13:57:04 | 显示全部楼层
原帖由 starhot 于 2007-4-10 15:03 发表
可否谈谈为何 EBS采用OAF而非 ADF?


同问
发表于 2007/4/18 14:02:17 | 显示全部楼层
这个帖子怎么能沉下去,前列要求长期置顶
发表于 2007/5/4 18:05:27 | 显示全部楼层
bob 大将军
知识多
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 00:52 , Processed in 0.025423 second(s), 17 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表