一、实验名称
系统详细设计
二、实验目的
根据需求分析、概要设计,完成系统的详细设计
三、实验主要内容
详细设计的主要任务是设计每个模块的实现算法、所需的局部数据结构。详细设计的目标有两个:实现模块功能的算法要逻辑上正确和算法描述要简明易懂。
四、实验原理
1、模块说明。说明该模块需要实现什么功能,还有设计要点。
2、流程逻辑。用流程图说明该模块的处理过程。
3、算法。不一定有,如果涉及一些比较特殊的算法或关键模块,就写一下算法的伪代码或用流程图说明。
4、限制条件。该模块的功能有哪些限制,比如用户ID不能重复,只能查询自己权限范围内的用户。
5、输入项。每个子模块可以看做一个”方法“,我传给你什么,你给我输出什么。比如删除用户,输入项就是用户ID。
6、输出项。删除用户的输出项,就是不能在查询模块里查询到已删除的用户
7、界面设计。用visio或者其他工具画一些界面图
8、需要操作的数据表。
五、实验结果
详细设计
目录
一、数据库设计
二、用户界面设计
三、系统实现.
四、总结和展望
4.1总结
4.2展望
一、数据库设计
为了实现数据持久化,必须在数据库中建立一些对应特定功能的数据表作为存储。其中数据库中的数据主要存储在表中,包括文章表,好友表,图片表,留言表,用户表。不同的表存储不同的信息,每个表中的id为该表中数据的唯一标识,在改变和显示信息时将作为唯一的标识使用,表与表之间通过连接进行查询和修改,数据库方面将通过jdbc进行连接使用。以下详细说明主要功能表的基本情况。
1、文章表
该表格用来存储用户发布的博客信息,包括导航网站的信息。
文章编号,时间,发布人,类型,点击次数,回复次数
2、好友表
该表用来存储好友之间的关系
编号,用户,好友姓名
3、图片表
该表用来存储用户发布的图片信息
Id,title,path,日期
4、留言表
该表用来存储用户的留言信息
Id,发布人姓名,内容,发布时间
4、用户表
该表主要用来存储用户的注册信息
Id,姓名,密码,qq,email,空间,发布信息,权限
用户操作流程:
管理员操作流程:
二、用户界面设计
本系统的设计思路主要是实用、简便、灵活、稳定。
本网站系统采用传统的博客式网站架构,通过好友之间的互动和交流获取所需网站信息,并保存在自己的网站收藏中,方便用户的学习和工作。
三、系统实现
本项目在开发过程中,针对所有包、类、窗口、数据窗口、对象的命名都有明确规定,为了减少工作量,保证程序的一致性,我们建立了多个公共父类(如公共查询父窗口、公共提示窗口、公共编码类数据窗口等),同时我们也大量使用了面向对象的新技术。
由于本系统包含内容很多,不能展现全部实现过程,这里仅拿数据库的连接和信息发布为例说明:
数据库连接的实现:
通过db.properties进行数据库的配置:
db.driver=com.mysql.jdbc.Driver
db.password=
db.url=jdbc\:mysql\://localhost/bbsdata
db.user=root
publicDataLink(){
try{
InputStream in = getClass().getResourceAsStream("/db.properties");
Properties dbProps = new Properties();
dbProps.load(in);
String driver = dbProps.getProperty("db.driver").trim();
String url = dbProps.getProperty("db.url").trim();
String user = dbProps.getProperty("db.user").trim();
String password = dbProps.getProperty("db.password").trim();
Class.forName(driver).newInstance();
this.con = DriverManager.getConnection(url,user,password);
this.con.setAutoCommit(true);
}catch(Exception e){
System.out.print(e.getMessage());
}
}
博文的发布与储存:
前端通过jsp页面进行博文的获取后端运用javaweb技术获取储存到数据库中
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");
HttpSession session =request.getSession();
PrintWriter out = response.getWriter();
String speaker = request.getParameter("currentusername");
String title = request.getParameter("title");
String type = request.getParameter("type");
String content = request.getParameter("content");
title = title.replaceAll("\\\"","'");
type = type.replaceAll("\\\"","'");
content = content.replaceAll("\\\"","'");
String INSERT_SQL = "insert into article(title,speaker,content,type) values(?,?,?,?)";
try{
DataLink datalink = new DataLink();
Connection con =datalink.getConnection();
PreparedStatement ps = null;
con.setAutoCommit(false);
ps =con.prepareStatement(INSERT_SQL);
ps.setString(1,title);
ps.setString(2,speaker);
ps.setString(3,content);
ps.setString(4,type);
ps.executeUpdate();
con.commit();
SendArticleAdd sendarticleadd = new SendArticleAdd();
sendarticleadd.addSendNum(speaker);
try{
ps.close();
con.close();
}catch(SQLException e2){
session.setAttribute("dealforummsg","发表文章失败!");
out.print("数据库关闭失败!");
out.print("<script language='javascript'>");
out.print("alert('操作出错');history.back();");
out.print("</script>");
}
}catch(SQLException e){
System.out.print(e.getMessage());
}
int artid = getAllArtId();
session.setAttribute("dealforummsg","发表文章成功!");
speaker = new String(speaker.getBytes("gb2312"),"ISO8859_1");
response.sendRedirect("forum.jsp?username="+speaker+"&&numberpage=2&&serial="+artid);
return;
}
public int getAllArtId(){
int aId = 1;
try{
DataLink datalink = new DataLink();
Connection con =datalink.getConnection();
Statement stmt = null;
ResultSet rs = null;
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT max(article_no) asmaxid FROM article");
if(rs.next()){
aId = rs.getInt("maxid");
}
}catch(SQLException e){
System.out.print(e.getMessage());
return 1;
}
return aId;
}
对博文的 显示:
public class ShowArticle {
private List ReArtList = new ArrayList();
private String SELECT_SQLS[] = {"select * from article wherearticle_no = ?",
"select * from re_article wherearticle_no = ?"};
public Article getArticleByNo(int article_no){
Article art = new Article();
try{
DataLink datalink = new DataLink();
Connection con =datalink.getConnection();
con.setAutoCommit(true);
PreparedStatement ps =con.prepareStatement(SELECT_SQLS[0]);
ResultSet rs = null;
ps.setInt(1,article_no);
rs = ps.executeQuery();
if(rs.next()){
art.setArticle_no(rs.getInt("article_no"));
art.setTitle(rs.getString("title"));
art.setSpeaker(rs.getString("speaker"));
art.setSent_time(rs.getString("sent_time"));
art.setReply_num(rs.getInt("reply_num"));
art.setClick_num(rs.getInt("click_num"));
art.setContent(rs.getString("content"));
art.setType(rs.getString("type"));
}
ViewArticleAdd viewAdd = new ViewArticleAdd();
viewAdd.addViewArticle(article_no);
}catch(SQLException e){
System.out.print(e.getMessage());
return null;
}
return art;
}
public List getReArt(int article_no,int intpage){
int pageall = 1;
int intpagecount; //总页数
int intpagesize = 1; //一页显示的记录数
int introwcount; //记录总数
int i = 0;
try{
DataLink datalink = new DataLink();
Connection con =datalink.getConnection();
con.setAutoCommit(true);
PreparedStatement ps =con.prepareStatement(SELECT_SQLS[1]);
ResultSet rs = null;
ps.setInt(1,article_no);
rs = ps.executeQuery();
// 获取记录总数
rs.last();
introwcount = rs.getRow();
//计算总页数
intpagecount =(introwcount+intpagesize-1)/intpagesize;
//调整待显示的页码
if(intpage>intpagecount){
intpage = intpagecount;
}
if(intpagecount>0){
//将记录数定位到待显示页的最后一条记录上
if(intpagecount==1){
rs.absolute(introwcount);
}
else{ //有多页的情况
rs.absolute(introwcount-(intpage-1)*intpagesize);
}
//显示数据
i = 0;
while(i<intpagesize&&!rs.isBeforeFirst()){
ReArticle ReArt = new ReArticle();
ReArt.setId(rs.getInt("id"));
ReArt.setArticle_no(rs.getInt("article_no"));
ReArt.setRe_name(rs.getString("re_name"));
ReArt.setInsert_time(rs.getString("insert_time"));
ReArt.setContent(rs.getString("content"));
ReArtList.add(ReArt);
rs.previous();
i++;
}
}
rs.close();
ps.close();
con.close();
}catch(SQLException e){
System.out.print(e.getMessage());
return null;
}
return ReArtList;
}
public int getPageSize(int article_no){
int pageall = 1;
int intpagecount; //总页数
int intpagesize = 1; //一页显示的记录数
int introwcount; //记录总数
int i = 0;
try{
DataLink datalink = new DataLink();
Connection con =datalink.getConnection();
con.setAutoCommit(true);
PreparedStatement ps =con.prepareStatement(SELECT_SQLS[1]);
ResultSet rs = null;
ps.setInt(1,article_no);
rs = ps.executeQuery();
// 获取记录总数
rs.last();
pageall = rs.getRow();
//计算总页数
pageall =(pageall+intpagesize-1)/intpagesize;
}catch(SQLException e){
System.out.print(e.getMessage());
}
return pageall;
}
public List getReArtByArticle_no(int article_no){
try{
DataLink datalink = new DataLink();
Connection con =datalink.getConnection();
con.setAutoCommit(true);
PreparedStatement ps =con.prepareStatement(SELECT_SQLS[1]);
ResultSet rs = null;
ps.setInt(1,article_no);
rs = ps.executeQuery();
while(rs.next()){
ReArticle ReArt = new ReArticle();
ReArt.setId(rs.getInt("id"));
ReArt.setArticle_no(rs.getInt("article_no"));
ReArt.setRe_name(rs.getString("re_name"));
ReArt.setInsert_time(rs.getString("insert_time"));
ReArt.setContent(rs.getString("content"));
ReArtList.add(ReArt);
}
}catch(SQLException e){
System.out.print(e.getMessage());
return null;
}
return ReArtList;
}
}
四、总结和展望
4.1总结
分析方法与设计模式因需求的不同而多种多样。不同的方法,有的可能带来非常明显的优点,而有的可能带来不利的因素。在本次项目的开发过程中,分析与设计的全阶段均完全采用了UML面向对象的先进建模方法,使系统在遵循面向对象原理与软件工程学的基础上,还具有一些使用其它面向对象方法时所不具备的优点。
本次项目的开发过程分成分析与设计两大部分。前一部分以功能为导向,着重于系统要达到的功能。而后一部分以结构为导向,着重于将业务逻辑抽象为类及其之间的关系,这些业务逻辑所要达到的功能,也正是前一部分分析的结果。分析与设计的各阶段均采用了UML面向对象的建模方法,使整体设计更具系统化、标准化、模块化。使用UML设计出来的管理系统,有很多基于业务逻辑抽象出来的类,具有广泛性的、重用性。通过管理员和用户之间的分离,用户掌握自己的导航模式理念,运用javaweb技术实现导航的自由化和人性化。
4.2展望
导航网站借助博客的平台进行,把导航的信息交给用户由用户指定符合自己的导航模式和内容,将具有极大的生命力和交互性。平台的构建的专一性可以使得平台的特点更加鲜明,平台摒弃传统的导航模式,另辟道路使其满足用户的需求。但平台的建设需要更多的宣传和投资以及信息的安全管理和违法信息的删除和封锁,平台初期使用人群符合青年使用,对于普通电脑使用者不具有更强的挑战和优势。
参考文献
[1] 《UML基础教程》张瑜 清华大学出版社
[2] 《UML和模式应用》姚淑珍 机械工业出版社
[3] 《UML系统分析设计与应用案例》冀振燕 人民邮电出版社