录音录像管理平台的设计与实现毕业论文.doc

上传人:文库蛋蛋多 文档编号:3943251 上传时间:2023-03-28 格式:DOC 页数:22 大小:625.50KB
返回 下载 相关 举报
录音录像管理平台的设计与实现毕业论文.doc_第1页
第1页 / 共22页
录音录像管理平台的设计与实现毕业论文.doc_第2页
第2页 / 共22页
录音录像管理平台的设计与实现毕业论文.doc_第3页
第3页 / 共22页
录音录像管理平台的设计与实现毕业论文.doc_第4页
第4页 / 共22页
录音录像管理平台的设计与实现毕业论文.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《录音录像管理平台的设计与实现毕业论文.doc》由会员分享,可在线阅读,更多相关《录音录像管理平台的设计与实现毕业论文.doc(22页珍藏版)》请在三一办公上搜索。

1、 ZHEJIANG University of Water Resources and Electric Power毕业设计(论文)题目: 录音录像管理平台的设计与实现 系(部): 信息工程与艺术设计学院 专业班级: 软件技术 12-1 姓 名: 刘鑫 学 号: 201238016 指导教师: 朱胜伟 (校外) 指导教师: 王红霞 (校内) 迄止时间:2014年 11月 14日 2015年 05月30日2015 年 04 月 24 日录音录像管理平台设计说明书作者:刘鑫指导教师:王红霞目 录引言21. 系统概述21.1 系统功能21.2 系统开发环境32. 系统分析(详见附录3)33. 数据库

2、设计53.1 数据库选择53.2 数据库详细设计53.3 数据库的安全性54. 系统设计64.1 系统总体设计64.1.1 系统结构图114.1.2 系统模块124.2 前台系统实现124.3 界面展示134.3.1 用户登陆134.3.2 主界面134.3.3 录音记录144.3.4 视频记录144.3.5 铃音配置154.3.6 通话白名单154.3.7 中转站设置164.3.8 IP 段设置164.3.9 IP限流设置164.3.10 话机升级174.3.11 流量监控174.4后台系统实现175. 运行维护手册186. 设计总结评价18参考文献20附录21附录1 系统需求21附录2 影

3、像接口报文21附录3 设计文档21附录4 运维手册21引言继上海银监发布【2013】140号文件后,2014年7月中国银监会北京监管局文件,京银监发【2014】132号关于印发商业银行产品销售录音录像工作指引的通知,通知要求北京区域各分支机构进一步加强理财产品销售流程和管理规范的文件要求,各分支机构在销售理财产品尤其是高风险(如代销类)产品时必须进行风险揭示及录音录像1. 系统概述1.1 系统功能本系统主要完成以下功能(详见附件1) 录音管理(1) 录音统计(2) 录音记录 视频管理(1)视频记录 话机设置(1)来电铃音(2)答录提示音(3)话机设备(4)录音提示音(5)话机绑定信息(6)通话

4、配置(7)通话白名单 传输配置(1) 中转站设置(2) IP段设置(3) IP限流设置 系统配置(1) 话机升级(2) 系统升级(3) 修改密码 系统监控(1) 流量监控 影像上传(1) 上传影像(2) 定时器 影像调用(1) esb传输(2) extra接口(3) ECM影像平台 托盘(1) 一键安装(2) 通信协议(3) 话机交互(4) USB传输(5) http长连接1.2 系统开发环境本软件管理系统采用的开发环境与开发语言为Eclipse/IDEA、vmcssjQuery,后台语言采用java,托盘采用的DEPHI,使用的数据库为ORACLE/DB2,服务器为linux/Windows

5、 server20081。2. 系统分析(详见附录3)我们针对需求画了一幅设计分析图,该图清晰展现出我们整个平台的大致结构图2-1 概要设计图图2-2 去电流程图图2-3 来电流程图3. 数据库设计3.1 数据库选择本系统所采用的数据库是ORACLE/DB28,103.2 数据库详细设计数据库设计文档请参照附件2的数据库设计文档。3.3 数据库的安全性数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄漏、更改或破坏。在数据库系统中,大量的数据集中存放,同时又为许多用户直接共享,是宝贵的信息资源,因此系统的安全保护措施就显得更为重要。键全的数据库安全机制可以防止数据库被恶意的破坏和非法

6、的存取。本系统平台安全性设计在数据库设计上就以体现,我们将每个页面当成一个请求,每个菜单按钮配置在数据库,当你登录时,我们会检查当前用户的级别,你的级别取决于你能看到多少东西,可以发起什么请求,可以看到什么页面,那么,即使你非法登录进我们的系统,可是该用户并非有权限查看我们的系统,那么你看到的也许是一片空白,这算不算是一个惊喜呢,总之,我们对安全性做了一系列的处理,在此不一一赘述8,10。4. 系统设计对话机和系统配置后,我们最关键的就是要将得到的录音录像记录上传到服务器,并且我们还将真正的影像上传至影像平台,我们会实时的对上传的影像进行监控。4.1 系统总体设计 本系统采用的前端框架为vel

7、ocity/JQuery/CSS/JSONP我们封装的JS/bootStrap,Velocity是一个基于Java的模板引擎,它可以独立产生源代码、HTML和报告,也可以与其他系统(或应用)相结合提供模板服务1,4,5,7。之前有考虑过有freemaker,由于freemaker在性能上没有velocity的好,所以最终还是采用了velocity作为我们系统的前端框架1,6。在开发前端的时候,我们封装了一套前端框架,该套框架里JS处在核心地位,我们借助bootStrap框架,对JS进行了二度封装,就像JQuery,Ajax那样,他的最终都是JS代码,但是他的功能却远远超出了JS,我们在进行一系

8、列操作的时候,经常会遇到JS跨域问题,JS缓存问题,AJAX请求问题,回调问题,我们开发出一套策略,如,JSONP。该策略在你引用JS时可以帮你注册一个命名空间,以至于不会再出现JS跨域无法调用,以及调用多次等烦恼,当然还有一系列功能,在此便不再一一赘述1,4,5,6,7。我们的后台框架用了Spring,Struts2,但是我们与数据库交互的并不是ibatis,我们研究了ibatis的原理后,自己写了一套类ibatis,在此称为ibatis like,简称为libatis,不管是持久层,还是数据层来说,这个框架我们最终目的希望是方便于程序员的,而hibernate注重的是效率,对程序员其实并没

9、有太大帮助,我们发现ibatis其实对这一方面有了很大的补救,但是我们希望有自己的思想融入,比如link操作,我们很希望查询语句,或者其他DDL语句而已被在此调用,就和面向对象一样,这样对程序员来说无非是个福音,所以我们对ibatis进行了改进,开发出了一套libatis。以前遇到的数据层框架总是支持某种,或某一种数据库语言,这就使得不同程序员之间写SQL语句时都要统一某一种数据库语言,比如ORACLE的,MySQL的,甚至DB2的语法不尽相同,但是这让程序员很是头疼,在此我们在系统开发出了这样一套策略,不管任何程序员,只要你的SQL语句能在任何一个主流的数据库语言上顺利执行通过,那么任何主流

10、的数据库都支持你的语句,甚至还可以link过来,这就为开发节省了许多不必要的麻烦,在之后的更换数据库操作时,只需要把数据库指向和数据库地址更改即可2,9,10。我们系统经常会和其他系统对接,例如:CRM系统,个贷系统等等。那么我们系统之间是通过什么方式进行数据交换的呢,很多人会想到数据表,对,之前我们是通过中间库的形式进行数据交互的,但是我们发现,当连续对接3个系统以上,库的空间就会很大,造成许多资源浪费现象,于是,我们采用了当下流行的一种形式,ESB传输。在面向SOA的架构与应用中,服务是基本的开发与管理对象。采用面向服务的架构方法,就是为了利用服务这一企业IT资产,灵活而快速地满足不断变化

11、的业务需求。为了保证服务的有效使用,增加服务的重用度和利用率,就必须建立统一的服务规范。服务规范包括服务的定义与确立,服务的封装,服务的开发,服务的应用,服务的管理等各个环节进行规范性约定2。我们针对ESB传输写了一套接口,对方只需调用我们的webservice即可,我们会返回消息头以及消息,报文详见附录2。我们系统上传影像时并不是直接上传到服务器,而是上传到影像平台,我们在ECM模块里对录音记录,录像记录等影像记录封装成一个实体,我们上传时只需将这个实体内的影像进行上传即可。我们将话机内的录音以及录制的录像上传到服务器的时候,我们采用了ZMQ技术3。Dive into A MQ (aka Z

12、eroMQ), the smart socket library that gives you fast, easy, message-based concurrency for your applications. With this quick-paced guide, youll learn hands-on how to use this scalable, lightweight, and highly flexible networking tool for exchanging messages among clusters, the cloud, and other multi

13、-system environments. A MQ maintainer Pieter Hintjens takes you on a tour of real-world applications, using extended examples in C to help you work with A MQs API, sockets, and patterns. Learn how to use specific A MQ programming techniques, build multithreaded applications, and create your own mess

14、aging architectures. Youll discover how A MQ works with several programming languages and most operating systems - with little or no cost. Learn A MQs main patterns: request-reply, publish-subscribe, and pipeline Work with A MQ sockets and patterns by building several small applications Explore adva

15、nced uses of A MQs request-reply pattern through working examples Build reliable request-reply patterns that keep working when code or hardware fails Extend A MQs core pub-sub patterns for performance, reliability, state distribution, and monitoring Learn techniques for building a distributed archit

16、ecture with A MQ Discover whats required to build a general-purpose framework for distributed applications3。当然我们还使用了ZMQ中间件技术,我们的托盘在读取话机内的未上传录音时,会调用服务端的ZMQ接口进行上传,我们将文件封装为消息队列开始上传,在托盘的日志里将会看到上传行为的日志,上传后,在我们的服务端日志里也能看到上传信息。我们在本地开发使用的是tomcat,而在服务器上部署的是jndi配置,也就是用的是websphere,以下简称was,我们在was上部署的上下文根为banger

17、,也就是我们公司的英文缩写,was是 IBM 的软件平台。它包含了编写、监视运行全天候的工业强度应变 Web 应用程序和跨产品、跨平台解决方案所需要的整个中间件基础设施,如服务器、服务和工具。was提供了可靠、健壮和灵活的软件。我们在解决JS跨域的时候使用了JSONP模式,采用该种模式可有效解决JS跨域问题。JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题4。在服务器选择方面,我们用了服务器集群模式,在连接方面,我们采用了连接池技术,但是我们并没有完全采用连接包,我们重写了某些方面,比如释放等问题,在普通的连接池上并不是很明

18、显。我们的定时器采用的quartz,quartz可以有效的触发定时任务,通过简单的配置文件,对时间和定时任务的配置,quartz就能在配置的时间启动该任务。我们有以下模块:Banger-framework-core:Banger-framework-component:Banger-framework-dao:Banger-framework-sql:Banger-framework-util:Banger-framework-web:Banger-product-core:Banger-product-monitor:Banger-product-permission:Banger-prod

19、uct-permissionIntf:Banger-biz-config:Banger-biz-configIntf:Banger-biz-desktop:Banger-biz-ecm:Banger-biz-ecmIntf:Banger-biz-generate:Banger-biz-system:Banger-biz-systemIntf:Banger-biz-talk:Banger-biz-talkIntf:Banger-biz-video:Banger-biz-videoIntf:Banger-common:Bannger-domain:Banger-esb:Banger-extra-i

20、nterface:Banger-jsbc:Banger-tools-setup:Banger-tools-test:Banger-web:所有以banger-framework-开头的都是我们系统封装的框架,利用系统模板以及sql操作等等,所有以banger-biz-开头的都是在页面里能够直接展现的模块,banger-common属于通用模块,banger-domain存着我们的业务实体,banger-esb用于esb通信传输,banger-extra-interface属于我们开放的接口,banger-jsbc属于江苏银行的webservice接口,banger-tools只是针对单元测试而

21、使用的,banger-web里都是前端的封装。我们每个模块都会有一个intf,这是用于外界调用的接口,我们用spring进行配置,他们并不能直接访问我们的类,只能调用接口,我们在实现模块里由action,service,dao以及webservice组成,并且还会有一个sqlMAP,sqlMAP的作用是将sql语句配置为ID,给dao调用,我们读取SQLID就能执行该条sql语句。我们管理系统日志采用的是log4j技术,它是一个非常强大的日志记录软件。我们在读取xml文件时采用的是dom4j技术,它用来读取xml非常方便,推荐大家可以去试一试。在项目jar包管理工具上面,我们采用的是maven

22、帮我们管理着仓库包,只要理清依赖关系,用maven真的是一个不错的选择,至少我是这么认为的,使用maven可以有效的管理jar包,这得归功于apache这些年所做的一些事,maven就是其中一件,我在此用pom文件将各个项目之间调用配置好。我们服务端大致就是开发了这些,接下来我们可以说说客户端的托盘都进行了哪些开发:首先我们在话机设计之初就制定了一套话机通信协议,很抱歉,由于专利性,该协议不予公开,敬请谅解,话机通过USB与电脑连接,我们针对USB开发了专门用于话机与电脑USB口通信的协议,我们的托盘会自动捕获话机的行为,例如拨号,我们的托盘可以直接操作硬件,它采用的是Dephi语言编写的一套

23、系统,目前托盘版本已升级到2.0.0.1版本,较过去版本有了明显的提升,当客户端拨号时,调用的是我们的一套封装好的JS,该JS文件可以提供源码,但不可用于公网传播,谢谢合作,我们在实际操作中会用到拨号,接听,录像等一些功能,只要触发了这些事件,回调里就会通知托盘,我们在此用了http长连接技术,http是无状态的,每次任务结束就中断链接,由于通话会随时发生,我们必须建立这样的连接来保持一直进行通信,这样就能确保第一时间对通话做出反应。4.1.1 系统结构图 login.vmdeskTop.vm数据库 查询记录L 增加记录 删除记录 。 托盘 图4-1 系统结构图从系统的功能分析以及设计文档可以

24、画出系统结构图,分别从系统的录音管理,视频管理,话机设置,传输配置,系统配置,系统监控,上传影像,影像调用,托盘等几个模块加以描述。4.1.2 系统模块参照系统功能设计文档4.2 前台系统实现前台系统采用了bootStrap,以及jQuery,CSS,Velocity等框架与技术,考虑到银行机子受IE6的限制性,我们原本采用html5的念头也已撤销,我们对bootstrap进行重写以及改进,性能和效率以及一些功能的实现上更高效,我们在处理jQuery对象时并不会用$去取对象,原因很简单,我们经常会和其他系统做对接,很多系统自己封装了一套jQuery模板,那么我们在用$取jQuery对象时往往会

25、出现冲突,我们自定了一些符号用来请求,我们在处理ajax请求时使用了jsonp技术,因为我们经常会跨域进行异步提交,举个简单的例子,我在主页面上弹出一个非模态的窗口,我在非模态窗口中插入一条数据,那么在另一个模态窗口里就会更新当前的列表,并且不会刷新多余的空间,那么ajax本身是没办法进行提交请求了,因为不在同一个模态窗口中,JS本身做不到请求交互,所以我们引用了jsonp技术,解决了跨域问题,前台与托盘之间要进行实时通信,我们都知道,http是无状态的,什么是无状态,就是你要主动触发,它就执行,执行完就断开,但是这样就造成一个困扰,对托盘的回调不起作用,比如通话来了,托盘在回调里通知http

26、应该响应,但是http这时是关闭状态,它并不知道你请求了它,所以在此我们引入了http长连接技术,这样http一直都处在连接状态,能随时接收回调函数里的请求,不过,这其中可能会涉及到安全性的问题,在此,我想说明一下,这个系统运行环境纯粹是在内网中进行的,所以安全性暂时可以不加考虑1,4,5,6,7。我们在前端还需要涉及到播放的功能,那么我们得写个播放器,用后台写有几个劣势,第一个,就是加载速度过慢。还有就是当多个客户端同时请求播放时,服务端是否能接受的了并发性,这受制于客户的运行环境,所以我们最终还是采用了前端播放的方式,我用js封装了一套前端音视频播放器,内核采用mediaPlayer,外皮

27、用js封装1,5,6。4.3 界面展示4.3.1 用户登陆图4-3 用户登陆图4.3.2 主界面图4-4 主界面图4.3.3 录音记录图4-5 录音记录图4.3.4 视频记录图4-6 视频记录图4.3.5 铃音配置图4-7 铃音配置图4.3.6 通话白名单图4-8 通话白名单图4.3.7 中转站设置图4-9 中转站设置图4.3.8 IP 段设置 图4-10 IP段设置图4.3.9 IP限流设置 图4-11 IP限流设置4.3.10 话机升级图4-12 话机升级图4.3.11 流量监控图4-13 流量监控图 4.4后台系统实现后台系统采用Spring+Struts2+ibatis like+DB

28、2/ORACLE等等,后台又分为设计与编码,设计阶段,我们根据需求说明书(详见附件1)整理出设计文档(详见附件3),再将表以及索引,存储过程进行建立,我们的模块是配置级的,也就是代码分工比较清晰,我们有一个Domain模块专门用来存放实体以及注入实体字段的sqlMap,我们只需注入到pom文件即可,那么我们比较简单的做法是自己写一个代码生成器,将某几张表映射到该模块代码中,包括之后的dao,service我们可以采用这种方式来生成,省去开发时间,我们会将更多的工作放在action和webservice上,应为这个是与业务息息相关的,当然最难的工作还是在表的设计上,我们在满足范式的同时,又需要进

29、行优化,表设计的好,在之后的开发中编码量会大大的降低,我们对每一个会被外界(其他系统)调用到的模块生成一个接口,其他系统只需调用接口即可,那么我们经常会遇到两个或两个以上的模块进行一个或多个功能的实现,我们的spring配置文件应该写在哪,很多人一般都会直接写在某个模块下,反正最终能调用到,但是这并不没有解耦,反而是增加了模块之间的复杂关系,我们一般采用的做法是用IOC反向注入原则,通过反向注入将其他模块的功能变成一个接口化的调用,这样就能大大降低耦合性。我们的dao和service都是单例模式的,初始时只被调用一次,只有action和webservice不是单例的。Struts2和市面上的基

30、本都相同,只是我们业务复杂性不同,所以我们在拦截器以及项目管理上可能用的较为频繁。我想重点介绍的是ibatis like + DB2/ORACLE,为什么我要把数据库和ibatis放在一起讲呢,可能有人会说ibatis本身就是处理数据库与java交换数据的,但是你只说对了一半,至于ibatis like是如何得名,这得益于linux,在早期时候,linux被称为Unix like,废话不多说,我们都知道现在ibatis流行程序已经远远大于hibernate,这又是什么原因,hibernate是持久层框架,说白了,它是为用户做准备的,而ibatis是访问层框架,这是为程序员做准备的,一个方便于用

31、户,一个方便于程序员,在开发人员看来,对于现在的设备,网络来说,这是微不足道的,而省去的开发成本是所有人都期望看到的,我们对ibatis进行了一些重写,重写后兼容了市面上流行的一些SQL,如oracle,db2,mysql等,只要开发人员会其中一门SQL,那么你就能进行开发,并且不需要兼容性调试,只要你的sql能在一个sql平台上运行,那么基本所有主流的sql平台都能执行,这是我们封装这套ibatis的核心技术,还有一些例如link功能,比如,我这条sql想用之前查过的,插入的,更新的一些数据,可以link过来进行复合查询8,10。5. 运行维护手册详见附录46. 设计总结评价 在做这个项目的

32、时候,当中遇到了一些问题,比如oracle在9.6版本之前遇到一个时间处理问题,比如系统时间是2015年5月10号,我们在今天插入了很多数据,结果因为某些原因我重启了服务器,服务器的时间被初始化了,那么服务器的时间成为2011年1月1日08:00:00,oracle在查今天插入的记录时发现查询不到,这是为什么呢,后来经过我们的研究发现,原来oracle在9.6版本之前有个查询条件,即where INSERT_TIME=LOCAL_TIME,但是我们在查询的时候加上模式,就查出来了,这又是为什么呢,原来,oracle数据库软件在查询的时候一定会拼接上自己的条件,如果是模式,那么就忽略时间,如果没

33、有模式,那么就会加上时间进行处理,至于这个问题我们是怎么解决的呢?俗话说,办法总比问题多,问题定位到了,就不难了,所以,我们有许许多多的解决办法,比如,升级数据库版本,但是这种方式并不是所有人员和设备都希望配合的,但是我们有一个原则,那就是发现问题决不能以补洞的方式一直让问题存在,只是去弥补它,所以我们将服务器的时间改回来,在错误的时间里产生的所有记录时间全部给改回来,从这之后这个问题就不算问题了9。当然我们还遇到其他形形色色的问题,比如,boolean isRoot ;isRoot = true/false,这样的语法在maven2.0之后编译是稳稳的通过的,但是在maven2.0的时候竟然

34、神器般的无法通过,我们单纯从此类来说,肯定不存在java语法错误,但是我们可以想象,maven是怎么管理这些类的,maven是传递性的,我们通常会看到很多项目里引入这个jar包,那么如果两个项目是同时执行,isRoot这个方法最初是在一个父类上,其中某个子类继承了某些方法,有一个类调用了父类和子类,isRoot就陷入了深渊,我得按照加载顺序来判断isRoot到底是true还是false,答案不得而知,而解决办法是,写个setRoot方法即可,子类就等于是说重写了父类的方法,那么其他类调用时只会加载子类重写后的方法,而不会在此去调用父类的setRoot(),这里也用了java的懒惰加载机制。窗体

35、顶端:在这里,需要着重说明的是,JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。关于虚拟机默认的双亲委派机制,我们可以从系统类加载器和标准扩展类加载器为例作简单分析。窗体底端:在这里,需要着重说明的是,JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载

36、任务时,才自己去加载。关于虚拟机默认的双亲委派机制,我们可以从系统类加载器和标准扩展类加载器为例作简单分析。我们还遇到了一些问题,比如:通话时由于网络信号等一些原因,我们托盘会收到两次请求,那么库中就会生成两条记录,这样是不符合业务的,那么我们的解决办法只有一种,那就是将两条数据进行合并。设计该系统总体来说可以称得上较为完美。虽然存在着许多不足,但在这个系统里我学到了很多知识,这在学校里或者培训机构里是远远接触不到的。我很感谢实习期,公司教给我的这些,在这里我想说的是,我学到了一些不一样的思想。我觉得学到里和公司里学习最大的区别在于是否存在着依赖学习的思想,比如在学校里,老师布置一个任务,你永

37、远等着下一堂课老师讲的,对自己的想法没有自信,而公司里不一样,交给你一个任务,也许别人也没接触过,或者他们很忙,没时间搭理你,你只有自己去钻研,去深究,才能把东西做好,在做好一个东西的同时,你能学到的将是这个成果所带来的两倍,于是我得出一个结论,目的不在于看到成果,想完成一个功能很简单,而重要的是这个成果你从不会到会真正能够衍生出多少为什么,而当你真正解决了这么多为什么的时候,实际上,你已经掌握了更多。由于时间匆忙,这个项目并没有实现太多的功能性,而重在了技术性,论文报告也没有写出心中完美的感觉,只是粗略了介绍了该项目,不过,这些技术确实是我所掌握的,所以,我还是比较满意自己的这个毕业设计的。

38、最后,我感谢阅读我论文的老师以及所有读者们,也希望你们能够做出一个中肯的评价。参考文献1 李晓黎Velocity网页程序设计J北京:人民邮电出版社.2011。2 许晓斌.Maven实战J.北京:机械工业出版社.20113 Pieter Hintjens英.ZeroMQJ .UK:OReilly Media.2013。4JSONP.5 于海鹏;张旭阳. 基于web的应用系统前端页面性能优化J.福建:电子工业出版社,2012。6 夏素霞. 谈谈web设计中的优化方法J.北京:机械工业出版社,2002。7 曾海. Javascript程序设计基础教程J.北京:人民邮电出版社,2001。8 谭怀远.让oracle跑的更快2M.北京:电子工业出版社.2011。9 贝让加.iBATIS实战J.北京:人民邮电出版社.2008。10 徐明伟,王涛.DB2数据库管理最佳实践J.北京:电子工业出版社.2011附录附录1 系统需求附录2 影像接口报文附录3 设计文档1)概要设计文档2)详细设计文档附录4 运维手册

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号