《《数字化智能评估系统》需求说明书.docx》由会员分享,可在线阅读,更多相关《《数字化智能评估系统》需求说明书.docx(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、优质文本?数字化智能评估系统?需求说明书路璐2016/10/12一、 目的编写详细设计说明书是软件开发过程必不可少的局部,其目的是为了使开发人员在完成概要设计说明书的根底上完成概要设计规定的各项模块的具体实现的设计工作。二、 软件总体设计1、 软件需求概括本软件采用传统的软件开发生命周期的方法,采用自顶向下,逐步求精的结构化的软件设计方法。本软件主要有以下几方面的功能:创立管理知识库;创立管理风评工程;工程评分与上传;评分结果汇总和导出;账号管理和权限控制。定义本工程定义为一个风险评估软件。它将实现知识库的创立、工程的评分和评分汇总整个风险评分流程的功能。2、 需求概述l 基于MongoDB的
2、数据的持久化存储;l 知识库满足上传文件导入和后台直接编辑修改的需求;l 权限职责划分清晰,用户管理完善;l 汇总统计结果能进行评分筛选和工程筛选。3、 条件与限制系统开发的条件是普通PC以及相对应的系统,本次程序server端所用的系统是WINDOW SERVER2003。Client端需要win7及以上的64位处理器的环境。4 、技术架构效劳端:本系统效劳端基于node进行开发,使用express作为后端框架,使用MongoDB数据库进行数据的持久化存储。Node.js 是一个基于Chrome V8引擎的JavaScript运行环境。Node.js使用了一个事件驱动、非阻塞式I/O的模型,
3、轻量而高效。Express 是一个基于 Node.js 平台的极简、灵活的开源后端开发框架。有丰富的 HTTP 快捷方法和任意排列组合的 Connect 中间件,能快速构建简洁、健壮的API。MongoDB是一个开源的基于分布式文件存储的数据库。由 C+ 语言编写。是目前最流行的非关系型数据库。拥有稳定、高效、可拓展等诸多特性。客户端:本系统客户端采用React+ Flux架构,并使用Electron打包为多平台桌面应用。Electron是流行的跨平台应用开发平台,基于Node.js和Chromium。操作系统支持情况如下:l MacOS:10.9及以上,64位处理器;l Windows:wi
4、n7及以上,32位及64位处理器;l Linux:ubuntu 12.04及以上;Fedora 21及以上;Debian 8及以上;l MacOS:10.9及以上,64位处理器;l Windows:win7及以上,32位及64位处理器;l Linux:ubuntu 12.04及以上;Fedora 21及以上;Debian 8及以上。ReactReact是 Facebook 推出的一个用来构建用户界面的 JavaScript 库。实现了单向响应的数据流以及组件化开发。从而减少了重复代码。Flux是facebook推出的应用程序架构库。适用于复杂应用的开发。5、模块功能逻辑关系系统详细的模块信息所
5、示:本系统采用C/S架构。客户端client由知识库编辑模块、专家评分模块、账号管理模块和汇总统计模块组成;效劳端server由业务模块、数据库模块组成。6、设计和描述本软件的主要功能是依据知识库实现工程评分和结果的汇总导出。三、 软件功能描述1、 登陆功能流程描述使用本软件需要首先进行登陆操作,输入项为用户名和密码,账号信息的验证在后端进行,将验证结果返回客户端后,客户端执行相应操作。在本系统中,用户名可以看做是唯一标识,不同用户之间的用户名不可重复。但是在客户端与后台进行交互通信时,使用的是用户账号的uid来进行的。2、账号管理功能流程描述本软件账号系统为封闭性,只能通过管理员操作进行用户
6、管理。在用户管理界面,管理员可以进行用户的创立、修改和删除操作。在用户执行修改操作时,即使对用户名进行了修改,该用户与其评分的关联仍然存在如果该用户为专家用户。删除用户后并不会删除该用户提交过的评分数据。3、知识库创立操作本软件中知识库的创立时非常重要的工作,知识库是所有功能和操作的根底。在知识库管理界面可以点击创立按钮建立新的知识库,知识库的指标数据可通过规定格式的csv文件上传导入,也可以手动编写。需保证所有指标的权重之和为100才能通过数据验证并在server端保存。此外还需要填写等级描述和元信息。点击知识库列表项即可进入知识库修改的界面,进行修改后不会保存为新的知识库记录而是覆盖原有的
7、知识库记录。4、 风险评分工程创立操作流程评分工程的创立在工程管理界面进行,工程名为必填项,密码为选填项,工程名并不是唯一标识。工程在删除之后,不会影响该工程收到的评分,但是会同时删除该工程之前获得评分的统计结果。5、工程配置在创立完工程后还需要进行工程配置工作。首先要选择唯一的知识库与工程相关联,知识库与工程的关联是一对多的关联,即可能多个工程公用一个知识库。此外还需要上传定量指标的预处理得分,上传完后点击开启评分的开关按钮即完成工程配置工作。6、工程评分操作流程在创立好工程后专家即可对工程开始评分。在进入评分界面时,如果工程设有密码需要对工程密码进行验证操作,在对工程评分时,只有填写完所有
8、的评分项才能进行提交或者对结果进行汇总查看。专家可以在评分结束后直接上传评分结果,也可以在汇总统计界面确认统计结果后再提交结果。7、工程评分汇总查看操作流程在收到专家评分后,管理员和工程管理可在工程界面对工程评分的所有结果进行汇总查看,同时可以筛选专家评分和工程对统计结果进行筛选修改。筛选专家能修改本次评分分数,筛选工程能对排行榜和图表的结果产生影响。四、 接口设计1、人机接口本系统的人机接口即用web制作的人机交互界面。在封装打包成可执行应用程序之后,用户能够在pc端翻开运行。因为web的交互友好性,用户能够方便的通过鼠标键盘进行操作。此外本程序对原生点击和滑动事件进行了优化,对弹出层和提示
9、层等UI组件进行了优化。在UI 和布局上使用了Material设计,以React为视图层框架进行开发。2、内部接口本程序客户端与后台之间通过RESTFUL API进行通信,完成数据存储和调用。主要api接口如下:接口名请求类型功能返回类型getProjectListPOST获取所有工程列表ArraysaveProejctPOST保存工程ObjectupdateProjectPOST更新工程数据ObjectsaveLibPOST保存知识库ObjectupdateLibPOST更新知识库ObjectdeleteLibPOST删除知识库ObjectgetLibsPOST获取所有知识库数据ArrayL
10、oginPOST登陆ObjectsaveUserPOST创立用户ObjectdeleteUserPOST删除用户Object3、平安与稳定出错输出信息本程序在运行出错时会通过弹出框的方式对用户进行提醒,同时记录日志,后台程序运行故障时会自动重启。最大可能保证程序的稳定性。程序视图层有错误提示交互组件,配个后台api返回信息进行错误提醒。平安性:本应用从防止SQL注入、XSS、CSRF三个方面来保证应用平安性。SQL注入 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地
11、过滤用户输入的数据,致使非法数据侵入系统。根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不平安的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:l 不当的类型处理;l 不平安的数据库配置;l 不合理的查询集处理;l 不当的错误处理;l 转义字符处理不适宜;l 多个提交处理不当。本程序采取的措施如下: l 对用户的输入进行校验,通过正那么表达式,限制长度,对单引号和双-进行转换等,防止在输入环节嵌入恶意代码。l 不使用动态拼装sql,本次采用参数化的sql进行数据查询存取
12、。l 不使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。l 不直接存放机密信息,对关键信息进行加密,hash掉密码和敏感的信息。l 应用的异常信息应该给出简短提示,对错误信息进行了自定义封装。l 检查Referer字段 HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Refere字段应和请求的地址位于同一域名下。l 添加校验token 由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址。可维护性:本应用以下面几个方面来控制代码的可维护性。可理解性:其他人可以接手代码并理解它的意图,无需原开发人员花太多时间解释
13、。可读性性:代码中可以让人快速上手,尽管其操作过程复杂。可适应性:代码以一种数据上的变化不要求完全重写方法。可扩展性:在代码架构上可对核心功能的扩展。可调式性:出错时,代码可以给你足够的信息来直接确定问题所在。函数和方法 :描述其目的和参数代表,返回值等。Hack :因各浏览器的差异,javascript的hack用于解决的问题进行描述。 变量和函数的命名变量名以名词开始:如car,person函数名以动词开始:如getName(),返回布尔类型值的函数一般以is开头,如: isEnable();此外,本程序在开发过程中保持松散耦合原那么:l 解耦HTML/JavaScript 在web应用中
14、,html专注于展示数据,css专注于样式,javascript专注于行为交互;l 解耦CSS/Javascript在现代web应用中常常需要javascript来更改样式,我们采用修改CSS类名的方式来控制样式的改变;l 解耦应用逻辑和事件处理程序。五、系统说明硬件环境:CPUP3 800 MHz 以上,建议P4 1.8GHz内存 256 MB以上,建议512MB显卡 标准VGA,24位真彩色 其它 键盘、鼠标、网卡、能连通互联网。软件环境:Windows2000及以上;编程语言:开发: nodejs 和 javascript;打包编译:electron;源程序量:8000行。主要功能和技术
15、特点:行业风险动态评估系统是针对行业的风险而开发的一款动态评估软件,是国内首个智能风评系统,主要效劳于多个行业的量化风险评估、风险点跟踪监测、执行方案决策。1、模块说明本系统主要由四个功能模块组成:专家评分模块,知识库管理模块,工程管理模块,用户管理模块。专家评分模块主要功能是进行工程评分,专家在选择一个待评工程进入后通过勾选选项的方式对该工程的定性指标进行评分,评分结束后可以查看汇总结果和进行提交。知识库管理模块负责知识库的创立、修改和删除。知识库创立的时候可以上传CSV文件导入知识库;已保存知识库在进行修改时会覆盖原有的知识库。工程管理模块负责工程的创立、删除以及工程评分流程的控制。工程创
16、立的时可以选设密码;工程创立后需要选择知识库和上传定量指标结果,并勾选开启评分,之后专家方可对该工程进行评分和提交操作。再汇总统计中对结果进行保存之前方可开启下一轮平分。用户管理模块负责用户账号的创立和修改删除。该系统为封闭系统。账号完全由管理员后台创立。在账号创立后可以对其用户名、权限和密码进行修改。2、权限说明本系统登陆账号有三种权限角色:管理员、工程管理和专家。管理员在本系统中没有功能限制,能够访问所有的功能模块。工程管理在本系统中可以访问知识库管理模块和工程管理模块。专家在本系统中仅可以访问专家评分模块。六、操作说明1、知识库管理操作在本系统的业务流程中,知识库的创立是最初始的操作。进
17、入知识库管理模块后会看到一个知识库管理的按钮和已经创立的知识库的列表。新建用户点击按钮可创立新的知识库,点击知识库可进入相应知识库的编辑页面。填写、删除知识库在进入创立知识库页面后,会看到如下界面。知识库由四局部组成:定量指标、定性指标、评级描述和元信息根底信息,每一局部都有单独的编辑区域。点击长传指标,可以上传准备好的定量指标和定性指标数据。在编辑页面下方是保存和删除按钮。2、工程管理操作在知识库创立完毕后,可以在工程管理界面进行工程的创立和配置。新建工程点击【新建工程】会弹出新建表单。工程名称为必选项,工程密码为可选项。本界面还有一个按钮是显示筛选,可以对列表中的工程显示进行筛选。工程设置
18、在创立完毕后,需要进行三部操作:选择知识库、上传定量指标结果、开启评分。完成这三个步骤后,该工程会出现在专家评分列表中。工程统计在收到评分后可以进行工程评分统计,点击评分统计按钮,选择相应的评分次序,进入统计页面。在统计汇总界面有三个主按钮:评分筛选、工程筛选和保存结果,进行筛选后下面的汇总结果会进行相应改变。统计结果导出工程结果汇总界面的排行榜和三个图表都能够进行导出。排名会导出为表格文件,而图表能够分别导出单独的图片。3、专家评分操作选择评分工程在专家评分工程列表里点击工程后,可进入相应评分界面。专家评分点击顺序评分可进行自动逐个评分,点击确定按钮后即进入下一评分项。点击任意左侧指标可对相
19、应指标进行评分和再评。评分结束后可查看汇总结果和提交,每个工程每轮每专家仅能评分一次切不可修改。4、用户管理操作用户管理界面点击新建能创立新用户,点击用户列表单一用户能对其进行修改删除。新建用户修改删除用户5、其他操作点击右上角的图表后能进西个人账号的信息修改和注销选项。7、页面设计评估系统人机交流的操作平台的开发设计。 知识库编写窗口:知识库编写窗口 导入知识库窗口:导入知识库窗口评估过程窗口:评估过程窗口 结论窗口:结论窗口 结论导出窗口:结论导出窗口8、局部源代码/ App.jsexport default class App extends Component constructor(
20、props, context)super(props, context)this.state = message: open: false, text: this.handleRequestClose = this.handleRequestClose.bind(this) componentWillMount() const pathname = this.props.location.pathname const data = this.props.dataif(pathname != / & pathname !=/login) if(!data | !data.userLogin |
21、!data.userLogin.username) AppDispatcher.dispatch( action: ADD_SNACKBAR, data: text: 请先登陆 )this.context.router.push(/) return false console.log(will)injectTapEventPlugin() componentDidMount() console.log(did) AppStore.addChangeListener(this._onChange.bind(this)this.getStore()document.querySelector(#a
22、pp-loading).style.display = nonedocument.querySelector(#app-loading).innerHTML = componentWillReceiveProps() componentDidUpdate() componentWillUnmount() AppStore.removeChangeListener(this._onChange.bind(this) _onChange()this.setState(AppStore)console.log(compoent state updated) getStore()console.log
23、(get appstore) AppDispatcher.dispatch( action: GET_APP_STORE ) handleRequestClose() AppDispatcher.dispatch( action: REMOVE_SNACKBAR ) render() console.log(rendering) const data = AppStore.data const message = data.message const styles = container: width: 100%, height: 100%, margin: 0, padding: 0 , s
24、nackbar: left: 40%, width: 20%, textAlign: center , if(!data.ready) return ( ) const Routes = React.cloneElement(this.props.children, data: data ) let nav = if(data.userLogin & data.userLogin.username) styles.container.padding = 40px 20px 0 styles.container.boxSizing = border-box nav = () const load
25、ing = data.loading ? ( 载入中) : return ( loading nav Routes ) App.contextTypes = router: React.PropTypes.object/登陆const styles = root: display: flex, flexWrap: wrap, justifyContent: space-around, , gridList: width: 100%, overflowY: auto ;export default class Login extends Component constructor(props,
26、context)super(props, context)this.state = open: false, message: , status: normal, colors: 62,35,255, 60,255,60, 255,35,98, 45,175,230, 255,0,255, 255,128,0 , step: 0, colorIndices: 0,1,2,3, gradientSpeed:0.002, this.confirm = this.confirm.bind(this)this.handleRequestClose = this.handleRequestClose.b
27、ind(this)this.updateGradient = this.updateGradient.bind(this) updateGradient() console.log(rendering) const colors = this.state.colors let step = this.state.step let gradientSpeed = this.state.gradientSpeed let colorIndices = this.state.colorIndices let c0_0 = colorscolorIndices0; let c0_1 = colorsc
28、olorIndices1; let c1_0 = colorscolorIndices2; let c1_1 = colorscolorIndices3; let istep = 1 - step; let r1 = Math.round(istep * c0_00 + step * c0_10); let g1 = Math.round(istep * c0_01 + step * c0_11); let b1 = Math.round(istep * c0_02 + step * c0_12); let color1 = rgb(+r1+,+g1+,+b1+); let r2 = Math.round(istep * c1_00 + step * c1_10); let g2 = Math.round(istep * c1_01 + step * c1_11); let b2 = Math.round(istep * c1_02 + step * c1_12); var color2 = rgb(+r2+,+g2+,+b2+);