1、QQ空间管理系统设计分析书QQ空间管理系统设计学院: 电子信息工程学院 班级: 信息管理于信息系统 成员: 葛晓飞 石晓甜 侯建英 孙千惠 马莹莹 课程: 应用系统项目实践 第一章:要求和目标1.1基本要求(1)功能:用户登录功能:并以此来判断用户本人和访客,并且对相应的操作权限进行设置。用户日志信息(更新):查看、发表、评论等信息的导入/导出。用户相册信息更新:上传、查询,及实现简单的在线播放。实现用户留言板功能,每当有游客来访问时,可以进行简单留言功能。访客记录功能:统计、显示历史访问人数,以及当日访问人数的信息。个人资料管理功能:对个人信息的修改以及实现简单的注册功能。查找添加用户功能:
2、可以方便查找所有好友以及添加好友功能,(2)性能方便数据导入和输出,提高了软件的使用效率。(3)系统的输入 日志信息、相册信息、留言信息、访客信息及其具有特殊权限用户的修改信息(4)系统的输出查询结果和数据的显示。(5)数据安全系统对不同权限的用户提供不同的功能模板,有一定特殊权限的用户可以进行相对的操作,一般的游客只能进行信息查看的操作。1.2 .开发目标(1)方便操用户添加、查询及其修改相关信息,减少人力和设备需求;(2)同时满足查询及其修改的要求;(3)促进信息交流规范化及其多样化;(4)学生自行开发降低选课管理创作及其维护费用 1.3. 定义 概念(1)QQ System:QQ信息管理
3、系统。(2)用户:QQ空间管理系统的客户,主要分为游客和用户,可以拥有QQ信息管理系统的帐户。(3)帐户:用户登录QQ空间管理系统的凭证,用户通过密码或其它安全认证拥有帐户的相关功能。二:一般性描述该系统所涉及的帐户信息和用户信息全部存放在银行数据库服务器中,数据库服务器运行在小型机上。本系统采用浏览器/服务器(B/S)的工作方式,系统的用户主要有:用户和游客。1 .系统Use Case图顶层的Use Case如下图所示:顶层的Use CaseActor定义如下: Adminixtrator:一般用户。 Tourist:游客。对顶层的Use Case进行细化,得到的Use Case图如下所示。
4、细化Use Case图各Use Case说明如下:(1) 登录:提供用户登录的验证。Step1:用户登录QQ信息管理系统的登录页面,输入用户名和密码。Step2:验证成功则跳转至主页面,否则重新登录,本Use Case结束。(2) 留言;为自己或者他人进行留言Step1:用户首先进行系统登录,登录成功则可执行本功能。Step2:本人信息的留言:用户可以在自己的留言板处,进行个人留言,编辑信息后,点击提交按钮,若出现留言成功提示,则说明留言成功,否则留言失败。Step3:若对好友进行留言,则首先查看自己的好友,跳转至好友的主页,然后找到对应的留言板板块,再说输入框进行编辑文本,同样单击提交按钮提
5、交,出现留言成功则表示本次留言成功,本Use Case结束。(3) 查看:查看自己或好友的信息Step1: 用户首先进行系统登录,登录成功则可执行本功能。Step2:查看自己本人的信息:登录成功后则进入个人主页,在该页面有日志、说说、相册、留言板、请求信息、个人信息等模块。如果查看他人的信息则需要首先进入好友的空间然后选择相应的信息进行查看,但需要注意的是我们在别人空间只能查看而不能操作他人的信息Step3:完成查看后可以返回好友或自己的界面,同时可以退出本系统。(4) 评论:对自己或者好友的信息进行评论Step1: 用户首先进行系统登录,登录成功则可执行本功能。Step2:用户登陆成功后,选
6、择要访问的好友,进入好友的主页,选择好友的说说或者是日志然后在下面的输入框输入评论信息,输入完成后按提交按扭。Step3:提交之后若提交成功,则提示评论成功否则评论失败。Step4:评论完成后可以跳转好友的主页面或者是自己的主页面。(5) 发表信息;该功能是发表自己的日志,说说,音乐。Step1: 用户首先进行系统登录,登录成功则可执行本功能。Step2:当用户登陆成功之后,跳转主界面,选择对应的日志或者说说或者音乐功能,然后在每个单摸版中都有提示按钮,像说说在文本框中输入要发表的信息,然后淡季发表按钮;若是上传音乐,则单击上传按钮。Step3:在每次响应的操作之后都会出现响应的状态提示。(6
7、) 回复评论:用户对好友发表的评论进行回复Step1:用户首先进行系统登录,登录成功则可执行本功能。Step2:查看自己的说说或者日志,观看下面的评论信息。Step3:找到好友对自己信息的评论,在回复框中输入回复信息。Step4:状态显示,回复成功则提示回复成功,否则显示失败。(7) 添加好友:添加好友,方便查看好友信息。Step1:用户首先进行系统登录,登录成功则可执行本功能。Step2:将鼠标放到添加好友,会划出一个文本框,上面列出了所有的好友,单击右边的添加好友按钮,会弹出已发送添加请求,等待好友回复。Step3:当好友同意添加后,在自己的消息中会提示消息+1,1即为消息数目。Step4
8、:添加成功后,将鼠标放在我的好友处,将划出一文本框,显示自己的所有好友。因此,本QQ空间管理系统由以下功能模块组成:(1)用户登录、注册登录模块(2)主界面模块(3)个人信息管理与维护模块1.4用户特征此系统有两类用户:普通用户和游客。功能(1):只有进行登录并通过身份验证的用户,才可以在QQ空间系统页面发表日志,并借助个人设置实现对个人相关信息的管理维护。对于没有经过身份验证的网络用户不允许在本系统中发表日志,更不允许对本系统的页面信息进行管理维护。该模块实现QQ空间系统的注册及登录验证功能。注册成功的用户登录时,会随时根据页面输入的登录信息进行提示,如用户名错误或者密码错误。功能(2):在
9、该模块中提供了QQ空间系统页面统计信息(如访问量等),日志、评论、音乐盒及留言信息分页显示等多种功能,方便用户操作。功能(3):借助该模块,用户可以随时对个人QQ空间主页中的内容进行增加或修改,包括日志等信息的更新、评论及留言管理等功能,也允许用户对个人信息进行维护及其管理。对于用户来说一般都有一定的专业领域知识,一般有一定的电脑操作能力,但对于一些特殊的顾客来说可能对电脑操作知识了解比较少,因此对于一般使用者来说不需要特殊的理论、知识来支持,也不需要经过特殊的训练,用户只要在计算机上装有IE或Netscape浏览器,并有基本的浏览器操作知识,便能方便的使用本系统。1.5限制与约束此系统必须满
10、足以下限制:(1)系统中所有帐户能够供用户随时使用,并且用户名唯一性;(2)在同一时刻,一个帐户不能同时为两个用户服务;(3)超过预定的时间,没有操作该账号被自动释放;第二章:功能描述2.1主要功能模块根据系统需求分析和系统功能模块结构图来看,该系统应具备如下基本功能:l 登录信息l 主页信息l 日志信息l 留言板信息l 相册信息l 个人档信息l 音乐信息QQ空间管理系统可划分为登陆信息,主页信息,个人档信息,说说信息等部分。其层次图如图1所示。图1 功能模块图2.2 注册功能模块1.用户表_user其设计结构如下: 图2登陆信息图用户登录与注册模块实现登录界面的servlet控制器的部分代码
11、如下:package com.softeem.qqsystem.servlet;public class logInfoManger extends HttpServlet private int count;/ 总的日志数private int pagecount;/ 共有的页数private int everypage;/ 每页显示的数量private int currentpage;/ 当前的页数private static final long serialVersionUID = 1L;private LogDAO logdao = new LogDAO();public void
12、service(HttpServletRequest request, HttpServletResponse response) try request.setCharacterEncoding(utf-8);response.setCharacterEncoding(utf-8); catch (UnsupportedEncodingException e) / TODO Auto-generated catch blocke.printStackTrace();String flag = request.getParameter(flag);if (_showlog_daily.equa
13、ls(flag) this.getAlllog_Daily(request, response);System.out.println(-*-); else if (show_daily.equals(flag) this.show_daily(request, response); else if (_write_daily_log.equals(flag) / 写日志this.write_daily_log(request, response); else if (_comment.equals(flag) / 进行评论日志this.createComments(request, resp
14、onse);System.out.println(*bbbbbbbbbbbbbb*); else if (show_message.equals(flag) / 显示所有留言信息this.getAllMessage(request, response);/ 显示所有的日志,按页显示public void getAlllog_Daily(HttpServletRequest request,HttpServletResponse response) HttpSession session = request.getSession();/ 注意session需要获取String mainaccou
15、nt = (String) session.getAttribute(user);String newaccount = (String) session.getAttribute(newUser);String account;if (newaccount != null) account = newaccount; else account = mainaccount;System.out.println(account);/ System.out.println(account);everypage = 3;/ 每页显示5条数据count = logdao.findallpage(acc
16、ount);/ 总的数据量为if (count % everypage = 0) / 计算总的页面数pagecount = count / everypage; else pagecount = count / everypage + 1;currentpage = Integer.parseInt(request.getParameter(currentpage);/ 接受网页传来的当前页数if (currentpage = pagecount - 1) currentpage = pagecount - 1;List dailyloglist = logdao.getalllog_dail
17、y(account, currentpage* everypage, everypage);request.setAttribute(List, dailyloglist);request.setAttribute(currentpage, currentpage);/ 将当前页面传输到页面中request.setAttribute(pagecount, pagecount);/ 将总的页面数传输到页面中try request.getRequestDispatcher(jsp/log_daily.jsp).forward(request,response); catch (ServletExc
18、eption e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/ 显示所要查看的日志public void show_daily(HttpServletRequest request,HttpServletResponse response) int log_num = Integer.parseInt(request.getParameter(log_num);Log log =
19、 logdao.getonedaily(log_num);List discusslist = logdao.getalldiscuss(log_num);request.setAttribute(DiscussList, discusslist);request.setAttribute(Log, log);/ 将关于该文章的内容发送到页面中try request.getRequestDispatcher(jsp/show_daily.jsp).forward(request,response); catch (ServletException e) / TODO Auto-generate
20、d catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/ 发表日志public void write_daily_log(HttpServletRequest request,HttpServletResponse response) HttpSession session = request.getSession();String account = (String) session.getAttribute(user);Stri
21、ng title = request.getParameter(title);String content = request.getParameter(content);Log log = new Log();log.setAccount_num(account);log.setContent(content);log.setLog_name(title);System.out.println(title);System.out.println(content);int flag = logdao.write_daily_log(log);System.out.println(flag);i
22、f (flag 0) request.setAttribute(message, 文章发表成功!); else request.setAttribute(message, 对不起,文章发表失败!);try request.getRequestDispatcher(jsp/writedaily_log.jsp).forward(request, response); catch (ServletException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-g
23、enerated catch blocke.printStackTrace();当注册页面时,会跳入注册页面,当登陆成功后会跳入该系统的主页面,主页面的部分代码如下:var flag = true;function show() var odv = document.getElementById(dv);var count = odv.offsetTop;if (flag) var time = window.setInterval(function() count = count + 4;odv.style.top = count;if (count = 0) window.clearInt
24、erval(time);flag = false;, 30)function hide() var odv = document.getElementById(dv);var count = odv.offsetTop;if (!flag) var time = window.setInterval(function() count = count - 4;odv.style.top = count;if (count = -400) window.clearInterval(time);flag = true;, 30)用户登录主界面模块2.3主页信息模块2.4日志模块1.日志表_log其设
25、计结构如下:2.5留言板模块1.留言板分为填写主人寄语,好友印象和留言管理三部分。 2.用户在填写留言部分填写问题,提交后只会显示提交成功,在没有得到回复前,留言板里没有此条信息,信息会显示在留言管理中等待管理者回复,等到网站管理者对这条留言进行回复后,才显示在留言板中。 3.留言管理是为了方便网站管理者管理和修改而设立的,留言管理部分只有网站管理者可见,普通用户登录网站时,是看不到这部分内容的。留言管理里会显示发布留言者在填写留言部分填写的全部信息,便于管理者对访客进行管理。 4.管理者看到访客留言时,可以对此条信息进行回复留言,删除留言,显示或隐藏的操作,可以对发布的留言进行管理。 5.留
26、言可定义是否审核 ,如定义为不需要审核,则用户的留言会直接显示到页面上,如定义为需要审核,则默认为隐藏状态,管理人员审核后方才显示。1留言表_message其设计结构如下:2评论表_discuss其设计结构如下:3访问记录表_visit其设计结构如下:4好友表_friend其设计结构如下:2.6相册模块一、 相册模块 这是相册模块的第一个页面功能图。我们点击各个功能可以跳转到一下各个子页面。(1)创建相册功能描述(2)展示设置功能描述(3)上传照片功能描述。4相册表_photo其设计结构如下:2.7个人档信息模块1音乐表_music其设计结构如下:2.8个人信息管理与维护模块5.3.1该页面用
27、来用户的日志管理5.3.2该页面用来管理用户上传的音乐,以及在线播放音乐的操作 第三章:数据字典3.1空间数据字典运用通过系统需求分析,QQ空间系统编制数据字典如下:各主要数据流的定义如表1至表4所示:表1名字:用户登录信息描述:确认是否是注册用户的基本信息定义:用户登录信息=用户名+密码位置:登录界面 表2名字:用户档案描述:登录空间的个人信息定义:用户档案=姓名+性别+年龄+生日+基本信息=表 3名字:空间信息描述:空间布局的基本信息定义:空间信息=主页+日志+相册+留言+说说+音乐+更多第四章:数据库设计数据库是当前应用软件系统的重要组成部分,如何使基于数据库的应用系统安全、可靠、高效的
28、运行一直是软件开发技术研究的难题。所以本系统的数据库设计基于以下几点来考虑:(1)数据库规范化与非规范化的考虑。(2)数据查询优化与索引的建立。(3)存储过程与视图。4.1 数据库分析为了把用户的数据要求清晰明确地表达出来,通常要建立一个概念性的数据模型。概念性数据模型是一种面向问题的数据模型,是按照用户的观点来对数据和信息建模。描述了从用户角度看到的数据,反映了用户的现实环境。QQ空间系统涉及的表包括:(1)用户表 账户、密码、权限(好友)年龄 地址 (2)音乐表 编号 账户 歌名 上传时间 URL(3)相册表 编号 账户 url 上传时间(4)日志表 编号 账户 日志名 发表时间 发表内容
29、 私密设置(说说同样)发表的类型(跟说说区分)(5)留言表 编号 账户 留言人 留言时间 留言内容 发表的类型(6)评论表 编号 对应评论文章的编号 评论的账户 评论人 类型(属于日志、说说、留言) 评论时间 内容(7)访问记录表 编号(主键) 账户 访问账户 访问时间(8)好友表 编号(主键) 添加人 被添加人 状态 特征4.2 数据库逻辑设计4.3 数据连接目前流行的数据库连接技术主要有:JDBC-ODBC桥、JDBC和数据连接池技术。该系统采用数据连接池技术,使用连接池的优点主要体现在两个方面:对数据库的连接统一进行配置、管理、监控,以及对数据库连接池的参数进行优化调整,同时对应用程序中
30、没有关闭或其他原因造成没有关闭的数据库连接由连接池统一进行管理。便于程序的移植和后端数据库的切换,因为在应用中通过统一的JNDI获得数据库的连接,而具体连接的是哪一台机器上的数据库与程序无关。数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接。这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。数据库连接池的主要操作如下:(1)建立数据库连接池对象(服务器启动)。(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。(3)对于一个数据库访问请求,直接从连接池
31、中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。(4)存取数据库。(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。第五章 详细设计与系统实现5.1主要部分的具体实现由于该系统采用的是MVC模式,本系统主要分为四个文件夹,其中connection文件夹放着连接数据库的文件,而dao是存放的是跟底层数据库的操作类,dto是封装的javabe
32、an类,而servlet则是存放的是该系统的中央控制器,用来接收用户的所有请求,并且相应用户的请求。数据库连接类ConnectionUtils.java,是用来连接数据库的文件,该文件的具体代码如下:package com.softeem.qqsystem.connection;public class ConnectionUtils private static String USER = root;/ 连接数据库的用户private static String PASSWORD = admin;/ 密码private static String URL = jdbc:mysql:/loca
33、lhost:3306/qqdatabase;/ 连接数据库的路径private static String DRIVERNAME = com.mysql.jdbc.Driver;/ 数据库的驱动名称/ 在加载类的时候进行注册驱动static try Class.forName(DRIVERNAME); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace();/ 连接数据库,返回的是一个连接public static Connection getConnection() try r
34、eturn DriverManager.getConnection(URL, USER, PASSWORD); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();return null;/ 如果创建连接失败,则返回的是null/ 如果连接不为空,关闭连接public static void close(Connection conn, Statement stat, ResultSet rs) if (conn != null) try conn.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();if (stat != null) try stat.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();if (rs != null) try rs.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();