




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
金蝶BOS快速开发指南Web开发平台目录1.概述31.1.简介31.2.产品功能31.3.产品特性31.4.定义、首字母缩写词和缩略语31.5.参考资料32.开发过程42.1.概述42.2.环境准备42.2.1.开发工具42.2.2.JDK约束42.3.开发规约42.4.WEB单据开发52.4.1.WEB单据开发过程52.4.2.框架内置服务202.4.3.WEB主菜单管理212.4.4.功能服务222.4.5.权限服务222.4.6.编码规则服务232.4.7.套打服务242.4.8.日志服务252.4.9.工作流服务262.4.10. 单据转换2. 概述2.单据关联生成282.4.11.字段权限服务2.设置支持字段权限2.启用字段权限2. 设置字段权限30. 字段权限302.5.集成EAS门户302.5.1.编制jsp页面302.5.2.配置portlet模板信息312.5.3.Portlet业务配置信息设置312.5.4.Portlet基础定义设置312.5.5.页签配置323.技术特性333.1.编程模型333.1.1.AOM333.1.2.数据校验333.1.3.数据绑定343.1.4.Ajax技术353.1.5.拦截器363.1.6.对象注入403.1.7.Winlet413.1.8.多语言处理453.1.9.多色彩方案463.1.10.应用上下文473.1.11.登录认证483.1.12.异常处理493.2.部署模型501. 概述1.1. 简介Web开发平台的核心职能类似GUI框架,是EAS Web产品开发的基础平台,跟GUI应用框架共用EAS Web服务端组件,协同BOS框架和业务模型(BIM)实现模型驱动架构(MDA)。它提供统一的业务开发模型,简化开发逻辑,形成一致的开发模式,最大限度实现代码的重用机制。Web开发平台作为业务逻辑的核心支撑平台,主要负责以下控制:l UI处理流程管理,如页面打开展现等;l UI通用处理,如RPC交互、数据绑定、异常处理、通用查询等;l 业务服务调用,如权限控制、BOTP、工作流等。Web开发平台与EAS BOS平台的关系:l Web开发平台是金蝶BOS平台的一个组成部分;l 跟GUI共用一套元数据模型和设计工具;l 跟GUI共用一个应用服务器;l 基于更先进的技术特性,如动态注入、IoVC、约定优先于配置等。1.2. 产品功能Web开发平台提供了业务开发的基类体系和界面模板库,以及集成了单点登录认证、权限管理、套打、BOTP、工作流、编码规则、网络互斥、日志及色彩方案等基本服务。1.3. 产品特性l 与GUI应用开发一致,减少学习成本l 支持业务建模与典型界面向导,快速开发业务单据l 提供GUI界面转换Web界面工具,快速完成Web应用迁移l 内嵌Apusic Web服务器,便于开发和测试l 支持热替换,发布元数据和修改代码不需要重启服务器l Web开发平台本身集成功能定义、工具栏、权限、日志、主菜单等功能,让业务开发的功能很容易使用这些通用服务进行协同工作,让业务功能集成和部署更加方便、轻松。1.4. 定义、首字母缩写词和缩略语l AOM:Apusic OperaMask,金蝶中间件公司的Web开发框架l AAS:Apusic Application Server:金蝶中间件公司的J2EE应用服务器产品l Ext JS:一套基于Java Script的浏览器端UI组件库1.5. 参考资料l 张留欢,Waf使用指南及规范.doc2008-6l 陈乐辉,Waf开发指南.doc,2008-8l 李大伟,贺鹏辉web开发帮助文档.doc2008-10l 张留欢,金蝶BOS Web开发平台.ppt,2008-11l EAS BOS V6.2Web设计器用户使用指南.doc2. 开发过程2.1. 概述基于Web开发平台开发业务系统,也是一个模型驱动的开发过程,下面以协同办公的费用报销系统为案例作为基础,实现从费用申请开始,到费用报销结束的一个业务过程,来介绍如何基于Web开发平台来做业务系统开发。2.2. 环境准备2.2.1. 开发工具下载地址:/download/aom_downloadApusic:Apusic Studio:Operamasks:/dist/aom_eas/Operamasks Demos:/dist/aom-demos/,其中rcdemos是AOM比较全面的控件示例,开发过程中必不可少的宝典之一。Web设计器:BOS Studio的一部分,请安装bos6.2及以后版本的Bos Studio即可.Ext:/deploy/dev/docs/AOM控件: /help/index.jsp2.2.2. JDK约束目前Waf必须基于jdk1.5及以上版本,所以开发时,必须先安装jdk1.5,在apusic工程使用编译时会报版本不一致的问题。因此不能w:jdk,而应该使用W:easServerjdk,如果这个还是有问题,到Sun的网站下载一个jdk1.5。注意:研发内网不能采用w:jdk,这个是被精简处理过的2.3. 开发规约Web开发平台对于view页面和对应的Bean的映射,采用“约定优先于配置”的原则,因此在建立Apusic标准工程的时候需要指定默认命名空间。以协同业务系统为例子说明这样一个命名原则:假定业务系统包名为com.kingdee.eas.cp.bc ,后台web目录为eas_web.war ,开发单据testBill。根据开发一个业务功能需要对应一个View页面和对应的后台Managed Bean,那么相应的命名规范:l View页面规范view页面取com.kingdee.eas之后的cp.bc报名生成目录.eas_web.warcpbctestBill.xhtmll 对应的Managed Bean命名规范对应com.kingdee.eas.cp.bc之后添加web作为bean存放包名:testBill对应的包名为com.kingdee.eas.cp.bc.web;ManagedBean对应的类名为:页面名称(首字母大写) + Bean; 例如testBill对应的ManagedBean全名为: com.kingdee.eas.cp.bc.web.TestBillBean。l Managed Bean别名规范别名的定义规范为:页面路径(路径分隔符号用.表示) + ManagedBean类名例如:testBill对应的别名为:cp.bc.TestBillBean因此,最终开发testBill功能生成的文件为下面2个:cpbctestBill.xhtmlManagedBean(name=cp.bc.TestBillBean)com.kingdee.eas.cp.bc.web.TestBillBean2.4. WEB单据开发2.4.1. WEB单据开发过程. 创建WEB单据1 在“业务单元”视图中,选择右键菜单,选择新建业务单元,如下图:2 弹出“创建业务单元”向导3 输入名称和别名。4 如下图选择“基础模板”和”客户端应用”注:目前业务单据只支持多分录单据基础模板;基础资料单据只支持单级基础资料模板5 点击【下一步】,直到完成,即可创建一个WEB单据,含编辑界面和序时簿 . GUI生成WEB UI1. 选中GUI单据,右键【配置业务单元】2. 导入已存在的WEB ui,或者选中自动生成,自动生成WEB UI3. 点击确定,GUI自动生成WEB UI . 调整布局. 工具栏1 模板自动生成工具栏,如图:2 工具栏上的各个按钮与相应的Action绑定,其中queryAction实现了通用过滤3 在业务单元-菜单定义,可以根据业务需要自定义工具栏查询1 模板自动提供通用过滤2 如图3 设置“查询”按钮的action服务端事件,以便处理查询逻辑.发布代码处理业务逻辑在“业务单元”视图中,选择需要发布代码的Web 单据(可以多选),弹出右键菜单,选择发布业务单元进入代码发布向导。如下图后台逻辑(ManageBean)实现序时簿界面后台一般从ListBean集成,列表界面的集成体系如下,列表界面(List Winlet)ManagedBean从ListBean继承,请实现如下方法:l getQueryPK()l getEditBeanName()l getEditUrl()l getBizInterface()1、 getQueryPK()要求返回查询当前列表数据结果的Query PK,例如:Overrideprotected IMetaDataPK getQueryPK() return new MetaDataPK(com.kingdee.eas.mydemo.app.PurReqQuery);2、 getEditBeanName()要求返回列表对象对应的编辑界面的ManagedBean的名称,例如:Overrideprotected String getEditBeanName() return mydemo.PurReqEditBean;3、 getEditUrl()要求返回列表对象对应的编辑界面的Url,例如:Overrideprotected String getEditUrl() return /mydemo/purReqEdit.jsf;4、 getBizInterface()类似编辑界面的同样接口实现。该业务接口的获取可以通过注入方式实现,例如:IBOSBizCtrlprivate IPurReq service;Overrideprotected ICoreBase getBizInterface() return service; 页面模板及组件模板l templates/list-templates.xhtml定义了列表界面的布局模板,业务单据的列表界面视图从此模板继承,并提供相应的模板内容实现。如何使用模板,请参考purOrderDemo的相关demo。组件l WEB-INF/components/billList-toolbar.xhtml封装了单据列表界面工具条部分的内容,提供了标准的操作按钮以及统一的Action绑定,相关业务使用此组件时只需设置组件的beanName属性即可。用法如下: l WEB-INF/components/baseList-toolbar.xhtml封装了基础资料列表界面工具条部分的内容,提供了标准的操作按钮以及统一的Action绑定,相关业务使用此组件时只需设置组件的beanName属性即可。用法如下:l WEB-INF/components/inner-window.xhtml封装了列表界面跟其他页面进行Ajax交互的载体,支持UIWindow的弹出框(适用于通用过滤等),也支持其他通过javascript脚本弹出的对话框或新窗口(例如编辑界面或BOTP转换界面等)。组件内容大概如下:用法如下:编辑界面的继承体系如下:编辑界面(Edit Winlet)ManagedBean从EditBean继承,请实现如下几个方法:l createNewModel:新增业务对象l getBizInterface:业务操作接口可选实现:l getSelectors1、createNewModel例如以采购申请单为例子,实现大概如下:Overridepublic void createNewModel() model = new PurReqInfo();(PurReqInfo)model).setState(PurType.InPut);2、getBizInterface该业务接口的获取可以通过注入方式实现,例如:IBOSBizCtrlprivate IPurReq service;Overrideprotected ICoreBase getBizInterface() return service;说明:IBOSBizCtrl标签 表示注入一个ICoreBase的业务接口,上面代码中,IPurReq extends ICoreBase。运行时,框架会自动根据产品部署形态配置,构造相应的业务接口并返回。上面的代码相当于下面的:Overrideprotected ICoreBase getBizInterface() try service = com.kingdee.eas.mydemo.PurReqFactory.getLocalInstance(WafContext.getInstance().getContext(); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();return service;3、getSelectors获取所选单据VO属性,子类可覆盖实现。例如:protected SelectorItemCollection getSelectors() SelectorItemCollection col = new SelectorItemCollection(); col.add(*); col.add(creator.*); col.add(requestor.*); col.add(entries.*); col.add(entries.material.*); col.add(entries.measureUnit.*); return col;除了上面两个必须实现的方法外,若单据含有分录,则需要在保存或提交之前对分录的VO做处理,可根据代码生成的注释说明对updateModel()补充实现。 页面模版和组件模板l templates/edit-templates.xhtml定义了编辑界面的布局模板,业务单据的编辑界面视图从此模板继承,并提供相应的模板内容实现。如何使用模板,请参考purOrderDemo的相关demo。组件l WEB-INF/components/billEdit-actions.xhtml封装了编辑界面下方按钮部分的内容,提供了标准的操作按钮以及统一的Action绑定,相关业务使用此组件时只需设置组件的beanName属性即可。用法如下: l WEB-INF/components/ billEntry-actions.xhtml封装了分录的基本操作以及统一的Action绑定,相关业务使用此组件时只需设置组件的beanName属性即可。用法如下: l WEB-INF/components/ billEdit-toolbar.xhtml封装了单据与其他单据相关常用功能的操作及Action绑定,例如上一个单据、下一个单据、单据转换等,相关业务使用此组件时只需设置组件的beanName属性即可。用法如下:2.4.2. 框架内置服务l Web主菜单管理在Web框架主菜单树中添加菜单项,指向WebU单据l 功能定义功能与WebUI的Action进行绑定l 权限定义权限项与实体方法、WebUI的Action进行绑定l 编码规则生成单据编码,在WebUI中显示l 套打自动生成WebUI的套打格式l 日志添加WebUI相关功能的日志项,对用户操作进行记录l 工作流工作流节点能指定显示的WebUIl 单据转换与GUI一样,WebUI可通过下推和上拉等功能使用单据转换l 字段权限支持配置字段的修改权,查看权l 网络互斥目前框架已经实现了数据互斥,避免避免同时修改同一张单据。l 色彩方案目前支持蓝、绿、红、橙四种色彩方案,默认蓝色;支持扩展(增加相应的色彩方案目录结构)2.4.3. WEB主菜单管理1.BOS工具,方案-主菜单管理,设置业务单元级别的WEB菜单2.EAS,系统-客户化菜单编辑,菜单类型选择”WEB菜单”,设置WEB UI级别的菜单2.4.4. 功能服务业务单元-功能定义,根据业务需要,增加自定义功能2.4.5. 权限服务方案-权限管理,设置WEB单据权限2.4.6. 编码规则服务. 定义编码规则编码规则的定义需要注意相关规约:不允许断号和新增显示必须选择其中一个,如果都不选,表示该规则不起作用。【新增显示】表示改规则在新增时就自动生成;【不允许断号】表示新增时不用输入,而在保存和提交时自动产生然后框架自动保存到数据库。. 应用编码规则Web框架默认已经集成了编码规则服务,只要给单据定义了编码规则,在单据编辑界面提交就能应用编码规则服务。2.4.7. 套打服务. 生成套打模板发布业务单元过程中,自动生成套打模板. 套打2.4.8. 日志服务. 定义日志方案-日志管理,定义WEB日志. 日志2.4.9. 工作流服务. 定义工作流在BOS IDE里对工作流进行流程配置。. 提交工作流Web框架默认已经集成了工作流服务,只要给单据定义了工作流,在单据编辑界面提交就能应用工作流服务。. 工作流审批l Web审批处理界面:l 节点流程图2.4.10. 单据转换. 概述单据的生成有两种方式:手工录入和单据转换生成。单据转换指的是上游单据根据配置好的规则,自动转换生成下游单据。根据案例,上游单据费用申请单已经开发完成了,根据上面【序时簿开发】和【单据开发】的方法,可以完成案例的下游单据费用报销单的序时簿和单据开发。定义单据转换规则登录GUI系统平台中,可以定义相关单据的转换规则。.单据关联生成在序时簿中点击【关联生成】按钮生成下游单据,也可以在下游单据编辑界面通过【上拉】的操作生成单据并显示到当前页面。关联生成的单据可以通过单据上下联查查询出来。2.4.11.字段权限服务.设置支持字段权限选中字段,属性: 是否支持字段权限 是.启用字段权限EAS,打开用户管理,业务-字段权限设置,启用字段权限. 设置字段权限EAS,打开用户管理,分配权限-字段授权,设置字段的查看权,修改权. 字段权限销售员,显示无权限;销售组织,灰掉2.5. 集成EAS门户2.5.1. 编制jsp页面在目录serverdeployeas.earcp_web.warhtmlportlet新建一个目录,并在新建目录下创建一个jsp文件。内容为: 注:src=./easweb/cp/index.jsf就指向portlet的内容页。2.5.2. 配置portlet模板信息打开文件serverdeployeas.earcp_web.warWEB-INF portlets.xml添加内容如下:43协同办公viewportlet.cp_index2.5.3. Portlet业务配置信息设置打开文件serverdeployeas.earcp_web.warWEB-INFtiles-defs.xml添加内容如下:2.5.4. Portlet基础定义设置通过上述配置后,还需要通过EAS管理控制台执行如下脚本,在数据库中插入一条记录,sql语句如下:Insert Into T_Portal_Portlet(FID,FCreatorID,FCreateTime,FLastUpdateUserID,FLastUpdateTime,FControlUnitID,FPortletDefineId,FPortletName_L1,FPortletName_L2,FPortletName_L3,FEnable,FPortletNumber,FDescription_L1,FDescription_L2,FDescription_L3)Values(newbosid(0B344890),00000000-0000-0000-0000-00000000000013B7DE7F,ts2005-11-07 14:01:53,00000000-0000-0000-0000-00000000000013B7DE7F,ts2005-11-07 14:01:53,00000000-0000-0000-0000-000000000000CCE7AED4,N43,NULL,N协同办公,N协同办公,1,PN-43,NULL, N协同办公, N协同办公);注意事项:重点关注红色的部分,红色部分需要修改为上述配置文件中对应的值。蓝色部分会导致每次执行sql语句都会产生新id,如果作为脚本提交,请记得改为一个确定的ID值,且一定要支持可重复升级。繁体字段一定要是繁体的值,否则和语言不匹配。FPortletNumber字段的值一定要和portlets.xml中定义的值保持一致。2.5.5. 页签配置进行上述操作之后,还需要重新启动EAS服务器,才能进行页签配置。先进入“Portlet管理”查看先前建立的Portlet是否已经存在,如果不存在则上述操作存在问题,需要检查确认。确定已经存在后,到系统页签中建立对应的页签,配置上对应的Portlet,然后发布,退出系统,重新登陆即可看见对应的页签,其中便会展示对应Portlet的内容。3. 技术特性3.1. 编程模型3.1.1. AOM. 整体架构图. JSF规范AOM完整实现了JSF1.2规范,同时,对JSF1.2规范做了大量扩充,主要有AJAX支持、IoVC编程模型、组件无状态、单一的Renderer等方面。. Ext JSExt js是一个功能强大、稳定的javascript类库,AOM前端使用Ext js来渲染。. Facelets视图模型Facelets是一种表现层/视图技术,提供了一个强有力的模板化系统,可以使用HTML样式的模板来定义JSF的表现层,减少了组件整合进表现层时候冗余的代码,而不需要一个web容器。Facelets提供了以下主要的特性: l 模板化布局(类似Tiles):使用模板化布局的特性,可以实现UI复用;l 复合组件支持,可实现业务组件的复用;l 显式支持EL(可以在页面的任何地方书写EL表达式);l 无需编译处理(这一点与JSP有本质区别);l 自定义方式执行组件,对UI设计人员友好(JSFC);3.1.2. 数据校验JSF规范提供了校验器和转换器机制,可以使用通用的机制完成校验和转换,并提供基于配置方式的扩展。由于JSF是面向组件的,并不存在类似FormBean之类的值对象,基于转换器和校验器的机制只能够完成对单个表单输入域的验证,这仍然不能满足某些业务场景的需求,如:输入的email地址的域名,必须符合所选则的子公司的域名。在这种场景下,我们需要获取整个表单的值对象进行校验。另外,为了改善用户体验和考虑性能问题,在应用系统中还存在客户端校验的需求。基于以上的考虑,通用数据校验和转换,分为三个层次,如下图。更多的详细资料参考:/articles/magic-3/html_single. 面向组件的客户端校验Web开发平台提供了基于Validator生成客户端Validator的机制,但客户端的表现行为需自行实现。客户端校验的发生在客户端,发生时机是Form提交时,如果校验不通过,则不会提交From,不产生服务器端交互。. 面向组件的Validator与ConverterAOM提供了常规的校验器与转换器的默认实现,且表现形式可自行扩展。Converter的getAsObject行为发生在ApplyRequestValues阶段,getAsText的行为发生在RenderResponse阶段。Validator的行为发生在服务器端的ProcessValidations阶段。. 面向数据的校验与转换由于JSF的校验和转换是针对组件进行的,校验器和转换器在发生作用的时候,只能获取到单个组件的值,而此时,数据还未被绑定到ManagedBean,因此,在校验器和转换器中无法完成面向数据的校验与转换。这种情况下,可以在服务端的Action中进行校验和转换的逻辑。. Validator与Converter的扩展与复用在Web开发平台中,可以简单通过标注方式定义自己的Validator与Converter,无需维护配置文件。3.1.3. 数据绑定JSF体系本身提供了完善的数据绑定功能,不需要类似GUI的loadFields及storeFields等自己处理。对于一些特定类型的属性绑定,框架提供常用的Converter处理,包括IObjectValueConverter、BOSUUidConverter、DataTimeConverter等。 l 支持EL表达式;l 可以绑定简单数据类型(string, int, float等);l 可以通过数据类型转换器绑定复杂数据类型(任意数据类型);l 支持表格、F7、枚举的数据绑定; 表格绑定 F7绑定 枚举绑定3.1.4. Ajax技术l 原生的Ajax支持,容器级别,对用户透明;l 异步调用,局部刷新l Web框架提供了Ajax请求处理机制由于客户端脚本ajax调用一个jsf页面,返回的内容强制包含AOM处理产生的一些脚本引用等。所以需要在请求jsf返回值前后加上一些标记,便于返回后对结果处理。l Ajax请求代码:function ajaxReq() Ext.Ajax.request( method:GET, url:/ear3/http/ajaxResponse.faces, success : function(response, request) var retValue = decodeResponse(response.responseText);eval(retValue);/alert(response.responseText);, failure : function(response, request) alert(response.responseText); ); function decodeResponse(resString) var begin = resString.indexOf(BEGIN_RET);var end = resString.indexOf(END_RET);return resString.substring(begin + 11, end);l 服务端响应代码ManagedBean(name=http.ajaxResponseBean, scope=ManagedBeanScope.REQUEST)public class AjaxResponseBean PostConstructpublic void init() System.out.println(request response.);FacesContext ctx = FacesContext.getCurrentInstance();try ServletResponse resp = (ServletResponse) ctx.getExternalContext().getResponse(); if (resp instanceof HttpServletResponse) HttpServletResponse httpResp = (HttpServletResponse) resp; if (!httpResp.isCommitted() httpResp.reset(); httpResp.setContentType(text/javascript; charset=UTF-8);httpResp.setStatus(HttpServletResponse.SC_OK);Writer w = httpResp.getWriter();String resString = alert(this is a test script!);w.write(encodeResponse(resString);w.flush(); catch (IOException ex) ex.printStackTrace(); finally ctx.responseComplete(); private String encodeResponse(String resString) return BEGIN_RET + resString + END_RET;3.1.5. 拦截器. 业务需求边界用户日志/用户监控/权限检查等业务服务,要求在UI层具有非直接耦合的服务绑定机制。. JSF生命周期拦截JSF的六个生命周期:标准JSF提供了PhaseListener机制,对JSF的六个生命周期进行通知。通过对JSF的生命周期拦截,可以实现业务意义的生命周期划分,进而实现对URL拦截等特性。下表描述了JSF生命周期对比业务语义生命周期的关系。Phase ID业务语义RESTORE_VIEWOpen PageAPPLY_REQUEST_VALUES可自行定义业务语义PROCESS_VALIDATIONS可自行定义业务语义UPDATE_MODEL_VALUES可自行定义业务语义INVOKE_APPLICATION可自行定义业务语义RENDER_RESPONSEPage loadAOM针对PhaseListener提供了简化机制,可以直接在ManagedBean的方法上标注BeforePhase、AfterPhase即认为是实现了PhaseListener。并默认提供了BeforeRender与AfterRender特定生命周期的两个标记。基于以上特性的支持,应用框架可以通过增加RESTORE_VIEW阶段的PhaseListener来扩展实现对URL的拦截;对于页面的生命周期,建议无需使用框架的继承体系,业务开发者可以自行在ManagedBean的方法上标注BeforeRender以及AfterRener标注来实现对视图生命周期的拦截。典型应用场景. WebAction拦
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- ncd管理暂行办法大额可转让
- 延迟退休教师管理办法
- 平安银行申诉管理办法
- 安徽省软件管理暂行办法
- 工程封存文件管理办法
- 安监局应急资金管理办法
- 国内物流文员培训
- 医院安全保卫培训
- 商品索证索票制度
- 保险公司合法管理办法
- 第22章 相似形 单元检测题2023-2024学年沪科版数学九年级上册
- 血管内超声IVUS简介
- DL∕T 5344-2018 电力光纤通信工程验收规范
- DL∕T 2528-2022 电力储能基本术语
- 山东财经大学《大学英语》2022-2023学年期末试卷
- 2024年歌尔股份有限公司校园招聘考试试题完美版
- peskin量子场论课后答案(芝加哥大学版)
- 医院专家工作站合作协议书
- 2023年河北语文高考试题
- 2023年禁毒工作全年工作总结
- 【精】部编版语文五年级下册第三单元《遨游汉字王国》阅读专项练(含答案)
评论
0/150
提交评论