毕业论文录音录像管理平台的设计与实现【最终稿】_第1页
毕业论文录音录像管理平台的设计与实现【最终稿】_第2页
毕业论文录音录像管理平台的设计与实现【最终稿】_第3页
毕业论文录音录像管理平台的设计与实现【最终稿】_第4页
毕业论文录音录像管理平台的设计与实现【最终稿】_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、ZHEJIANG University of Water Resources and Electric Power毕业设计(论文)题目:录音录像管理平台的设计与实现 系(部):信息工程与艺术设计学院专业班级:软件技术12-1姓 名:学 号:指导教师:指导教师:迄止时间:2014年 11月 14日 2015年 05月30日2015 年 04 月 24 日目 录引言21. 系统概述21.1 系统功能21.2 系统开发环境32. 系统分析(详见附录3)33. 数据库设计53.1 数据库选择53.2 数据库详细设计53.3 数据库的安全性54. 系统设计64.1 系统总体设计64.1.1 系统结构图1

2、14.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 影像接口报文21附录3 设计文档21附录4 运维手册21引言继上海银监发布【2013】140号文件后,2014年7月中国银监会北京监管局文

3、件,京银监发【2014】132号关于印发商业银行产品销售录音录像工作指引的通知,通知要求北京区域各分支机构进一步加强理财产品销售流程和管理规范的文件要求,各分支机构在销售理财产品尤其是高风险(如代销类)产品时必须进行风险揭示及录音录像1. 系统概述1.1 系统功能本系统主要完成以下功能(详见附件1)Ø 录音管理(1) 录音统计(2) 录音记录Ø 视频管理(1)视频记录Ø 话机设置(1)来电铃音(2)答录提示音(3)话机设备(4)录音提示音(5)话机绑定信息(6)通话配置(7)通话白名单Ø 传输配置(1) 中转站设置(2) IP段设置(3) IP限流设置&

4、#216; 系统配置(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 server20081。2

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

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

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

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

9、s其实对这一方面有了很大的补救,但是我们希望有自己的思想融入,比如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 ZeroMQ), the sma

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

13、vironments. 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 MQ's API, sockets, and patterns. Learn how to use specific A MQ programming techniques, build multithreaded applications, and create your own messaging

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

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

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

17、们在was上部署的上下文根为banger,也就是我们公司的英文缩写,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-pe

19、rmission:Banger-product-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:Bange

20、r-esb:Banger-extra-interface: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接口,b

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

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

23、硬件,它采用的是Dephi语言编写的一套系统,目前托盘版本已升级到版本,较过去版本有了明显的提升,当客户端拨号时,调用的是我们的一套封装好的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模板,那么我

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

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

27、核采用mediaPlayer,外皮用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+Struts

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

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

30、例的。Struts2和市面上的基本都相同,只是我们业务复杂性不同,所以我们在拦截器以及项目管理上可能用的较为频繁。我想重点介绍的是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之后编译是稳稳的

34、通过的,但是在maven2.0的时候竟然神器般的无法通过,我们单纯从此类来说,肯定不存在java语法错误,但是我们可以想象,maven是怎么管理这些类的,maven是传递性的,我们通常会看到很多项目里引入这个jar包,那么如果两个项目是同时执行,isRoot这个方法最初是在一个父类上,其中某个子类继承了某些方法,有一个类调用了父类和子类,isRoot就陷入了深渊,我得按照加载顺序来判断isRoot到底是true还是false,答案不得而知,而解决办法是,写个setRoot方法即可,子类就等于是说重写了父类的方法,那么其他类调用时只会加载子类重写后的方法,而不会在此去调用父类的setRoot(),这里也用了java的懒惰加载机制。窗体顶端:在这里,需要着重说明的是,JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。关于虚拟机默认的双亲委派机制,我们可以从系统类加载器和标准扩展类加载器为例作简单分析。窗体底端:在这里,需要着重说明的是,JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载

温馨提示

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

评论

0/150

提交评论