第五次作业——软件设计
第五次作业——软件设计
在开始软件设计之前,首先确定软件设计中的各个模块需要考虑的任务,绘制概要图如下:
下面根据上述各个模块,逐层进行软件设计:
一、概要设计
首先,概要设计的目的是确定软件的结构以及各组成成分(子系统或模块)之间的相互关系,这样,意味着需要确定我们平台的总体实现方案,这个实现方案由于需从软件各模块进行考虑,因此我们在设计过程中选择由数据流图入手,各组分逐一分析。
除此之外,在概要设计部分,我们要大致确定平台所使用数据库的表、约束以及表之间的联系,这个设计决定了之后系统各模块能够达到的耦合、内聚程度。
1.1 数据流图
由在需求分析中所确定的针对不同用户的产品功能性的需求分析,绘制平台数据流图如下:
①平台顶层数据流图
在绘制完平台顶层数据流图以后,针对平台各个模块绘制1级数据流图如下:
② 论坛模块
③平台基本功能模块
④ 数据分析模块
1.1.1 平台的总体实现方案
在绘制数据流图以后,我们通过理解各个模块的数据输入输出流,即可对整个平台的实现有总体的规划,确定总体的实现方案,我们准备从如下三个模块入手:
1.1.1.1 组成系统的物理元素清单
总体元素 |
作用与功能 |
数据库 |
是平台的基础,反映了平台的设计结构
|
数据分析接口 |
是完成平台数据处理功能的模块
|
总体平台 |
包括主页面、数据分析页面、用户管理页面、论坛区、用户反馈页面等。整个项目的功能以平台为载体来实现。 |
1.1.1.2 实现进度计划
关于这部分,在上次的作业中我们已经大致规划过了,但由于还未对整个项目进行上述那样详细的功能分析与设计,部分设想需要进行适当修改,结合上面的分析对其进行修改如下:
分工 |
负责人 |
实现方式 |
前端 |
纪芳 & 廖文静 |
HTML + CSS5 + JAVASCRIPT
|
后台 |
林光涵 & 林瑞溶(辅助) |
PYTHON + MYSQL
|
数据库 |
张泽政 & 林瑞溶 |
MYSQL
|
算法接口 |
刘涛 & 张泽政 (辅助) |
|
时间 |
负责人 |
负责任务 |
第11-12周 |
刘涛、张泽政 |
完成对项目的配置,确定数据分析的主要实现方式。
|
林光涵、林瑞溶 |
学习Python,对过程中已经写好的页面与数据库进行前后台对接。
|
|
纪芳、廖文静 |
前端页面的编写。
|
|
张泽政、林瑞溶 |
对数据库进行全面的建立,并根据实际情况对数据库进行修改与重构。 |
|
|
|
|
第13周 |
刘涛、张泽政 |
实现数据分析接口,并进行数据分析的优化。 |
林光涵、林瑞溶 |
对后台的逻辑进行补充设计,完善平台功能。 |
|
纪芳、廖文静 |
对前端页面细节进行优化。 |
|
|
|
|
第14周 |
小组全体成员 |
对基本成型的平台进行审核,平台测试,并发现遇到的问题,及时进行修正、改进。采取调查的方式让其他人体验平台,获取他人意见并进行改进。 |
1.1.1.3 系统流程图(HIPO图)
1.2数据库逻辑结构设计
1.2.1 建表
数据库初步建表如下:
表 |
表 名 |
作 用 |
用户信息表 |
table_user_info |
存储用户的基本信息 |
用户权限表 |
table_user_rights |
记录用户的权限,如普通用户、管理员。 单独列一张表而不是把表分为用户表和管理员表的理由: ① 普通用户和管理员有很多相同的属性,这样可以节省空间。 ② 最主要的原因,管理员可以修改用户信息,假如分为两张表,就意味着管理员可以随意修改用户的权限。 |
操作记录表 |
table_op_record |
记录用户在平台的操作以及所使用的数据存放路径,如上传数据、分析数据等,用户进行分析的数据将自动保存,只保存最近的5次操作。 |
反馈信息表 |
table_feedback |
用户向平台提出意见,由管理员来接收,管理员根据意见选择性的回应,回应消息由用户接收。 |
发贴表 |
table_poster |
参考自博客园的博客存放形式,把帖子的内容存放到数据库里。 |
图片存放表 |
table_picture |
记录用户评论、发帖时使用的图片路径。 |
评论表 |
table_comment |
用户对某个帖子的回复信息。 |
1.2.2确定各字段的约束条件
在这部分中,我们首先要确定每个表具有哪些字段, 在确定时还可以顺便完成一步我们在物理设计时完成的任务:确定每个字段的类型,如整数,char等,对于char类型要格外注意,既不能把长度开的太大,导致空间的浪费,也不能开的太小,导致部分数据丢失。
①表名:table_user_info
别名:用户信息表
描述:存放用户的基本信息。
中文 |
列名 |
数据类型 |
约束条件 |
描述 |
用户名 |
user_login_name |
char(25) |
PK |
唯一标识某个用户。 |
用户密码 |
user_pwd |
char(15) |
Not Null, Check(长度≥6 & 不能为纯数字) |
用户的密码,非空. check约束由触发器实现。 |
用户昵称 |
user_Nick_name |
char(20) |
Default. |
用户的昵称,在注册时若未指定,使用触发器生成默认值。 |
用户手机号 |
user_phone |
Vachar(11) |
Unique |
因为可以通过手机快捷注册,所以该列必须加unique约束。 |
用户邮箱 |
user_Email |
char(25) |
- |
服务器脚本检验邮箱的合法性。 |
②表名:table_user_rights
别名:用户权限表。
描述:记录用户的权限,如普通用户、管理员。
中文 |
列名 |
数据类型 |
约束条件 |
描述 |
用户名 |
user_login_name |
char(25) |
PK,FK |
唯一标识某个用户,外键关联自用户信息表。 |
用户身份 |
user_status |
char(15) |
Not Null |
用户的权限。 |
③表名:table_op_record
别名:操作记录表
描述:记录用户在平台的操作以及所使用的数据存放路径,用户在平台进行操作(保存数据,数据分析)时,平台自动保存用户使用的数据并生成相应记录。
中文 |
列名 |
数据类型 |
约束条件 |
描述 |
操作时间 |
opt_time |
datetime |
PK |
产生操作的时间。 |
用户名 |
user_login_name |
char(25) |
FK,PK |
唯一标识某个用户,外键关联自用户信息表。 |
操作类型 |
opt_type |
char(20) |
Not Null |
操作的类型(如保存数据、数据分析)。 |
数据存放路径 |
opt_data_route |
char(50) |
- |
因为用户使用的数据量会非常大,因此不宜保存在数据库中,这里保存方法是保存在文件中,由数据库指向其存放路径。 |
④表名:table_feedback
别名:反馈表
描述:用户向平台提出意见,由管理员来接收,管理员根据意见选择性的回应,回应消息由用户接收。
中文 |
列名 |
数据类型 |
约束条件 |
描述 |
消息接收时间 |
fbk_receive_time |
datetime |
PK |
产生操作的时间。 |
发送者用户名 |
fbk_sender |
char(25) |
FK,PK |
唯一标识消息的发送者,外键关联自用户信息表。 |
接收者用户名 |
fbk_recipient |
char(25) |
FK,PK |
唯一标识消息的接收者,外键关联自用户信息表。 |
消息类型 |
fbk_info_type |
char(25) |
Not Null |
发送消息的类型,如用户反馈、管理员回复等。 |
消息内容 |
fbk_info_content |
varchar(255) |
- |
消息的内容,一般一条反馈消息不会太长,默认255个字符足够,而考虑到有些特殊情况,这里采用边长的varchar类型,可以根据实际来调整大小。 |
⑤表名:table_poster
别名:发帖表
描述:参考自博客园的博客存放形式,把帖子的内容存放到数据库里。
中文 |
列名 |
数据类型 |
约束条件 |
描述 |
帖子ID |
post_id |
varchar(60) |
PK |
帖子的ID,该属性是为了方便的标识某个帖子,由用户名和发帖时间拼接生成(保证唯一性),生成操作由触发器实现。 |
发贴者用户名 |
fbk_sender |
char(25) |
FK |
唯一标识发帖者,外键关联自用户信息表。 |
发帖时间 |
post_time |
datetime |
Default |
发帖的时间,默认为当前时间 |
发帖内容 |
post_content |
varchar(5000) |
Not Null |
参考自百度贴吧的帖子,一个帖子的内容最多5000字符。 |
帖子标题 |
post_title |
char(80) |
Not Null |
每个帖子应该有一个标题。 |
帖子类型 |
post_type |
char(20) |
Not Null |
帖子的类型 |
⑥表名:table_comment
别名:帖子评论表
描述:参考自博客园的博客存放形式,把帖子的内容存放到数据库里。
中文 |
列名 |
数据类型 |
约束条件 |
描述 |
评论ID |
comt_id |
varchar(60) |
PK |
评论的ID,该属性是为了方便的标识某个帖子,由被评论帖子ID和评论时间、评论者用户名拼接生成(保证唯一性),生成操作由触发器实现。 |
发贴者用户名 |
comt_commenter |
char(25) |
FK |
唯一标识评论者,外键关联自用户信息表。 |
评论时间 |
comt_time |
datetime |
Default |
评论的时间,默认为当前时间 |
被评论贴ID |
comt_post_id |
varchar(60) |
FK |
被评论的帖子的ID,外键关联自发帖表。 |
评论内容 |
comt_content |
varchar(2000) |
Not Null |
参考自百度贴吧,一个回复最多2000字符。 |
⑦表名:table_picture
别名:图片表
描述:记录用户评论、发帖时使用的图片路径。
中文 |
列名 |
数据类型 |
约束条件 |
描述 |
链接ID |
pic_id |
varchar(60) |
- |
图片链接到哪个ID,这个ID指的是帖子的ID或评论的ID,以便加载帖子或评论时读取图片。 |
图片存放路径 |
pic_route |
char(50) |
- |
一般图片不会直接存放在数据库中,而是存放在物理磁盘上,数据库存放它的路径。 |
1.2.3 确定表之间的关系
表之间的关系最好通过PDM图来表示,如下:
二、详细设计
2.1 数据库的物理结构设计
在“1.2.2确定各字段的约束条件”中,已经完成了物理结构设计中的重要的一部分,即确定每个字段的类型,如整数,char等,对于char类型要格外注意,既不能把长度开的太大,导致空间的浪费,也不能开的太小,导致部分数据丢失。
在这里,我们进行进一步的物理结构设计: 确定数据库文件的存放路径。
物理模型如下:
物理模型
参数 |
参数值 |
|
数据库名 |
Data_analyze_Project |
|
主文件组 |
||
逻辑数据文件名① |
PlatForm_Main_1 |
|
物理数据文件名① |
C:\PlatForm_Main_1.mdf |
|
数据文件的初始大小① |
0.5GB |
|
数据文件的最大大小① |
Unlimited |
|
数据文件增长帐度① |
200MB |
|
逻辑数据文件名② |
PlatForm_Main_2 |
|
物理数据文件名② |
C:\PlatForm_Main_2.ndf |
|
数据文件的初始大小② |
0.5GB |
|
数据文件的最大大小② |
Unlimited |
|
数据文件增长帐度② |
200MB |
|
次要文件组: |
||
逻辑数据文件名① |
PlatForm_Minor_1_1 |
|
物理数据文件名① |
C:\PlatForm_Minor_1_1.ndf |
|
数据文件的初始大小① |
600MB |
|
数据文件的最大大小① |
Unlimited |
|
数据文件增长帐度① |
200MB |
|
|
||
逻辑数据文件名② |
PlatForm_Minor_1_2 |
|
物理数据文件名② |
C:\PlatForm_Minor_1_2.ndf |
|
数据文件的初始大小② |
600MB |
|
数据文件的最大大小② |
Unlimited |
|
数据文件增长帐度② |
200MB |
|
次要文件组: |
||
逻辑数据文件名① |
PlatForm_Minor_2_1 |
|
物理数据文件名① |
C:\PlatForm_Minor_2_1.ndf |
|
数据文件的初始大小① |
2GB |
|
数据文件的最大大小① |
Unlimited |
|
数据文件增长帐度① |
400MB |
|
|
||
逻辑数据文件名② |
PlatForm_Minor_2_2 |
|
物理数据文件名② |
C:\PlatForm_Minor_2_2.ndf |
|
数据文件的初始大小② |
2GB |
|
数据文件的最大大小② |
Unlimited |
|
数据文件增长帐度② |
400MB |
|
日志文件 |
||
日志逻辑文件名① |
PlatForm_Log1 |
|
操作系统日志文件名① |
C:\PlatForm_Log1.ldf |
|
日志文件初始大小① |
0.5GB |
|
日志文件增长幅度① |
150MB |
|
|
||
日志逻辑文件名② |
PlatForm_Log2 |
|
操作系统日志文件名② |
C:\PlatForm_Log2.ldf |
|
日志文件初始大小② |
0.5GB |
|
日志文件增长幅度② |
150MB |
|
对上述参数进行如下解释:主文件组包括两个文件,用于存放数据库的核心信息、数据字典等,这里核心信息指代用户信息。两个次要文件组,第一个次要文件组存放用户的操作信息,第二个次要文件组开的大小比较大,是为了存放比较占空间的贴子以及评论。
现针对具体参数进一步解释:
①主文件组的一个文件用来存放用户信息,一个文件大小为0.5GB,文件增幅为200MB,而对应一个用户的信息大小为 4 + 25 + 20 + 50 = 99B,也就是说 初始情况下,主文件组能存放的用户信息数量约为 0.5GB/99B = 5422938条,而一次文件增长为200MB,能增加的用户信息数量约为 200MB / 99B = 2118335条,这显然是够用的。
②第一个次要文件组存放用户的操作信息,包括两个文件,大小分别为600MB,总大小即为约1.2GB,那么初始情况下,能存放的操作信息为 1.2GB/(4+25+20+50) = 13015052条,两个文件各自一次增长加一起为400MB,能存放的信息数量为:4236670条,显然也是合理的。
③第二个次要文件组开的大小比较大,是为了存放比较占空间的贴子以及评论,包括两个文件,大小分别为2GB,总大小即为4GB,假设平均一个帖子有20条评论,共有20张图片,那么一个帖子的总大小为(60+25+5000+80+20+20*(60+25+60+4+2000)+20*(60+50))=50385B,则初始情况下,能存放的贴数为:4GB/50385B = 85242条,一次增加的大小共为800MB,能存放的信息数量为:16649条,一般情况下应该也是足够的。
2.2 系统接口设计
2.2.1 外部接口
在此通过外部接口简述硬件输入输出:
2.2.2 内部接口
(1)开发模式:采用flask框架结合前端HTML、CSS、JS、Jquery以及mysql组合而成的MVC开发模式。
(2)开发使用的ide: pycharm
(3)MVC模式以及后台目录结构设计
MVC图如下:
根据MVC设计的目录结构:
一级目录结构:
二级目录结构:
Model层:分为四个模块分别是管理员模块(admin),数据分析模块(dataAnalyze),论坛模块(forum),用户模块(user)
View层:
Controller层:
(4)数据传递方式及代码示例:
View层与Controller层的数据传递
1)view通过超链接的方式给Controller层传递数据
2)view通过ajax的方式给Controller层传递数据
3)Controller层返回数据给view层
Model层与Controller层的数据传递
Control层给出参数直接调用Model层中的方法
2.2.3 神经网络模型接口
①为什么使用神经网络模型?
我们用到的数据分析模型是神经网络模型,数学上已经证明,它具有实现任何复杂非线性映射的功能,也就是说这个模型有能力完成从输入数据到输出数据的映射过程。另外在分类问题上,很多研究论文均使用神经网络的方法或者其变形,包括现在很流行的对于图片的分类也采用这种方法的变形,于是我们基于此种趋势,也选择使用神经网络模型分析数据,挖掘数据的内部结构信息。
②本模型中的神经网络模型的基本原理?
神经网络模型主要是多个神经元相互连接组成的层状结构,结构如下图所示:
第一层作为数据输入层,此层节点个数等于数据的维度数目;最后一层作为分类层,我们选择是sigmoid作为分类激活函数是因为最后的结果之后两类:0或者1。中间层被称作隐含层,这些层是神经网络能够完成复杂映射的关键。
更加具体的说,我们处理这个问题的整个流程如下图:
③模型概述:
本模型的使用包括训练阶段与测试阶段:
训练阶段的流程图为:
测试阶段为:
训练的模型 + 测试数据→→预测结果(概率)
在我们的项目中,网络的结构设置为11,10,1,这些参数是每一层的神经元的数目,除了最后一层采用sigmoid作为激活函数,第一层(数据层)不处理之外,其他的层均采用relu函数进行激活,增加了网络的非线性映射能力。
④实现方式的优点?
在实现神经网络的时候,我们封装了两个类,一个是NNtrainer类,用于数据的训练,一个是NNpredicter类,用于测试数据的预测。在NNtrainer类中,我们实现从数据的读入,训练,模型的存储全过程,可以很轻松的调用其中功能,实现训练过程。NNpredicter也是如此。
2.3 软件过程设计及用户接口描述
进行上述详细的分析以后,站在普通用户的角度,对平台的用户过程进行如下图示:
而管理员用户的操作与用户类似,但是管理员会具有一些特别的权限,如下图: