本科毕业论文-—产品手册优化平台的设计说明书.doc
设计题目: 产品手册优化平台的设计 Product manual optimization platformCollege: Computer and Information Science Specialty and Grade: Software Engineering , 2008 Number: 081181063 Name: GuangFeng Lin Advisor: ChangJiang Chen Submitted Time: May , 2012 福建农林大学本科毕业设计说明书毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。作 者 签 名: 日 期: 指导教师签名: 日期: 使用授权说明本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。作者签名: 日 期: 目 录摘 要IAbstractII1引言11.1目的和意义11.2主要设计内容11.3预期设计结果11.4拟解决的关键问题21.5使用术语22开发环境32.1硬件环境32.2软件环境33需求分析及系统设计43.1系统需求获取及总体功能43.2各项功能分析43.2.1主页43.2.2浏览53.2.3登入功能53.2.4提交问题功能63.2.5文档上传功能63.2.6文档管理功能73.2.7问题导出功能73.2.8问题管理功能84.数据库分析及设计94.1数据数需求分析94.2数据库设计95技术要点与难点115.1设计思想及分层结构115.2word转换成html125.3抓取word的文档结构135.4数据库动态配置136编码实现186.1主页的实现186.2浏览功能的实现246.3登入功能的实现276.4提交问题功能的实现286.5文档上传功能的实现336.6文档管理功能的实现40参考文献50致谢51III摘 要文档在工作中占有突出的地位,开发和维护文档有相当的大工作量。高效率地管理和维护文档对于转让,变更,修正,扩充和使用文档,对于充分发挥产品的效益有着重要意义。本设计提提供对文档的上传,管理,在线浏览,找茬管理等功能。系统的功能为文档手册的管理和修正提供的便利。关键词:文档手册;在线浏览;文档升级;AbstractDocument work has a prominent position and quite workload. High efficiency, high quality production, distribution, management and protect document for transfer dimension, change, fixed, expanded and use documentation, to give full play to the benefit of the product has important significance. The design provides the document put upload, management, the on-line browsing, find fault management etc. Function. The function of the system for the management of the manual and correction of the document provides convenience.Key words: Document manual; The on-line browsing; Document upgrade;II福建农林大学本科毕业设计说明书1 引言1.1 目的和意义软件文档1 (document)也称文件,通常指的是一些记录的数据 和数据媒体,它具有固定不变的形式,可被人和计算机阅读.它和计算机程序共同构成了能完成特定功能的计算机软件(有人把源程序也当作文档的一部分).我们知道,硬件产品和产品资料在整个生产过程中都是有形可见的,软件生产则有很大不同,文档本 身就是软件产品.没有文档的软件,不成其为软件,更谈不到软件 产品.软件文档的编制(documentation)在软件开发工作中占有突 出的地位和相当的工作量.高效率,高质量地开发,分发,管理和维 护文档对于转让,变更,修正,扩充和使用文档,对于充分发挥软件产品的效益有着重要意义. 然而,在实际工作中,文档在编制和使用中存在着许多问题,有待于解决.软件开发人员中较普遍地存在着对编制文档不感 兴趣的现象.从用户方面看,他们又常常抱怨:文档售价太高,文 档不够完整,文档编写得不好,文档已经陈旧或是文档太多,难于使用。本系统主要用来提高文档的质量和加强文档编写人员和使用人员的交流。方便文档的优化。 本系统需求明确、清晰,在开发方面将涉及UI设计、MySQL数据库2、格式转换、上传3下载等,从需求及技术上,本设计课题的提出是有意义且可行的。1.2 主要设计内容1) 主页模块:页面上展示所有管理员上传的文档,提供用户进行在线浏览和查找;2) 浏览模块:用户指定查看谋篇文档,并且支持定位和文档结构图功能;3) 登录模块:管理员登入模块;4) 找茬模块:用户通过该模块可以提出对该篇文档的建议和文档错误点;5) 文档上传模块:管理员通过该模块可以上传文档;6) 文档管理模块:用管理员通过该模块进行文档的管理;7) 问题导出模块:管理员通过该模块进行文档导出;8) 问题管理模块:管理员通过该模块管理用户提出的意见;1.3 预期设计结果通过MyEclipse开发工具,使用Ext作为前台的界面设计。采用自己封装的MVC设计思想。实现对数据库的封装。使用Ext3.2设计出简洁易用的界面。清晰明了的使用方法。可以让用户很容易就上手使用该系统。 1.4 拟解决的关键问题1) 页面兼容性4:浏览器兼容性问题又被称为网页兼容性或网站兼容性问题,指网页在各种浏览器上的显示效果可能不一致而产生浏览器和网页间的兼容问题。在网站的设计和制作中,做好浏览器兼容,才能够让网站在不同的浏览器下都正常显示。而对于浏览器软件的开发和设计,浏览器对标准的更好兼容能够给用户更好的使用体验。2) 文档上传问题:查找合适的工具实现文档的上传;3) 文档转换问题:为了编写方便,文档编写人员编写的文档都是word和excel格式,但是用户希望可以通过html的格式展示出来。4) 抓取文档结构图:为了更加方便的阅读,word文档中都有文档结构图。同时页面上也有一个文档结构图,方便定位;5) 程序稳定性5:程序稳定性是每个程序都需要考虑的问题,不能因为程序某一模块出错而造成整个程序的崩溃,因此需对程序异常进行捕获处理。1.5 使用术语表1-1 使用术语专业术语说明jacob它允许在java中调用com接口自动组件,实现文档转换SDK由该SDK开发公司提供的已封装好各项数据操作接口或方法的开发包UI人机交互界面htmlparser超高速解析html html用于描述网页文档的一种标记语言jspSmartUpload可免费使用的全功能的文件上传下载组件文档软件开发使用和维护中的必备资料Poi对Microsoft Office格式档案读和写的功能2 开发环境2.1 硬件环境表2-1 硬件环境硬件名称说明Thinkpad T410iIntel(R) core(TM)2 CPU T5200 1.6GHz 3.0G内存提供程序开发的硬件支持2.2 软件环境表 2-2 软件环境软件名称说明MyEclipse 6.5提供程序开发的IDE环境MySQL数据库Navicat for MySQLMySQL数据库的图形化管理工具IE,Firefox测试浏览器3 需求分析及系统设计3.1 系统需求获取及总体功能系统需求获取可从以下几个方面入手:1)用户查看文档;2)管理员上传和管理文档;3)用户提出bug。图3-1 系统总体功能图3.2 各项功能分析3.2.1 主页图3-2 用户浏览网页表3-2用户浏览网页说明模块名称功能说明主页模块71) 用户访问网站后进入网页主界面。2) 加载主页面必要的信息。3) 界面上分页显示可以浏览的文档。3.2.2 浏览图3-3用户浏览表3-3用户浏览功能说明模块名称功能说明用户浏览模块1) 用户查找到要浏览的文档后点击2) 跳转到新的页面单独加载该文档3) 并且提供对该文档的文档结构图4) 可以对该文档提出问题3.2.3 登入功能图3-4登入功能示意图 表3-4登入功能说明模块名称功能说明登入功能1) 管理员登入,进行文档管理3.2.4 提交问题功能图3-5找茬功能示意图表3-5找茬功能示说明模块名称功能说明提交问题功能1) 用户点击找茬按钮后跳出找茬框2) 填写必要的找茬信息,后可以点击提交保存3) 提示保存成功还是失败4) 后太保存茬信息,相应处理3.2.5 文档上传功能图3-6文档上传功能示意图 表3-6 文档上传功能说明模块名称功能说明文档上传功能1) 管理员选择要上传的文档,并且选择和填写必要的信息2) 点击上传3) 后天进行进行保存并解析4) 前台提示是否上传成功3.2.6 文档管理功能图3-7问题管理功能示意图表3-7 文档管理功能说明模块名称功能说明文档管理功能1) 点击进入文档管理2) 分页显示部分文档3) 管理员通过查询找到文档4) 可以对文档进行更新,删除等操作3.2.7 问题导出功能图3-8问题导出功能示意图 表3-8 问题导出表功能说明模块名称功能说明问题导出1) 管理员通过查询条件,查找到想要到问题2) 点击导出,可以导出问题3.2.8 问题管理功能图3-9问题管理功能示意图表3-9 问题管理功能说明模块名称功能说明问题管理功能1) 可以对问题进行管理2) 对问题进行归类。3) 问题处理后可以对问题进行标记,标记为已处理等4.数据库分析及设计4.1 数据数需求分析文档管理中需要保存的数据量并不大,要保存每次上传的文档信息,用户信息,管理员信息,问题信息,系统配置信息。4.2 数据库设计该系统采用的是MySQl数据库。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内。这样就增加了速度并提高了灵活性。MySQL的SQL“结构化查询”。SQL是用于访问数据库的最常用标准化语言。MySQL软件采用了GPL。由于其体积小、速度快、总体拥有成本低。对数据库的设计表结构如下:表4-1 admin 管理员表字段名字段说明类型长度是否可以为空ididlong18(主键)否name用户名varchar36否password密码varchar36否type管理员类型varchar36否表4-2 config_doc 文档信息字段名字段说明类型长度是否可以为空idIdlong18(主键)否name用户名varchar36否href显示页面varchar36否count点击次数varchar36否rate找茬次数varchar36否Property文档属性varchart36否type文档类型varchart36否size文档大小varchart36否down下载路径varchart36否preview文档简介varchart360否表4-3 document 文档具体信息字段名字段说明类型长度是否可以为空ididlong18(主键)否doc_id文档目录idvarchar10否text叶子文本varchar100否href锚机链接varchar100否isleaf是否是叶子varchart100否parent_id父亲idvarchart10否表4-4 user 用户信息字段名字段说明类型长度是否可以为空ididlong18(主键)否name用户名varchar30否email电子邮箱varchar100否time注册时间time100否count找出的茬数int10否表4-5 user 用户信息字段名字段说明类型长度是否可以为空ididlong18(主键)否name用户名varchar30否email电子邮箱varchar100否time注册时间time100否count找出的茬数int10否表4-6 systemdata系统信息字段名字段说明类型长度是否可以为空ididlong18(主键)否name名称varchar30否value名称对应值varchar100否type类型time100否表4-7 find_fault 错误表字段名字段说明类型长度是否可以为空ididlong18(主键)否admin_id处理管理员idint10否user_id提出问题用户idint10否document_id文档idint10否product_series产品类型varchart100否error_type问题类型varchart100否status问题状态varchart100否time提出时间time30否accept是否接受varchart10否solve_time解决时间time10是remarks标记varchart100是5 技术要点与难点5.1 设计思想及分层结构 本项目开发采用的是MVC的分层结构方法。MVC模式是一种复合设计模式,一种在特定场合用于解决某种实际问题来得出的可以反复实践的解决方案。巧合的是他也有三个事物组成,于是乎人们就有了一种想当然的对应关系:展示层-View;业务逻辑层-Control;持久层-Model。首先MVC中的三个事物之间并不存在明显的层次结构,没有明显的向下依赖关系,相反的,View和Model往往是比较独立的,而Control是连接两者的桥梁,他们更像是横向的切分。这样一来就出现一个结果,MVC中每个块都是可以独立测试的,而三层结构中,上层模块的运行测试势必要提供下层代码或者提供相同接口的桩。相对来说,MVC复杂得多,但是结构更清晰,耦合性更低。图5-1 代码结构分层主要分层的介绍:1. DB 对链接数据库的封装,主要实现数据库的链接和释放。2. filter 过滤器,主要进行权限管理。3. json 主要是进行对象封装成json或json转换成对象4. pojo 表对应的对象,有助于封装数据库。5. SystemData 系统初始化数据的获取,封装了界面上选项的动态配置6. Tool 工具层,提供各种工具类。可以进行快速开发,减少重复代码。7. dao 对象数据操作层5.2 word转换成html把word转换成html,在转换的过程中很容易造成格式发生变化的问题。我们看到word会看到word另存为中有转换成html的选项。因此最好是可以通过代码调动系统的word转换html的实现的方法。可以保证转换的结果是简洁的,不会有格式上的问题。上网查找,发现Jacob可能符合该要求。JACOB is a JAVA-COM Bridge that allows you to call COM Automation components from Java. It uses JNI to make native calls into the COM and Win32 libraries. The JACOB project started in 1999 and is being actively used by thousands of developers worldwide. As an open-source project, it has benefitted from the combined experience of these users, many of whom have made modifications to the code and submitted them back for inclusion in the project.上面官网介绍可知,jacob调用的就是本地安装的word,这样就要求服务器也要安装word,否则系统无法正常运行。5.3 抓取word的文档结构在浏览的时候用户肯定希望有文档的结构图,可以方便定位。可能想到的方案就两个:1. 直接解析word,获得文档结构图。2. 解析转换成html后的文件,在获得文档结构图。在方案2 中就需要对html进行解析的工具,网上提供的开源工具主要有一下几个,到时候可以根据需求进行筛选:1. htmlparser : HTML Parser is a Java library used to parse HTML in either a linear or nested fashion. Primarily used for transformation or extraction, it features filters, visitors, custom tags and easy to use JavaBeans. It is a fast, robust and well tested package.2. html4j: HTMLDoc is an encapsulation of an HTML document, with a simple permissive parser which can handle even most of the bad, non-compliant HTML documents of the real world.5.4 数据库动态配置为了方便对数据库的管理,把链接数据库的必要信息全部都写到配置文件中,后期对项目的发布有重大意义。可以方便管理员修改数据库的密码。package com.ruijie.DB;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;public class DBMessage private static String JDBC = "com.mysql.jdbc.Driver"private static String url = "jdbc:mysql:/localhost:3306/documentoptimization"private static String user = "root"private static String password = "root"/* * private static String JDBC;private static String url;private static String user;private static String password;*/static System.out.println("类初始化");InputStream in = DBMessage.class.getClassLoader().getResourceAsStream("db.properties");Properties pro = new Properties();try pro.load(in);JDBC = pro.getProperty("JDBC");url = pro.getProperty("url");user = pro.getProperty("user");password = pro.getProperty("password"); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); public static String getMessage(String key)System.out.println("key = " + key);String value = null;InputStream in = DBMessage.class.getClassLoader().getResourceAsStream("db.properties");Properties pro = new Properties();try pro.load(in);value = pro.getProperty(key); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();return value.trim();public static String getUser()if (DBMessage.user = null) DBMessage.user = getMessage("user");return DBMessage.user;public static String getPassword()if (DBMessage.password = null) DBMessage.password = getMessage("password");return DBMessage.password;public static String getJDBC()if (DBMessage.password = null) DBMessage.JDBC = getMessage("JDBC");return DBMessage.JDBC;public static String getUrl()if (DBMessage.url = null) DBMessage.url = getMessage("url");return DBMessage.url;public static Connection getConnection ()Connection connection = null;try Class.forName(getJDBC().newInstance();connection = DriverManager.getConnection(getUrl(), getUser(), getPassword(); catch (Exception e) connection = null;e.printStackTrace();return connection;/* * 关闭数据库 * param connection * param rreparedStatement * param resultSet */public static void closeAll(Connection connection, PreparedStatement rreparedStatement,ResultSet resultSet)try if (resultSet != null) resultSet.close();resultSet = null;if (rreparedStatement != null)rreparedStatement.close();rreparedStatement = null;if (connection != null) connection.close();connection = null; catch (SQLException e)e.printStackTrace();/* * 关闭数据库 * param connection * param rreparedStatement * param resultSet */public static void closeAll(Connection connection, Statement statement,ResultSet resultSet)try if (resultSet != null) resultSet.close();resultSet = null;if (statement != null)statement.close();statement = null;if (connection != null) connection.close();connection = null; catch (SQLException e)e.printStackTrace();public static void main(String args) InputStream in = DBMessage.class.getClassLoader().getResourceAsStream("db.properties");每次修改数据库的密码,只要对应修改配置文件db.properties就可以。而且对数据库的链接和释放都进行了必要的封装。6 编码实现6.1 主页的实现 图6-1 主页的实现效果图主要源代码:/*! * Ext JS Library 3.2.1 *定义主页整体布局 */FeedViewer = ;Ext.onReady(function() Ext.QuickTips.init(); / 针对应用程序配置默认的state provider Ext.state.Manager.setProvider(new Ext.state.SessionProvider(state: Ext.appState);/ 传入一个元素的值的参数,用于创建模板,(var tpl = Ext.Template.from('preview-tpl', /预览功能定义模板 compiled:true, getBody : function(v, all)/ 剥去所有脚本( )标签 return Ext.util.Format.stripScripts(v | all.description); ); FeedViewer.getTemplate = function() return tpl; FeedViewer.LinkInterceptor = render: function(p) p.body.on( 'mousedown': function(e, t) / try to intercept the easy way t.target = '_blank' , 'click': function(e, t) / if they tab + enter a link, need to do it old fashioned way if(String(t.target).toLowerCase() != '_blank') e.stopEvent(); window.open(t.href); , delegate:'a' ); ;/* * 初始化导航 和中间部分的面板 * 并且为导航面板绑定feedselect事件 */ var feeds = new FeedPanel();/主页左侧分类导航,在文件FeedPanel.js中定义 var mainPanel = new MainPanel();/主页中间两个表格部分,在文件MainPanel.js中定义/ feedselect定义于FeedPanel.js, 传递的参数是 feeds.on('feedselect', function(nodeAttributes)/为主页左侧导航选择绑定打开新标签页事件 mainPanel.openTab(nodeAttributes); ); /* * viewport对整个页面的整体布局 * 采用border 的布局方式 * north北 隐藏 无作用? * west 西feeds分类导航 * 中间mainPanel中间一大块面板 * east东公告和捷径 */ var viewport = new Ext.Viewport(/主页整体框架 layout:'border', item