NC开发流程一览表说明.docx_第1页
NC开发流程一览表说明.docx_第2页
NC开发流程一览表说明.docx_第3页
NC开发流程一览表说明.docx_第4页
NC开发流程一览表说明.docx_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单表体的卡片型单据制作单表体的单据:指装载界面数据的聚合VO表头为空,只存在一组表体VO。UI工厂设计了接口ISingleController,单表体单据界面控制类应实现此接口,并实现isSingleDetail方法。前期准备:单据注册,模板初始化等等,在构造好类框架后要修改界面控制类。1. 注册单据类型2. 注册VO对象 如下:public String getBillVoName()Return new StringSampleVo.class.getName(),SampleHeadVO.class.getName(),SampleHeadVo.class.getName(),;public String getPKField()Return “pk_sample”;public String getChildPKField()Return “pk_sample”;注意此时的表头,表体的VO类一致。3是否走平台public int getBusinessActionType()Return nc.ui.trade.businessaction.IBusinessActionType.BD;4.注册按钮public int getCardButtonAry()Return new intIBillButton.Query,IBillButton.Add,IBillButton.Edit,IBillButton.Line,IBillButton.Save,IBillButton.Cancel,IBillButton.Refresh,;最重要的一步,实现isSingleDetail方法。public Boolean isSingleDetail()/单表体明细/单表体Return true;ISingleController用来支持单表头或单表体的单据,因此,当isSingleDetail方法返回true时,单据为单表体;当返回false时,单据为但表头。单表头的卡片型单据制作除了显示有很大差异外,单表头于单表体的唯一区别在于isSingleDetail方法的返回值。另外,在单表头界面增加浏览按钮和去掉行操作按钮。虚拟主子表的卡片型单据制作虚拟主子表单据:指的是那种数据来源于一张表,却根据(自定义的)特定规则虚拟主子表的结构,将一部分放到表头,剩下的字段放到表体的单据。它通常用于数据的分组,即把数据根据(自定义的)特定字段的值进行分组。字段值相等的数据自然的被归为一类,然后,把特定字段放到表头显示,属于它的一组数据在表体列表显示,形成了标准主子表的结构。由于数据分组的特定规则取决于业务,因此UI工厂无法做缺省的实现。但加载数据库数据一般都在查询时完成,所以可以定制查询事件的行为,这需要为单据创建按钮事件处理器,并重载查询时基类调用的方法。加载数据的步骤如下:1 第一步,与前面的步骤一样,并配置好界面控制器类。2 在UI类重载按钮事件处理器类的方法,如下:Protected CardEventHandler createEventHandler()Return new SampleCardEventHandle(this.getUIControl();3. 构造按钮事件处理器类,重载onBoQuery方法。如下:Protected void onBoQuery() throws ExceptionUIDialog querydialog = getQueryUI();If(querydialog.showModel()=(INormalQuery)querydialog;String strWhere=query.getWhereSql();If(strWhere=null)strWhere=”1=1”;strWhere=”(”+strWhere+”) and (isnull(dr,0)=0)”;/将查询对话框条件加到整个查询条件后If(getHeadCondition()!=null)strWhere=strWhere+”and”+getHeadCondition();/查询数据表数据SuperVO queryVos=getBusinessAction().queryHeadAllData(Class.forName(getUIController().getBillVoName()1),getUIController().getBillType(),strWhere);/清空缓冲数据getBUfferData().clear();if(queryVos=null|queryVos.length=0)getBillUI().setBillOperate(IBillOperate.OP_INIT);getBufferData().setCurrentRow(-1);else/根据规则将数据进行分组AggregatedValueObject bills=createBillVOs(queryVos);getBillUI().setBillOperate(IBillOperate.OP_NOTEDIT);getBufferData().setCurrentRow(0);/*对一组VO数据进行分类*param待分类的VO数据*return 分类的结果*/Private AggregatedValueObject/聚合值对象数据createBillVOs(CircularlyAccessibleValueObjectvos)/循环获得值对象数组if(vos=null|vos.length=0)return null;/按照年度,月度将数据分组HashMap tmpMap=Hashlize.hashlizeObjects(vos,new VOHashKeyAdapter(new String“vyear”,”vmonth”);AggregatedValueObject bills=new AggregatedValueObjecttmpMap.size();Int i=0;Iterator it=tmpMap.keySet().iterator()For(;it.hasNext();i+)Object key=it.next();ArrayList al=(ArrayList)tmpMap.get(key);Billsi=new nc.vo.trade.pub.HYBillVO();/设置表头数据billi.setChildrenVO(SuperVO).toArray(new SuperVO0);Return bills;对数据增,删,改的控制因为是虚拟主子表的数据结构,它在进行数据的操作时需要额外的控制。这个问题的本质是在将前台数据写回后台时,需将前台的主子表结构还原为单表结构。1. 数据修改时的控制,这包括新增和编辑在编辑(行操作)完毕,点击保存按钮。程序会从界面取得被修改的数据,这些数据被标志成新增,删除,修改等状态,提交给后台处理。对于真正的主子表,表头数据和标题数据会分别存储到对应的表中,但对于虚拟主子表的单据,主表数据加上字表数据的一行才构成数据表中的一行记录。这个问题的解决方法如下:在获取界面VO时做控制,方法是重载UI类重载基类的getChangedVOFramUI方法:Public AggregateValueObject getChangeVOFromUI()Throws ExceptionAggregatedValueObject vo=super.getChangedVOFromUI();If(vo!=null)/将聚合VO的主表设为空Vo.setParentVO(null);Return vo;通过将聚合VO的主表舍为空,后台不会再处理主表的数据。在编辑时,将需要存储的主表数据放到字表中。这需要控制行操作的行为,方法是时间处理器重载基类的行操作方法:/*增行方法*/Public void onBoLineAdd() throws java.lang.ExceptionSuper.onBoLineAdd();addDefaultData();/*粘贴行的方法*/Protected void onBoLinePaste() throws ExceptionSuper.onBoLinePaste();addDefaultData();/*插入行方法*/Protected void onBoLineIns() throws Exceptionsuper.onBoLineIns();addDefaultData();/*将表头数据放到表体中*/Private void addDefaultData() throws ExceptionInt currentBodyrow=getBillCardPanelWrapper().getBillCardPanel().getBillTable().getSelectedRow();Object vyear=getBillCardPanelWrapper().getBillCardPanel().getHeadItem(“vyear”).getValue();getBillCardPanelWrapper().getBillCardPanel().setBodyValueAt(vyear,currentBodyrow,”vyear”);Object vmonth=getBillCardPanelWrapper().getBillCardPanel().getHeadItem(“vmonth”).getValue();getBillCardPanelWrapper().getBillCardPanel().setBodyValueAt(vmonth,currentBodyrow,”vmonth”);可以看到,在每个意在更新数据的行操作方法中,都会调用将表头相关数据放到表体当前操作行的方法。控制保存后否再次查询数据库,以取得数据库最新数据。对于真正的主子表,在数据库更新数据后重新查询一下最新数据并向前台返回,是具有意义的,并且根据表头数据的主键即可获得表头数据和表体数据。而虚拟主子表,如前所述,数据的组织在UI端完成,后台没有足够的信息区查询和组织数据。因此,此时只能向前台返回当前的数据。UI工厂使用IRetCurrentDataAfterSave借口做此标志,如果UI类的getUserObject方法返回的对象实现了此接口,则在保存后部重新读取数据库。我们加了一个RetCurrentDataAfterSaveImpl类,让它实现IRetCurrentDataAfterSave接口。如:Public Object getUserObject()Return new RetCurrentDataAfterSaveImpl();需要注意的是:从程序健壮性考虑,我们应该加一些前台校验类,依照前面介绍,我们创建前台校验类,并在单据类型中注册。3 对数据的删除控制这需要让事件处理器重载基类的onBoDelete方法,如:Protected void onBoDelete() throws ExceptionIf(MessageDialog.showYesNoDlg(getBillUI(),”档案删除”,”是否确认删除该基本档案?”)!=UIDialog.ID_YES)return;AggregateValueObject modelVo=getBufferData().getCurrentVO();/将聚合VO的表头设为空modelVo.setParentVo(null);getBusinesssAction().delete(modelVo,getBillUI()._getDate().toString(),getBillUI.getUserObject();getBufferData().removeCurrentRow();if(getBufferData().getVOBufferSize()=0)getBillUI().setBillOperate(IBillOperate.OP_INIT);elsegetBillUI().setBillOperate(IBillOperate.OP_NOTEDIT);注:删除单据时,并不涉及到界面的数据,因此只需控制BillUIBuffer中的缓存的当前VO。多子表卡片型单据多子表单据在界面显示上通常是表头+多页签的表体,每一个页签代表一个子表。在UI工厂中,这种单据得到了抽象,主要从以下两个角度:1. 对UI显示界面的抽象。多子表单据的UI类不使用BillCardUI做基类,而是继承与一个新的UI基类,MultiChildBillCardUI,它封装了多个页签的界面显示。2. 对VO数据的抽象。在NC应用中,主子表数据存储在 聚合VO中,它支持一个主表+一个子表的结构,但是,这种结构不适合于多子表的情况。因此,UI工厂设计了接口IExAggVO,需要装载多子表数据的聚合VO类,应该实现此接口,并实现它的关键方法。制作多子表单据的步骤定义多子表VO多子表Vo是聚合VO,同事又像一个装载多个字表数据的容器,因此它必然继承自AggregatedValueObject的类层次,又实现多子表VO的接口,IExAggVO,具体如下:Public class SampleExAggVO extends nc.vo.trade.pub.HYBillVO implements nc.vo.trade.pub.IExAggVO/用来装载多子表数据的hashmapPrivate HashMap hmChildVOs=new HashMap();/*返回各个子表的编码*必须与单据模板的页签编码对应*/Public java.lang.String getTableCodes()Return new String“sample_table1”,”sample_table2”;/*返回各个子表的中文名称*创建日期:(01-3-20 17:36:56)*/Public java.lang.String getTableNames()Return new String“字表一”,”字表二”;/*取得所有子表的所有VO对象*/Public CircularlyAccessibleValueObject getAllChildrenVO()ArrayLIst all=new ArrayList();For(int i=0;i0)dataHashTable.put(tableCodes0,AVOs);/将查询的数据子表一的数据放入hashtableIf(BVOs!=null&BVOs.length0)dataHashTable.put(tableCodes1,BVOs);/将查询的数据子表二的数据放入hashtable Return dataHashTable;5.定义单据UI类创建一个继承MultiChildBillCardUI类的单据UI类,并关联上先前创建的界面控制类,业务代理类:/*关联上界面控制类*/Protected ICardController createController()Return new SampleCardController();/*关联上业务代理类*/Protected BusinessDelegator createBusinessDelegator()Return new SampleCardDelegator();如何制作列表型单据列表型单据统一的界面基类是ListCardUI,统一的事件处理基类是ListEventHandler,统一的界面控制接口为IListController。对于数据表满足真正的主子表结构的单据,要开发单表头,单表体,多子表的单据非常简单,只是在类的继承关系上有所不同,因此在制作列表型单据时,绝大部分过程都可以仿照卡片型单据的制作。标准的列表型单据和卡片型单据相比,不同之处是:列表型单据的控制器实现IListController接口,并且应该把按钮的设置实现在getListButtonAry方法中,如:Public int getListButtonAry()Return new intIBillButton.Query,IBillButton.Edit,IBillButton.Line,IBillButton.Save,IBillButton.Cancel,IBillButton.Refresh,;与多子表的卡片单据相比,有两个不同:1. 多子表列表型单据的UI类继承自MultiChildlistUI类;2. 多子表列表型单据的界面控制类实现IListController接口。需要注意的是:列表型单据也应该创建自己的业务代理类,负责加载多页签的数据。单表头和单表体的列表型单据:因为列表界面的表头和表体都是由列表组成的,所以单表头和单表体对于列表型单据在界面显示上是一致的。UI工厂定义了ISingleController接口来指定单据时单表头还是单表体,因此,如果单据的界面控制类实现ISingleController接口,辅之以配套的单据模板,就可以实现单列表的界面。需要注意的是:1.列表型单据不支持新增,而卡片型单据可以新增.2.就是列表型单据支持UI初始化时自动加载数据,而卡片型单据要初始化时自动加载,只能在构造函数中调用数据加载的方法。虚拟主子表的列表型单据:制作虚拟主子表的列表型单据,基本策略和办法还是和卡片型单据一样。因为列表型单据在UI初始化时可以调用加载单据数据的方法。BillListUI初始化时调用initBillData方法加载单据数据因此我们在UI子类重载此方法:/*初始化时加载单据数据*/Protected void initBillData(String strWhere)throws ExceptionIf(strWhere=null)strWhere=”1=1”;strWhere = “(“+strWhere+”)and(isnull(dr,0)=0)”;SuperVO queryVos= getBusiDelegator().queryHeadAllData(Class.forName(getUIControl().getBillVoName()1),getUIControl().getBillTye(),strWhere);/清空缓冲数据getBufferData().clear();if(queryVos=null|query.length=0)setBillOperate(IBillOPerate.OP_INIT);setListHeadData(queryVos); getBufferData().setCurrentRow(-1);else/将VO数据分组AggregatedValueObject bills=createBillVOs(queryVos);getBufferData().addVOsToBuffer(bills);/将表头数据加到表头的列表中setListHeadData(getBufferData().getAllHeadVOsFromBuffer();setBillOperate(IBillOperate.OP_NOTEDIT);getBufferData().setCurrentRow(0);/*param待分类的VO数据*return 分类的结果*/Private AggregatedValueObject /聚合值对象数组 createBillVOs(CircularlyAccessibleValueObject vos)/循环获得值对象数组If(vos=null|vos.length=0)Return null;/将数据按年度,月度分组HashMap tmpMap=Hashlize.hashlizeObject(vos,new VOHashKeyAdapter(new String“vyear”,”vmonth”);AggregatedValueObject bills = new AggregatedValueObjecttmpMap.size();Int I = 0;For(Iterator it = tmpMap.keySet().iterator();it.hasNext();i+)Object key= it.next();ArrayList al =(ArrayList)tmpMap.get(key);Billsi = new nc.vo.trade.pub.HYBillVO();Billsi.setParentVO(CircularlyAccessibleValueObject)al.get(0);Billi.setChildrenVO(SuperVO)al.toArray(new SuperVO0);Return bills;这部分数据加载的逻辑和前面虚拟主子表的卡片单据例子很相似,只是它多了一步操作将查询得到的表头数据加到表头的列表中。管理型单据制作管理型单据时列表型单据和卡片型单据的组合,因此,它同时具备这两种单据的特征,也就是说,管理型单据具有两种视图,并且可以在这两种视图之间进行切换。另外,管理型单据对这两种视图又做了功能上的划分-卡片视图和列表视图都可用于数据的显示,但是一旦要对列表视图的数据进行编辑操作时,界面自动切换单卡片视图。管理型单据统一的界面基类是BillManageUI,统一的事件处理类是ManageEventHandler,统一的界面控制类为AbstractManageController。这个类实际上实现了ICardController和IListController两个接口。标准的管理型单据:1. 使单据UI类继承BIllManageUI。2. 使单据界面控制器类继承AbstractManageController类,这个类实现了卡片型单据控制器的通用接口ICardController和列表型单据控制器的通用接口IListController,因此我们的界面控制器类实际上需要实现卡片和列表控制器的所有方法,除了单据类型,单据VO的名字,是否走平台,主表主键名,字表主键名这些通用的设置以外,这里重点展示对于按钮的定义,如下:/*取得列表界面的按钮*/Public int getListButtonAry()Return new intIBillButton.Query,IBillButton.AddIBillButton.Edit,IBillButton.Line,IBillButton.Save,IBillButton.Delete,IBillButton.Cancel,/卡片按钮IBillButton.Card,IBillButton.Refresh,;/*取得卡片界面的按钮*/Public int getCardButtonAry()Return new intIBillButton.Query,IBillButton.Add,IBillButton.Edit,IBillButton.Line,IBillButton.SaveIBillButton.Delete,IBillButton.Cancel,/返回按钮IBillButton.Return,IBillButton.Refresh,;3. 当单据不走平台时,单据UI类应该重载基类的createBusinessDelegator方法,并返回不走平台的业务代理类。如下:Protected BusinessDelegator createBusinessDelegator()Return new BDBusinessDelegator();这样就完成了标准管理性的单据的制作。多子表的管理型单据:1.单据UI类应该继承MultiChildManageUI。2.单据控制器类与标准管理型单据相同,但是VO的配置应按照多子表卡片型单据所示。另外,就像制作卡片型多子表单据一样,加载多子表的数据需要设置一个业务代理类,我们完全可以重用卡片型多子表单据例子中的业务代理类。这样就完成了多子表管理型单据的制作。虚拟多子表的管理型单据:1. 单据UI类继承BillManageUI。2. 单据控制器类继承AbstractManageController。3. 当单据不走平台时,单据UI类应该重载基类的createBusinessDelegator方法4. 查询时必须将查询得到的数据加到表头列表中,如下所示:Protected void onBoQuery() throws ExceptionUIDialog query = getQueryUI();If(querydialog.showModal()=UIDialog.ID_OK)INormalQuery query = (INormalQuery)querydialog;String strWhere = query.getWhereSql();If(strWhere=null)strWhere=”1=1”;strWhere=”(“+strWhere+”)and(isnull(dr,0)=0)”;if(getHeadCondition()!=null)strWhere = strWhere+”and”+getHeadCondition();SuperVO queryVos = getBusinessAction().queryHeadAllData(Class.forName(getUIController().getBillVoName()1),getUIController().getBillType(),strWhere);清空缓冲数据getBufferData().clear();if(queryVos=null|queryVos.length=0)getBillUI().setBillOperate(IBillOperate.OP_INIT);getBillUI().setListHeadData(queryVos);getBufferData().setCurrentRow(-1);elseAggregatedValueObject bills = createBillVOs(queryVos);getBufferData().addVOsToBuffer(bills);/将表头数据加到表头列表中getBufferData().getAllHeadVOsFromBuffer();getBillUI().setBillOperate(IBillOperate.OP_NOTEDIT);getBufferData().setCurrentRow(0);5. 和虚拟多子表的卡片型单据一样,管理型单据应创建事件处理类,负责查询时组织数据以及删除和保存单据时去掉表头VO,但是,由于管理型单据的表头是列表,UI工厂将此列表VO缓存到界面上,因此,在修改单据和新增单据后,应该同时更新表头列表的VO数据。虚拟主子表的表头是一个逻辑的表头,在保存单据时,我们首先取得界面改变的VO数据,并将其表头VO设置为空,但是,这保证了保存操作的正确性,却给自动更新表头列表的VO数据制造了麻烦,解决的办法是在保存后将VO数据的表头VO还原,代码如下:/*单据保存后调用的方法*/Protected void setAddNewOperate(Boolean isAdding,AggregatedValueObject billVO)throws ExceptionIf(billVO!=null&billVO.getChildrenVO().length!=0)CircularlyAccessibleValueObject pvo= billVo.getChildrenVO()0;/还原表头VObillVO.setParentVO(pvo);super.setAddNewOperate(isAdding,billVO);setAddNewOperate方法在单据半寸后会被调用,它将去更新表头列表的VO数据。6. 删除时须将表头列表中对应行删除,如下所示:Protected void onBoDelete() throws ExceptionIf(MessageDialog.showYesNoDlg(getBillUI,”档案删除”,”是否确认删除该基本档案?”)!=UIDialog.ID_YES)Return;AggregatedValueObject modelVo = getBufferData().getCurrentVO();modelVo.setParentVO(null);getBusinessAction().delete(modelVo,getUIController().getBillType(),getBillUI()._getData().toString(),getBillUI().getUserObject();/将列表中该行删除getBillUI().removeListHeadData(getBufferData().getCurrentRow();getBufferData().removeCurrentRow();if(getBufferData().getVOBufferSize()=0)getBillUI().setBillOperate(IBillOperate.OP_INIT)elsegetBillUI().setBillOperate(IBillOperate.OP_NOTED)树卡片类型单据UI工厂提供了左树右单据这种界面形式,根据右边单据的界面类型又可以分为树卡片型单据和树管理型单据,树型结构为单据提供了更为丰富的界面表达形式,对客户来说具有很好的导航效果,NC-UAP提供了产生树形结构的工具类,我们可以有两种方法生成树:1. 通过ID和ParentID,树的最基本元素是节点,节点既可以作为父节点,又可以作为孩子节点。每个节点都有一个ID标识自身,如果采用孩子节点链接父亲节点的数据结构,那么节点还需要一个域存储父亲节点的ID,这个ID是ParentID。2. 通过编码和编码规则,这里的编码规则实际上是将编码分段,然后通过判断编码长度构造树,假设编码规则是“1.2.2”,它意味着第一级树节点的编码只有一个字符长度,第二级树节点的编码长度是三个字符长度,第三极树节点是五个字符长度。如果有4个节点A,B,C,D,他们的编码分别是0,000,001,00100,那么构造的树的根节点是A,A有两个子节点B和C,C的子节点是D。这两种构造树的方法并不影响单据的制作,选择哪种策略完全取决于业务的要求和数据的构成形态。树卡片型单据的类结构:树卡片型单据统一的界面基类是BillTreeCardUI,它继承自BillCardUI。统一的事件处理基类是TreeCardEventHandler,它继承自CardEventHandler。统一的界面控制类接口为ITreeCardController,它继承自IcardController。开发树卡片型单据的步骤:标准的树卡片型界面:(构造树数据类)树的数据类封装了树的构造规则,如何获取数据等,按照ID构造的树,其数据必须实现IVOTreeDataByID接口,而按编码构造的树,其数据类必须实现IVOTreeDataByCode接口。例子如下:(按ID为准)Public class SampleTreeCardData implements IVOTreeDataByID/*取得节点的ID域名称*/Public String getIDFieldName()Return “pk_sample”;/*取得节点的PARENT_ID域名称*/Public String getParentIDFieldName()Return null;/*取得节点的显示域名称*/Public String getShowFieldName()Return “pk_sample”;/*取得树的数据*/Public SuperVO getTreeVO()SuperVO treeVOs = null;Nc.ui.trade.bsdelegate.BusinessDelegator business = new nc.ui.trade.bsdelegate.BDBusinessDelegator();TrytreeVOs = business.queryByCondition(SampleHeadVO.class,null);catch(java.lang.Exception e)e.printStackTrace();Return treeVOs;创建界面控制器类:树卡片型单据的界面控制器类应实现ISingleController和ITreeCardController接口。在这里需要强调一下几个方法:/*单据的增加删除时,是否自动维护树结构*/Public Boolean isAutoManageTree()Return true;Public String getBillVoName()Return new StringSampleVO.class.getName(),SampleHeadVO.class.getName(),SampleBodyVO.class.getName();Public Boolean isSingleDetail()Return true;在定义VO信息时,可以看到,主表VO和在数数据类中定义的是一致的。创建界面UI类:界面UI类应该继承BillTreeCardUI类,并重载下面的方法:/* *取得树的数据类 */Protected IVOTreeData createTreeData()Return new SampleTreeCardData();Protected ICardController createController()Return new SampleTreeCardController();上面几步就完成了一个标准的树卡片类型单据的制作。多子表的树卡片型单据:学会了多子表卡片型单据并结合上面的标准树卡片型单据的制作,制作多子表的树卡片型单据非常简单,构造业务代理类负责加载多页签,这与多子表卡片型单据相同,不同在于:1 需要构造树数据类,这与上面一节讲的完全相同。2 单据UI类需要继承MultiChildBillTreeCardUI类。3 单据控制器类需实现ITreeCardController和ISingleController接口并重载isSingleDetail,令其返回ture。单表的树卡片型单据:上面两个例子中,单据界面控制器类的isSingleDetail方法返回都是true,因此意味着对应每个表头数据,都需要加载对应的表体数据。如果单据没有表体,显然无需再加载表体数据,这种单据的制作只需要针对标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论