NC57开发知识点Checklist宝典_v03.doc_第1页
NC57开发知识点Checklist宝典_v03.doc_第2页
NC57开发知识点Checklist宝典_v03.doc_第3页
NC57开发知识点Checklist宝典_v03.doc_第4页
NC57开发知识点Checklist宝典_v03.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

开发知识点Checklist宝典 _)Y版本历史 1 其它 1.1 数据库开发工具的使用数据库:orcal开发工具:PL/SQL设计工具:PowerDesigner1.2 多语化相关1.2.1 多语化工具主要分为RESTOOLS 和Eclipse插件工具NCEDIT,RESTOOLS主要用来统计某个包下代码中需要做多语处理的资源,NCEDIT针对RESTOOLS统计出的资源逐个抽取代码中的多语信息,不需要做多语的可以点击每一行前面的小图标删除该行。1.2.2 正确的多语化处理流程首先使用RESTOOLS进行统计,代码资源收集选择包所在的目录,点确定就会统计分析出所有包含中文字符串的代码,然后在eclipse(前提是连上CC)中打开要处理的类,点击菜单项NC Edit使用NCEDIT进行抽取,功能节点如果没有做过多语,可以直接用NCEDIT进行处理,如果以前做过多语,可以在多语资源文件中直接进行添加,最后需要把所有的多语文件从resources目录下拷到lang文件夹中,才能做到安装盘当中。1.2.3 下拉菜单和模板的多语处理下菜单的多语处理需要手动进行,首先设置数据库表pd_dd中的字段RESID ,然后在相应节点的资源文件中加入该RESID对应的记录,最后用工具类DataDirectoryReader的setMultiLangRes方法来进行多语处理,该方法一般在getDataReader()中进行调用,可以根据不同参数来设置多语。多表体模板进行多语要设置pub_billtemplet_b表的resid和resid_tabname两个字段。1.2.4 实际项目中的代码示例m_repDlg = new ReplaceDlg(this, nc.ui.ml.NCLangRes.getInstance().getStrByID(50082010, UPP50082010-000140)实际运行时,将根据节点号和resid来查找相应的资源文件获取信息进行显示。1.3 项目问题处理1.3.1 搭建项目环境搭建项目环境时,首先通过CC下载代码到本地,然后在eclipse中新建一个Module项目,输入项目名称,然后在Location中选择“Create project at external location”点击浏览按钮选择代码存放的位置,输入module name点击完成按钮即可。可以创建项目之间的依赖关系,右击项目选择Build PathConfigure Build Path.,点击左侧的Java Build Path,在右侧的界面Project页签中点击Add按钮来添加该项目依赖的项目,然后在Order and Export页签中勾选上依赖的项目,并将该选项通过UP按钮移到上方,这样就可以优先访问依赖项目中的类。1.3.2 如何修改项目问题首先点击“Connect to Rational ClearCase”将项目连接上CC,然后右击要修改的代码类选择TeamCheck Out,选择分配的活动后即可对代码进行修改。1.3.3 如何提交修改结果修改完代码后,选择进行修改的代码类右击选择TeamCheck In即可提交修改结果,这样别人进行update之后就会看到更新结果。1.4 Eclipse使用相关1.4.1 代码跟踪与BUG排查技巧可以通过以下几种方式来实现代码跟踪:设置条件断点、变量断点、方法断点、异常断点,改变变量值,重新调试,远程调试。条件断点是设定了运行条件的断点,只有满足了用户设置的条件,代码才会运行到断点处停止,设置方法是右击断点选择“Breakpoint Properties”,其中Enabled属性指的是是否启用断点。Hit Count是指运行次数,主要用在循环语句中提高定位速度,Enable Condition里面输入条件。变量断点是针对变量设置的断点,初始化或者改变变量值时停止,变量断点上也可以设置运行条件,和前面条件断点的设置一样。方法断点将断点设置在方法的入口处,它可以打在 JDK源码里,可以通过这种方法查看方法的调用栈。设置异常断点后,当异常发生时代码会停在异常发生处,对异常定位比较有帮助。有两种方式可以改变变量值:在Debug 视图的 Variables窗口中右击要改变的变量,选择“Change Value.”在弹出的对话框中修改变量的值;在下面的值查看窗口中修改,然后Ctr+S 保存。此时,代码会按照修改后的值走流程,这样就可以避免某个分支一直进不去或者传递的参数不正确时可以按照正确的参数值走流程。重新调试的设置方法是右击需要回退的线程方法选择 “Drop to Frame”,此方法只能在当前线程的栈帧中回退,最多只能退回到当前线程的调用开始处,这样可以查看之前忽略的某些变量值等。远程调试(前提是服务器端和客户端的代码一致)用于调试不在本机上的程序, 主要由两种方式:本机作为客户端和本机作为服务端。本机作为客户端比较常用,主要包括三步需要启动服务器上的java程序时打开远程调试开关,需要加上虚拟机参数-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,连接远程服务器时需要在Eclipse中新建一个远程调试程序(右击Debug ConfigurationsRemote Java Application选择New),如下图: 本机作为服务器端,只是修改上面的参数Connection Type为Standard(Socket Listen),此时Eclipse会进入到等待连接的状态,连接程序使用参数-agentlib:jdwp=transport=dt_socket,suspend=y,address=服务器IP地址:8000即可连接本机服务器,远程调试时本地的代码修改可同步到远程,但不会写到远程的文件里,不会影响到下次使用时的远程代码。1.4.2 如何建立多套dataSource首先运行nchome的bin文件下面的ncSysConfig.bat文件,点击左侧Data Source的读取按钮即可读取已经配置好的数据源,此时可以点添加来创建新的数据源,输入数据库类型、数据源名称、访问数据库的IP地址、用户名和密码以及数据库和数据源OID标识等信息,然后在Eclipse中点击WindowPreferences下的MDE Development,在Data Source页签的DriverList列表中会看到配置的数据源,可以点击TestConnection来测试连接是否成功,也可以点击As Design按钮将当前数据源设置为默认的design数据源。1.4.3 补丁制作方法之前采取的方法是:右键要打补丁的类文件,选择ExportJava下的 JAR file,选择导出的文件及存放的路径,点击Finish完成。然后在本地创建modules文件夹,根据导出的模块在该文件夹下创建相应的子文件(如导出的补丁属于mm模块,则在modules下建mm文件夹),然后在模块文件夹下根据类文件的位置来创建classes(存放public包下的文件)、META_INF(存放private包下的文件)和client(存放client包下的文件)文件夹,在META_INF和client文件夹下创建classes文件夹来存放导出的JAR文件解压之后的nc文件夹下的内容,最后将整个modules文件拷贝至服务器的nchome下更新modules文件。现在采取的方法是:使用Eclipse的补丁插件来制作补丁,首先将补丁插件的jar包拷贝至Eclipse的plugins中,右击要打补丁的类文件选择ExportJava下的NC补丁安装盘,选择导出的文件及存放的路径,点击下一步填写问题描述,该描述会在补丁包中生成一个单独的文件存放在META_INF下,最后选择no generate the manifest file点击完成按钮即可。1.5 单据模板相关/ 表头支持编辑公式,初始化时用 cardPanel.setAutoExecHeadEditFormula(true);1.5.1 公式类型单据模板中涉及的公式有:编辑公式、显示公式、验证公式。与公式相关类有:1. nc.ui.pub.bill.BillFormulaUtil 与公式执行直接相关,只能在其所在包下使用。2. nc.ui.pub.bill.BillModelFormulaProcessor 对BillFormulaUtil的封装,为BillModel提供公式服务,只能在其所在包下使用。 3. nc.ui.pub.bill.BillModel 封装了BillModelFormulaProcessor,对外提供了一系列公式执行的方法。4. nc.ui.pub.bill.BillData 对外提供了一系列执行公式的方法,通过调用BillFormulaUtil或者封装BillModel实现的。所以:UI程序只能通过BillModel和BillData来操作公式。注:以下中onebyone表示公式数组顺序执行,如果后面的公式抛异常前面不回滚;非onebyone的表示公式数组一起批量执行,支持事务回滚,但会把公式直接显示到界面上。凡带load的都是显示公式,不带load的是编辑公式。一.BillModel1.execEditFormulaByKey(int row, String key) 执行某行某列的编辑后公式,无s,onebyone2.execEditFormulasByKey(int row, String key) 执行某行某列的编辑后公式,有s3.execFormula(int row, String formulas) 在某行执行公式数组(从界面取值),onebyone4.execFormulas(int row, String formulas) 在某行执行公式数组5.execFormulas(String formulas, int beginRow, int endRow) 从开始行到结束行执行公式数组6.execFormulas(String formulas) 在所有行执行公式数组,第5方法的扩展7.execEditFormulas(int row) 执行某行的编辑后公式8.execFormulasWithVO(CircularlyAccessibleValueObject VOs, String formulas) 执行公式数组,将结果直接赋给VO,不显示到界面,类型(数据对象 BillFormulaContext.FORMULATYPE_VO)9.execLoadFormula() 执行显示(加载)公式10.execLoadFormulaByRow(int row) 执行某行的显示(加载)公式11.execLoadFormulaByKey(String key) 执行某列的显示(加载)公式 onebyone12.execLoadFormulasByKey(String key) 执行某列的显示(加载)公式13.execValidateForumlas(String formulas, String itemkeys, int rows) 在某些行某些列执行验证公式数组 如果rows为空或者长度为0,则在所有行执行公式,否则在rows的所有列执行 如果formulas不为空并且长度大于0,则执行formula返回结果,否则继续 如果itemkeys为空或者长度为0,则rows的所有列执行模板公式 如果itemkeys有值则筛选有效的列,在rows执行模板公式二.BillData1.execBodyFormula(int row, String strkey) 执行子表BillModel的编辑后公式 调用BillModel的第4方法2.execBodyFormulas(int row, String formulas) 调用子表BillModel的第4方法3.execFormulaWithVOs(nc.vo.pub.CircularlyAccessibleValueObject VOs, String formulas, boolean isHeader) 执行公式,将结果直接赋给VO,不显示到界面 如果isHeader,则调用BillFormulaUtil.execFormulas(getBillCardPanel(), bfc, bc, formulas); 否则调用BillModel的第8方法4.execHeadFormula(String formula) 在表头和表尾执行公式,调用BillFormulaUtil.execFormulas(getBillCardPanel(), bfc, bc, formulas);5.execTailFormula(String formula) 同上6.execHeadFormulas(String formulas) 在表头表尾执行公式数组,调用BillFormulaUtil.execFormulas(getBillCardPanel(), bfc, bc, formulas);7.execTailFormulas(String formulas) 同上8.execHeadTailValidateFormulas(String formulas, String itemkeys) 在表头表尾执行公式数组,类型(验证 BillFormulaContext.FORMULATYPE_VALIDATE)9.execBodyValidateFormulas() 调用BillModel的execValidateForumlas(null, null, null),即执行模板子表的全部验证公式10.execValidateFormulas() 调用第8和第9方法三.扩展实现1.卡片界面主表执行模板显示公式 BillItem items = this.getCardPanel().getBillData().getHeadTailItems(); String formulas = BillUtil.getFormulas(items, IBillItem.LOAD); if (formulas != null) this.getCardPanel().getBillData().execHeadFormulas(formulas); 1.5.2 公式的使用一.编辑公式 卡片界面时,主表(表头)的编辑公式默认是不自动执行的,通过初始化界面时设置this.setAutoExecHeadEditFormula(true);自动执行。 子表(表体)的编辑公式是自动执行的。 编辑公式是在stopEditing时自动执行,也可以在afterEdit时手动执行(这样会执行两遍) 手动执行:this.execBodyFormula(crtRow, wlbm); 来自BillCardPanel的方法 参见 nc.ui.dm.dm3005.XsycCardPanel二.显示公式 显示公式全部手动调用,this.getHeadBillModel().execLoadFormula();三.验证公式 卡片界面时,可直接通过BillCardPanel获得BillData,直接调用BillData封装的方法。 该方法同时执行了头、身、脚的验证公式。 使用方式: if(!getBillData().execValidateFormulas() /如果执行结果返回false则业务上应该return return; 列表界面直接修改时,可参考BillData的代码 参考方式: int arrRows = selectrow; if(!this.getBillListPanel().getBillListData().getBodyBillModel().execValidateForumlas(null, null, arrRows) return IClose.SAVE_FAILURE_NOT_QUIT; 1.6 查询模板相关(nc.ui.mo.mo1020.QueryCondition)查询模板入口类:QueryConditionClient生产订单的查询界面:class QueryCondition extends QueryConditionClient implements ValueChangedListener1构造函数:public QueryCondition(Container parent, String factcode, DdVO dds) super(parent, 生产订单查询); this.m_factorycode = factcode; m_dds = dds;2 载入模板 setTempletID(getCorpVO().getPk_corp(), 50081020, getUser().getPrimaryKey(), null);3隐藏多单位按钮 hideUnitButton();4隐藏常用模板 hideNormal();5参照添加过滤:2法 可以通过查询模板的字段编码找到控件并进行添加、修改动作。以下mm_mo.pk_mtphase代表工艺阶段参照1)得到控件后添加 String calbodyWhere = and pk_calbody = + m_factory + ; Object obj = getValueRefObjectByFieldCode(mm_mo.pk_mtphase ); if(obj!=null) (UIRefPane)obj).getRefModel().addWherePart(calbodyWhere); 2)新建一个带过滤的参照覆盖掉模板上的 UIRefPane m_rfpphase = new UIRefPane(); m_rfpphase.setRefModel(new nc.ui.pd.mtpub.ref.PhaseRefModel(); m_rfpphase.getRefModel().addWherePart( and pd_mtphase.pk_calbody = + getFactoryCode() + ); setValueRef(mm_mo.pk_mtphase, m_rfpphase);/设置到界面上,进行覆盖 6. 下拉列表及多语:3法 1)得到控件后添加 Object o = getValueRefObjectByFieldCode(pickmb.sfkfl); if (o = null) return; UIComboBox cb = (UIComboBox) (nc.ui.bd.manage.UIRefCellEditor) o) .getComponent(); cb.removeAllItems(); cb.addItem(strAll); cb.addItem(Y); cb.addItem(N); 2)新建一个覆盖 UIComboBox m_cbbDdlx = new UIComboBox();(订单类型) m_cbbDdlx.addItem(getstrbyid(UPP50081020-000182)/* res全部 */); if (m_dds != null) for (int i = 0; i m_dds.length; i+) if (m_ddsi.getZdname().equals(ddlx) m_cbbDdlx.addItem(m_ddsi.getQzsm(); setValueRef(mm_mo.ddlx, m_cbbDdlx); 3)直接在查询模板中定义 7.设置默认值 setDefaultValue(mm_mo.jhkgrq, null, curDate);8.添加监听 getRfpDept().addValueChangedListener(this);9.初始化 QueryConditionVO vos = getConditionDatas(); if (vos != null) for (int i = 0; i = 0) printEnt.preview(); 注意:需要重写PrintDataInterface的getItemValuesByExpress(String itemExpress)方法功能是让自定义的item返回null,同时打印模板的非dataSource数据的行要设置固定行才能使loginuser(0)公式正确执行public java.lang.String getItemValuesByExpress(String itemExpress) if (null = getVO() return null; if (itemExpress.startsWith(h_) String sNewItemExpress= itemExpress.substring(2); return getHeaderItemValuesByExpress(sNewItemExpress); else if (isBodyItem(itemExpress) return getBodyItemValuesByExpress(itemExpress); return null;1.8 报表模板相关1.9 CC、CQ使用1.10 业务流及审批流业务流是对实际工厂中业务运转轨迹的一种信息抽取,也是对实际业务运转轨迹的一种数字描述。例如如何生成一条单据、如何生成下游单据等。审批流是对单据的审核流程,它与单据相辅相承,表现在单据状态的改变。审批流一般会有一个人为的签字审核过程,但有的单据审核不走审批流,这种情况在后台直接进行状态改变及一些引发的相应操作。2 前台2.1 状态控制2.1.1 按钮、界面状态控制/设定按钮状态 int states = new intIUIState.STATE_INIT, IUIState.STATE_LIST ; m_boQuery.setOprateStatus(states);/设定界面布局setLayout(new java.awt. CardLayout ();/切换按钮及界面状态setUIState(IUIState.STATE_INIT); 即可以控制哪些按钮可用,也可以切换界面。/按钮顺序 默认情况下按钮的顺序是自动排序,排序规则参见nc.ui.mm.pub.util.ButtonUtils. sortButtons(ButtonObject buttons),取消按钮自动排序,需重写MMToftPanel的isOrderButton()方法,让其返回false。public boolean isOrderButton() return false;/捆绑按钮boBillRowAction.setChildButtonGroup(new MMButtonObjectboAddLine, boDelLine, boInsert );2.1.2 菜单快捷键图2-1 按钮快捷键注册2.1.3 对话框按钮快捷键参看(nc.ui.mp.mp3010.ReplaceDlg)public UIButton getBtnStockDet() if(btnStockDet = null)btnStockDet = ButtonUtils.createButton(NCLangRes.getInstance().getStrByID(50043010, UPP50043010-000143)/*库存明细*/+(C);return btnStockDet;public UIButton getBtnModify() if(btnModify = null)btnModify = ButtonUtils.createButton(ButtonUtils.BTN_MODIFY);/修改return btnModify;2.2 参照的使用2.2.1 自定义参照自定义参照需继承AbstractRefModel,以下为生产订单参照nc.ui.mm.pub.pub1010. MoForWrModel/ 生产订单参照(参见nc.ui.mo.mo1030.WrEditPage) getRfpMo().setIsCustomDefined(true);/ 设置是否为自定义参照MoForWrModel moWrModel = new MoForWrModel(inlist);getRfpMo().setRefModel(moWrModel);getRfpMo().getRefModel().setWherePart(/过滤参照 where bd_produce.pk_calbody= + + gcbm + );2.2.2 使用参照(nc.ui.dm.dm1040.UIManager)nc.ui.pub.beans.UIRefPane refp = getEditionPanel().getRefpWlgl();refp.setPK(head.getWlglid();/ 图号head.setGraphid(String)refp.getRefValue(bd_invbasdoc.graphid);2.2.3 如何处理表体参照多选,并生成多条表体数据参见((nc.ui.dm.dm1040.EditionPanel))一、定义为支选多选UIRefPane refp = (UIRefPane)getCardPanel().getBodyItem(wlbm).getComponent();refp.setTreeGridNodeMultiSelected(true);refp.setMultiSelectedEnabled(true);refp.setMultiCorpRef(true);二、产生多行表体afterEdit(nc.ui.pub.bill.BillEditEvent e)if(e.getKey().equals(wlbm)refp = (UIRefPane)getCardPanel().getBodyItem(wlbm).getComponent();/得到三个重要的String pks = refp.getRefPKs();String codes = refp.getRefCodes();String bmmcs = refp.getRefNames();/得到其它的Object graphids = refp.getRefValues(bd_invbasdoc.graphid);int crtRow = e.getRow();for(int i=0; ipks.length; i+)if(i!=0)/增行onAddLine();crtRow = getCardPanel().getRowCount()-1;/设置BillModel model = getCardPanel().getBillModel();model.setValueAt(pksi,crtRow,wlglid);model.setValueAt(Object)graphids)i,crtRow,graphid);2.3 前台异常的处理 记录日志:ToftPanel .reportException(Exception e);对话框提示:MessageDialog. .showHintDlg(m_toft, null, getStrByID(请先输入行号);最下方提示:ToftPanel.showErrorMessage(数据锁定失败);2.4 精度处理2.4.1 单据模板精度处理参看:nc.ui.pd.pd4010.v5.BomCardPanel.initFormat()代码:BillItem.setDecimalDigits(m_toft.getScaleNum();此处的m_toft为MMToftPanel的子类,一般为各节点的ClientUI类。一般使用到了四个方法getScaleNum(主数量精度)、getScaleAssistNum(辅数量精度)、getScaleConvertionRate(换算率精度)、getScaleFactor(系数精度)2.4.2 参照框中的精度处理2.5 前台校验/首先,数据非空检测nc.ui.pub.bill.BillData.dataNotNullValidate()/其次,数据校验BomVO bom = getBomCard().getBomVO();verifyData(bom);包括校验:1) 必须校验项,如编码、名称不能为空(wlbmid = null)2) 主子表必须输入子项信息(表体非空)3) 数量关系校验4) 重复性校验(包括版本重复和子项重复等)5) 行号不为空校验6) 结构合理性校验(子项包涵主项)7) 互斥校验8) 唯一性校验(当录入时)2.6 远程调用的次数应该尽量少nc.ui.mm.pub.util. DefConfig.initDefVO()2.7 导出脚本工具的使用以“root”身份登录“系统管理帐套”,在“数据导出”节点选择要导出的类型。一般情况用“单据模板”、“查询模板”、“功能注册”、“按钮注册”和“快捷键注册”。选择好类型点进去,选择要导出的内容,点击“导出”。在C:Temp下可找到要导出的角本。角本前要加delete删除内容,并以go取代分号“;”。2.8 前台缓存private BomHeaderVO m_voMaterialInfo; /物料基本信息缓存private Hashtable m_htTd; /替代子项缓存/清空缓存if (m_htTd = null) m_htTd = new Hashtable(); else m_htTd.clear();从缓存中读取,若无则从数据库中读取数据,并将数据放入缓存2.9 前台增加事件监听2.9.1 对于参照监听1) 前台界面类必须实现接口ValueChangedListener(参照内容变化事件监听者必须实现的接口方法)2) 增加监听protected UIRefPane getRfpWlbm() return (UIRefPane) getCardPanel().getHeadItem(pk_produce).getComponent();getRfpWlbm().addValueChangedListener(this); 3) 处理事件public void valueChanged(ValueChangedEvent e) if (e.getSource().equals(getRfpWlbm() wlbmChanged();2.9.2 下拉列表监听getCbbDdlx().addItemListener(this);2.10 自定义项和自由项nc.ui.mo.mo1020.MOBillListPanel / 自定义项nc.ui.mm.pub.util.DefConfig defConf = new nc.ui.mm.pub.util.DefConfig(NCLangRes.getInstance().getStrByID(50081020, UPP50081020-000348)/*生产定单头*/, null);defConf.converListDefItems(this);/自由项处理nc.ui.mm.pub.freeitem.FreeItemUIUtilies.buildFreeForHeader(getCardPanel(), mvo.getParentVO();表头物料变化时调用此方法nc.ui.mm.pub.freeitem.FreeItemUIUtilies.buildFreeForHeadInvChange(this.getCardPanel();3 后台3.1 Upm配置文件定义如何新增接口,方法中不可重复命名。配置文件中CMT、BMT、NONE事务类型的使用场景。CMT主要用于容器管理事务,常用于持久化处理。BMT为Bean自身管理事务。NONE用于非事务性接口,例如查询等。Upm配置文件定义:在mm_zbzz_bmt.upm中定义IMMBalance的事务管理方式为BMT,在实现类MMBalanceImpl具体代码中进行事务管理,通过getUserTransaction().begin()来开启一个新事务,getUserTransaction().commit()来提交事务3.2 后台持久化、查询使用BaseDAO(参见nc.bs.dm.dm3005.XsycMgtDMO)BaseDAO dao = new BaseDAO();/查询dao.executeQuery(sql, new BeanListProcessor(XsycHeaderVO.class);/插入dao.insertVO(vo);/批量插入dao.insertVOArray(vos);/更新dao.executeUpdate(String sql, SQLParameter parameter);带参数的dao.updateVO(vo);/删除dao.deleteVO(vo);3.3 加锁、时间戳校验3.3.1 静态锁前台在删除和修改一个记录时先要对其进行加锁,有时也加在后台。增加记录不需加锁。操作完成后要主动释放该锁。有两个类用于管理锁:1)nc.bs.mm.pub.pub1025.MMLockBO2)nc.bs.uap.lock.PKLock注:1)包装了2)/加锁MMLockBO .lockPK()MMLockBO .lockPKs()PKLock.getInstance().acquireLock(pk, userid, mm_wr);/ 解锁MMLockBO .freePK()MMLockBO .freePKArray()PKLock.getInstance().releaseLock(pk, userid, mm_wr);3.3.2 动态锁加锁后会自动释放,无需主动释放。释放时机在远程调用接口结束时。引用nc.bs.mm.pub.pub1025.MMLockBO类的方法:1) lockDynamic(String lockKey) lockSilence(String lockKey) 主键加锁,返回true或false2) lockArrayDynamic(String lockKeys)批量主键加锁,返回true或false3) lock(String lockKey) 主键加锁,抛异常4) lockArray(String lockKeys) 主键批量加锁,抛异常3.3.3 时间戳校验时间戳即校验t

温馨提示

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

评论

0/150

提交评论