树屋详细设计文档

Posted geminit369

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树屋详细设计文档相关的知识,希望对你有一定的参考价值。

目    录

1. 引言... 3

1.1 编写目的和范围.. 3

1.2 术语表... 3

1.3 参考资料... 4

1.4 使用的文字处理和绘图工具... 4

2. 全局数据结构说明... 4

2.1 常量... 5

2.2 变量... 5

2.3 数据结构... 5

3. 模块设计... 8

3.1 用例图... 8

3.2 功能设计说明... 9

3.2.1 模块1. 10

3.2.2 模块2. 16

4. 接口设计... 26

4.1 内部接口... 26

4.2 外部接口... 27

4.2.1 接口说明... 27

4.2.2 调用方式... 28

5. 数据库设计... 28

6. 系统安全保密设计... 28

6.1 说明... 28

6.2 设计... 28

6.2.1 数据传输部分... 28

6.2.2 IP过滤分部... 28

6.2.3 身份验证部分... 28

7. 系统性能设计... 29

8. 系统出错处理... 29

 

1. 引言

1.1 编写目的和范围

说明写这份详细设计说明书的目的。

本详细设计说明书编写的目的是说明程序模块的设计考虑,包括程序描述、输入/输出、算法和流程逻辑等,为软件编程和系统维护提供基础。本说明书的预期读者为系统设计人员、软件开发人员、软件测试人员和项目评审人员。

1.2 术语表

定义系统或产品中涉及的重要术语,为读者在阅读文档时提供必要的参考信息。

序号

术语或缩略语

说明性定义

1

PM

Project Manager,项目经理

2

 

 

 

 

 

 

1.3 参考资料

(1).《软件工程概述》

(2).《Java面向对象程序设计》

(3).《树屋需求分析文档》

(4).《树屋概要设计文档》

列出有关资料的名称、作者、文件编号或版本等。参考资料包括:

a.需求说明书、架构设计说明书等;

b.本项目的其他已发表的文件;

c.引用文件、资料、软件开发标准等。

资料名称

作者

文件编号、版本

资料存放地点

 

 

 

 

 

1.4 使用的文字处理和绘图工具

(1).文字处理工具:Office 365.

(2).绘图工具:visio 2016

文字处理软件:[编写设计文档使用的文字处理软件,如RedOffice ]

绘图工具:[使用的UML工具,如Rose、Jude、Visio]

2. 全局数据结构说明

本章说明本程序系统中使用的全局数据常量、变量和数据结构。

2.1 常量

(1).服务器地址: String host="127.0.0.1";
(2).服务器端口: final int port=3456;
(3).服务器ID: String server="SERVER";
(4).定义的控制信号:

//Client
public final static int ADD_USER=2;
public final static int ADD_GROUP=4;
public final static int JOIN_GROUP=5;
public final static int DISCONNECT=6;
public final static int CHECK_USER=7;
public final static int DELETE_USER=8;
public final static int DELETE_GROUP=9;
public final static int LOGIN=10;
public final static int REGISTER=11;
public final static int QUIT_GROUP=12;
public final static int GET_RECOMMEND=20;
public final static int GET_SUBMIT=21;
public final static int GET_COMMIT=22;

//Server
public final static int OPERATE_SUCCESS=100;
public final static int UID_ILLEGAL=101;
public final static int GID_ILLEGAL=102;
public final static int NO_SUCH_USER=103;
public final static int NO_SUCH_GROUP=104;
public final static int WRONG_PASSWORD=105;

 

包括数据文件名称及其所在目录,功能说明,具体常量说明等。

2.2 变量

2.2.1客户端:

(1).UI界面框架:public static JFrame frame;
(2).服务器返回的状态码:public static StateCode stateCode;
(3).用户信息:public static User user;
(4).连接Socketpublic static Socket socket;
(5).用户消息处理器:public static MsgHandle msgHandle;
(6).文章列表:public static List<Article> articles;
(7).当前评论列表public static DefaultListModel cmtList;
(8).文章摘要列表:public static DefaultListModel atcList;
(9).好友列表:public static DefaultListModel userList;
(10).社团列表:public static DefaultListModel groupList;
(11).好友聊天信息列表:public static List<DefaultListModel> userChat;
(12).社团聊天信息列表:public static List<DefaultListModel> groupChat;
 
2.2.服务器:
(1).显示用户列表:public static DefaultListModel userModel;
(2).显示社团列表:public static DefaultListModel groupModel;
(3).在线用户列表:public static HashMap<String,User> userMap;
(4).注册社团列表:public static HashMap<String,Group> groupMap;
(5).注册用户列表:public static HashMap<String,String> userMsg;
(6).发布文章列表:public static List<Article> articles;
(7).文章评论列表:public static HashMap<Integer,List<Commit>> commits;

本章说明本程序系统中使用的全局数据常量、变量和数据结构。

2.3 数据结构

(1).抽象类Message,定义了用于传输的信息。

       字段src和dst定义了消息的来源和目的,isGMsg定义了消息类型(多人/单人);

       抽象方法toString()获取消息的详细信息,getMsg()获取消息用于显示的信息。

public abstract class Message implements Serializable {
    public String src;
    public String dst;
    private boolean isGMsg;
@Override
abstract public String toString();
abstract public String getMsg();
}

(2).TextMsg继承自Message,用于传输文本信息;

       字段text包含要传输的文本;

public class TextMsg extends Message {
    private String text;
        }

(3).CtrlMsg继承自Message,用于传输控制信息;

       字段cmd为控制信息代码,msg用于容纳额外信息。

public class CtrlMsg extends Message {
    private int cmd;
    private String msg;
}

(4).FileMsg继承自Message,用于传输文件信息;

       字段file包含要传输的文件信息;

public class FileMsg extends Message {
    private File file;
}

 

(5).AtcMsg继承自Message,用于传输文章信息;

       字段article包含要传输的文件;

public class AtcMsg extends Message{
    private Article article;
}

(6).CmtMsg继承自Message,用于传输评论信息;

       字段commit包含要传输的评论;

public class CmtMsg extends Message{
    private Commit commit;
}
 

(7).Article实现了Serializable接口,承载文章信息;

       字段aid:文章id;titlte:文章标题;author:文章作者;label:文章标签content:正文;

public class Article implements Serializable {
    private int aid;
    private String title;
    private String author;
    private int[] label;
    private String content;

       }

(8).Commit实现了Serializable接口,容纳评论信息;

       字段 aid:评论文章id;uid:评论者id;content:评论内容;

public class Commit implements Serializable {
    public int aid;
    public String uid;
    public String content;

       }

(9).User定义了用户信息;

       字段uid:用户id;socket:用户Socket;is,os,ois,oos:和用户socket关联的各种流;

public class User {
    private String uid;
    private Socket socket;
    private InputStream is;
    private OutputStream os;
    private ObjectInputStream ois;
    private ObjectOutputStream oos;

       }

(10).Group定义了社团信息;

       字段 gid:社团id;list:用户列表;

public class Group {
    private String gid;
    private List<User> list;

       }

(11).StateCode是服务器返回状态码的集合;

       字段count:当前状态码数目;codes:包含状态码的队列;

       方法putStateCode:压入一个状态码;getStateCode取出一个状态码;

public class StateCode {
    volatile private int count;
    volatile private ArrayDeque<Integer> codes;
 
public synchronized void putStateCode(int code)
public synchronized int getStateCode()

       }

包括数据结构名称,功能说明,具体数据结构说明(定义、注释、取值)等。

3. 模块设计

3.1 用例图

 

3.2 功能设计说明

3.2.1 Bean模块

该模块主要为用于容纳数据的java bean。

模块1主要分为以下几个子模块:子模块1、子模块2和子模块N。

3.2.1.1 Msg模块

 

该模块为容纳用于传输数据的java类

3.2.1.1.1 设计图

 

3.2.1.1.2 功能描述

用于容纳系统要用到的各种传输信息;

简要描述子模块1的业务功能。

3.2.1.1.3 输入数据

该模块无输入

详细描述用户输入的数据(包括任何输入设备)以及这些数据的有效性检验规则。

详细描述从物理模型中的哪些表获取数据以及获取这些数据的条件。

3.2.1.1.4 输出数据

该模块无输出

详细描述子功能1所产生的数据以及这些数据的表现形式。

3.2.1.1.5 业务算法和流程

1.toString()方法:返回信息源+目的+信息主要内容;

2.getMsg()方法:返回信息源+信息内容;

从业务角度详细描述根据输入数据产生输出数据的业务算法和流程。

3.2.1.1.6 数据设计

src:消息来源,String类型;

dst:消息目的,String类型;

3.2.1.1.7 源程序文件说明

 

该模块位于TreeHouse/src/Bean/Msg目录下,每个类对应一个文件。

3.2.1.2 Bean直属模块

 

3.2.1.2.1 设计图

 

3.2.1.2.1 功能描述

用于容纳系统要用到的各种传输信息;

3.2.1.2.2源程序文件说明

 

该模块位于TreeHouse/src/Bean目录下;

Atticle.java           用于装置文章信息

Commit.java         用于转载评论信息

Group.java            用于转载社团信息

stateCode.java       用于转载状态码

User.java              用于转载用户信息

 

3.2.2 Client模块

该模块主要处理客户端事件

模块1主要分为以下几个子模块:子模块1、子模块2和子模块N。

3.2.2.1设计图

 

3.2.2.2功能描述

实现客户端UI界面的各种操作,包括:

(1)      登陆请求

(2)      注册请求

(3)      获取推荐文章

(4)      获取关注文章

(5)      刷新主页文章

(6)      获取文章评论

(7)      发表文章评论

(8)      发表我的文章

(9)      添加好友

(10)   删除好友

(11)   加入社团

(12)   创建社团

(13)   退出社团

 

简要描述子模块1的业务功能。

3.2.2.3输入数据

(1)      用户账号:acnt:String;非空,从UI界面传入;

(2)      用户密码:pswd:String;非空,从UI界面传入;

详细描述用户输入的数据(包括任何输入设备)以及这些数据的有效性检验规则。

详细描述从物理模型中的哪些表获取数据以及获取这些数据的条件。

3.2.2.4输出数据

(1)      登陆成功与否的状态信息:boolean类型

(2)      注册成功与否的状态信息:boolean类型

(3)      其他与服务器交互是否成的状态信息:boolean类型;

详细描述子功能1所产生的数据以及这些数据的表现形式。

3.2.2.5业务算法和流程

(1)      登陆:

输入账号acnt,密码pswd;

创建socket连接服务器,初始化消息处理线程MsgHandle;

创建控制信息msg=CtrlMsg(acnt,server, CtrlMsg.LOGIN,pswd);

通过MsgHandle.sendMsg(msg)将msg发送到服务器,并获得返回状态码;

如果状态码为:

        CtrlMsg.WRONG_PASSWORD :登陆失败,提示密码错误,返回false   CtrlMsg.NO_SUCH_USER :登陆失败,提示无此用户,返回false
        CtrlMsg.OPERATE_SUCCESS :登陆成功,返回true

(2)      注册:

输入账号acnt,密码pswd;

创建socket连接服务器,初始化消息处理线程MsgHandle;

创建控制信息msg=CtrlMsg(acnt,server, CtrlMsg.REGISTER,pswd);

通过MsgHandle.sendMsg(msg)将msg发送到服务器,并获得返回状态码;

如果状态码为:

        CtrlMsg.UID_ILLEGAL :登陆失败,提示非法用户名,返回false
        CtrlMsg.OPERATE_SUCCESS :登陆成功,返回true

 

(3)      其他操作:

依据输入创建相应控制信息;

通过MsgHandle.sendMsg()将信息发送到服务器,并获得返回状态码;

如果状态码为CtrlMsg.OPERATE_SUCCESS返回ture,否则返回false。

从业务角度详细描述根据输入数据产生输出数据的业务算法和流程。

3.2.2.数据设计

(1)      uid:String,用户id;

(2)      aid:String,文章id;

(3)      gid:String,社团id;

(4)      msg:Message,发送的信息;

(5)      stop:boolean,判断是否停止接受消息的状态码;

(6)      UserHandle.stateCode:StateCode ,用于存储返回的状态码;

给出本程序中的局部数据结构说明,包括数据结构名称,功能说明,具体数据结构说明(定义、注释设计、取值)等。相关数据库表,数据存储设计(具体说明需要以文件方式保存的数据文件名、数据存储格式、数据项及属性等。)

3.2.2.6源程序文件说明

 

位于TreeHouse/src/Client包下,包括

MsgHandle.java:负责消息的处理,包括发送和接受。

UserHandle.java:负责响应来自用户界面的各种请求。

给出本程序的各源程序文件的说明,包括源程序文件名称及其所在目录,功能说明,包含的前导文件及函数名称等。

3.2.2.7函数说明

(1)      UserHandle:

(1)public static boolean login(String acnt,String pswd)

输入用户账号和密码,返回登陆状态,

创建socket连接服务器,初始化消息处理线程MsgHandle;

创建控制信息msg=CtrlMsg(acnt,server, CtrlMsg.LOGIN,pswd);

通过MsgHandle.sendMsg(msg)将msg发送到服务器,并获得返回状态码;

如果状态码为:

        CtrlMsg.WRONG_PASSWORD :登陆失败,提示密码错误,返回false   CtrlMsg.NO_SUCH_USER :登陆失败,提示无此用户,返回false
        CtrlMsg.OPERATE_SUCCESS :登陆成功,返回true

(2)public static boolean register(String acnt,String pswd)

输入账号acnt,密码pswd;

创建socket连接服务器,初始化消息处理线程MsgHandle;

创建控制信息msg=CtrlMsg(acnt,server, CtrlMsg.REGISTER,pswd);

通过MsgHandle.sendMsg(msg)将msg发送到服务器,并获得返回状态码;

如果状态码为:

        CtrlMsg.UID_ILLEGAL :登陆失败,提示非法用户名,返回false
        CtrlMsg.OPERATE_SUCCESS :登陆成功,返回true

(3) public static boolean addFriend(String uid)

输入好友uid,返回添加成功与否信息

通过MsgHandle.sendCtrlMsg(uid, CtrlMsg.CHECK_USER),发送控制信息,获取返回状态字;

如果返回字为CtrlMsg.OPERATE_SUCCESS,则返回true,否则提示用户不存在,发货false;

(4)public static boolean joinGroup(String gid)

基本步骤同(3);

(5)public static boolean createGroup(String gid)

基本步骤同(3);

(6)public static boolean removeFriend(String uid)

基本步骤同(3)

(7)public static boolean quitGroup(String gid)

基本步骤同(3)

(8)public static void getCommit(int aid)

输入评论文章id

通过MsgHandle发送控制信息,消息目的为aid,控制码:CtrlMsg.GET_COMMIT

sendCtrlMsg(Integer.toString(aid),CtrlMsg.GET_COMMIT)

 

(9)public static void deliverCommit(int aid,String content)

输入为评论文章id,评论内容content;

创建评论new CmtMsg(user.getUid(),aid,content);

发送评论消息msgHandle.sendMsg();

(10)public static boolean deliverArticle(Article article)

输入为待发布文章,返回发布状态;

调用msgHandle.sendAtcMsg(article)发送文章;

返回true;

(11)public static boolean refreshArticle(boolean isRcmd)

输入为请求文章类型,返回请求结果

清空文章列表,清空文章摘要列表

如果是请求推荐文章,则调用

msgHandle.sendCtrlMsg(server,CtrlMsg.GET_RECOMMEND)获取推荐文章,

否则调用msgHandle.sendCtrlMsg(server,CtrlMsg.GET_SUBMIT)获取关注文章;

获取返回字,成功返回true,失败返回false;

(12)public static void showMsg(String msg)

输入提示信息

直接通过JOptionPane.showMessageDialog显示提示信息

(13)public static void showError(String msg)

输入错误信息

直接通过JOptionPane.showMessageDialog显示错误信息

 

(2)      MsgHandle

(1)public MsgHandle(User user)

该类的构造方法,利用user初始化消息处理者

初始化字段user,stop,os,is;

(2)public void setUid(String uid)

设置用户id;

设置uid字段和user的uid字段为输入字符串;

(3)public void run()

继承自Thread类的方法,负责接受消息;

当stop字段为false时:

通过对象输入流接受一个Message对象;

判断对象具体类型,如果:

为CtrlMsg,则调用handleCtrlMsg(),同时将状态码入队;

为FileMsg,调用FileMsg.receiveFile()方法接受文件,同时将消息加入消息队列;

为TextMsg,将消息加入消息列表;

为AtcMsg,获取消息中包含的文章,将其加入文章列表;

为CmtMsg,获取消息中包含的评论,将其加入当前评论列表;

(4)private void addMsgToList(Message msg)

负责将消息加入消息队列;

判断消息类型—好友消息/社团消息;

获取消息来源,将其加入对应列表;

(5)private void handleCtrlMsg(CtrlMsg msg)

处理控制消息;

判断控制消息的cmd字段,如果为:

CtrlMsg.OPERATE_SUCCESS:返回

CtrlMsg.ADD_USER:将dst字段加入好友列表,同时为其创建聊天消息列表
CtrlMsg.ADD_GROUP:将dst字段加入社团列表,同时为其创建聊天消息列表
CtrlMsg.DELETE_USER:删除dst对应的好友及聊天信息
CtrlMsg.DELETE_GROUP:删除dst对应的社团及聊天信息
CtrlMsg.DISCONNECT:调用close()关闭线程;

(6)public void sendMsg(Message msg)

通过对象输出流写出消息对象;

(7)public int sendCtrlMsg(String dst,int cmd,String msg)

通过传入信息直接构造CtrlMsg并调用sendMsg()发送;

(8)public int sendCtrlMsg(String dst,int cmd)

通过传入信息直接构造CtrlMsg并调用sendMsg()发送;

(9)public boolean sendTextMsg(String dst,String text,boolean isGMsg)

通过传入信息直接构造TextMsg并调用sendMsg()发送;

 

(10)public boolean sendFileMsg(String dst,File file,boolean isGMsg)

通过传入信息直接构造FileMsg并调用sendMsg()发送;

(11)public boolean sendAtcMsg(Article article)

通过传入信息直接构造AtcMsg并调用sendMsg()发送;

 

(12)public void close()

置stop字段为true;

通知用户服务器下线;

具体说明本程序中的各个函数,包括函数名称及其所在文件,功能,格式,参数,全局变量,局部变量,返回值,算法说明,使用约束等。

3.2.2.8其他说明

本模块负责响应来自UI界面的各种交换请求;

3.2.3 Server模块

本模块为服务器模块,主要负责处理来自用户的请求;

模块1主要分为以下几个子模块:子模块1、子模块2和子模块N。

3.2.3.1.1 设计图

 

3.2.3.1.2 功能描述

该模块负责处理来自用户的所有请求,包括:

(14)   处理登陆请求

(15)   处理注册请求

(16)   处理文章请求

(17)   处理评论请求

(18)   处理发布文章

(19)   处理用户添加好友

(20)   处理用户删除好友

(21)   处理用户加入社团

(22)   处理用户创建社团

(23)   处理用户退出社团

 

简要描述子模块1的业务功能。

3.2.3.1.3 输入数据

与用户连接的Socket对象;

详细描述用户输入的数据(包括任何输入设备)以及这些数据的有效性检验规则。

详细描述从物理模型中的哪些表获取数据以及获取这些数据的条件。

3.2.3.1.4 输出数据

打印出每一次请求的处理结果,输出到控制台;

详细描述子功能1所产生的数据以及这些数据的表现形式。

3.2.3.1.5 业务算法和流程

接受用户请求;

依据请求类型进行相应的处理;

从业务角度详细描述根据输入数据产生输出数据的业务算法和流程。

3.2.3.1.6 数据设计

(1)user:User,存储用户数据

(2)stop:boolean,结束线程标识

(3)ois:ObjectInputStream,用来接受用户输入

(4)oos:ObjectOutputStream,用来发送处理结果

(5)texArea:JTextArea,用于打印出所有连接日志

给出本程序中的局部数据结构说明,包括数据结构名称,功能说明,具体数据结构说明(定义、注释设计、取值)等。相关数据库表,数据存储设计(具体说明需要以文件方式保存的数据文件名、数据存储格式、数据项及属性等。)

3.2.3.1.7 源程序文件说明

 

MyDataBase.java:该类用于模拟数据库,存储服务器所有信息

ServerHandle.java:该类处理用户的各种请求;

给出本程序的各源程序文件的说明,包括源程序文件名称及其所在目录,功能说明,包含的前导文件及函数名称等。

3.2.3.1.8 函数说明

(1)public ServerHandle(Socket socket)

该类的构造方法,通过socke初始user,ois,oos字段

初始化stop字段;

(2)public void run()

继承自Thread的方法,负责接受消息并处理

当stop字段为false时:

读入一个消息对象,打印出其摘要;

判断其类型,如果为:

CtrlMsg,调用handleCommend()进行处理;

TextMsg,调用forward()进行处理;

FileMsg,调用forward()进行处理;

AtcMsg,获取包含文章,将其加入文章列表,初始文章评论;

CmtMsg,将评论加入对应评论列表;

(3)public void sendMsg(Message msg)

将消息直接通过对象输出流发送,并刷新对象输出流;

(4)public void forward(Message msg,User dst)

将msg转发给dst;

如果dst不为空并且不是当前用户

获取dst用户的输出流

通过dst的输出流写入消息并刷新流;

(5)public void forward(Message msg)

转发msg到指定对象;

如果msg是多人消息:

       通过消息的dst字段找到对应的社团;

       遍历该社团中的所有用户,调用forward(msg,dst)发送消息

否则:直接同消息的dst字段找到对应用户,调用orward(msg,dst)发送消息;

(6)public void handleCommend(CtrlMsg msg)

处理来自用户的控制信息;

创建一个标识符flag,用于判断后续操作类型;

创建两个CtrlMsg对象,ctrlMsg用于返回给该用户,notify用于通知其他用户,初始化       这两个对象的cmd字段为-1;

判断传入控制信息的cmd字段,如果为:

 

CtrlMsg.LOGIN:通过消息的src字段检查用户是否存在,不存在则设置ctrlMsg的cmd字段为:CtrlMsg.NO_SUCH_USER,否则检查用户表中对应项的密码与消息的msg是否匹配,匹配返回CtrlMsg.OPERATE_SUCCESS,不匹配返回CtrlMsg.WRONG_PASSWORD
 
CtrlMsg.REGISTER:首先检查用户表中是否有和src字段同名项,有则返CtrlMsg.UID_ILLEGAL,无则将用户加入用户表,同时返回CtrlMsg.OPERATE_SUCCESS
 
CtrlMsg.GET_RECOMMEND:返回CtrlMsg.OPERATE_SUCCESS,置flag为1;
 
CtrlMsg.GET_SUBMIT:返回CtrlMsg.OPERATE_SUCCESS,置flag为2;
 
CtrlMsg.GET_COMMIT:返回CtrlMsg.OPERATE_SUCCESS,置flag为3;
 
CtrlMsg.CHECK_USER:检查用户表中是否存在该用户,存在返回CtrlMsg.OPERATE_SUCCESS,不存在返回CtrlMsg.NO_SUCH_USER
 
CtrlMsg.JOIN_GROUP:检查对应gid是否存在,存在则将用户加入该gid对应表,返回CtrlMsg.OPERATE_SUCCESS,否则返回CtrlMsg.NO_SUCH_GROUP
 
CtrlMsg.ADD_GROUP:检查group表中gid是否存在,不存在则创建一个社团gid,返回CtrlMsg.OPERATE_SUCCESS否则返回CtrlMsg.GID_ILLEGAL
 
CtrlMsg.QUIT_GROUP:检查对应gid列表是否存在,存在则将用户从表中移除,返回CtrlMsg.OPERATE_SUCCESS
CtrlMsg.ADD_USER:检查用户表中是否存在该用户,存在返回CtrlMsg.OPERATE_SUCCESS,不存在返回CtrlMsg.NO_SUCH_USER
 
CtrlMsg.DELETE_USER:直接返回CtrlMsg.OPERATE_SUCCES
 
CtrlMsg.DISCONNECT:返回CtrlMsg.OPERATE_SUCCES,同时置nitify的cmd字段为CtrlMsg.DELETE_USER

 

发送ctrlMsg,同时判断notify的cmd字段是否为-1,不是则调用sendToAll()发送通知;

判断flag标志,若为:

0:直接返回;

-1:调用close();

1:调用sendArticle(1)返回文章;

2:调用sendArticle(2)返回文章;

3:调用sendCommit()返回评论;

(7)public void sendArticle(int flag)

做5次循环:

生成一个随机数;

依据这个随机数从文章列表中选出一篇文章;

调用sendMsg()发送该文章;

(8)public void sendCommit(String aid)

依据输入的aid找到对应的评论列表;

遍历所有评论,通过sendMsg()返回评论;

(9)public void sendToAll(Message msg)

遍历用户列表:

获取每个用户的输出流,向其中写入消息;

(10)public void close()

置stop字段为true;

将用户从用户表中移除

释放user占用资源;

打印用户离线消息;

具体说明本程序中的各个函数,包括函数名称及其所在文件,功能,格式,参数,全局变量,局部变量,返回值,算法说明,使用约束等。

 

3.2.4 UI模块

该模块负责显示界面

3.2.4.1设计图

 

3.2.4.2功能描述

负责向用户显示操作界面,接受键盘和鼠标事件

简要描述子模块1的业务功能。

3.2.4.3输入数据

键盘输入—文本输入

鼠标事件—右击、左击、滚动

详细描述用户输入的数据(包括任何输入设备)以及这些数据的有效性检验规则。

详细描述从物理模型中的哪些表获取数据以及获取这些数据的条件。

3.2.4.4输出数据

界面显示的文本及对话框

详细描述子功能1所产生的数据以及这些数据的表现形式。

3.2.4.5业务算法和流程

获取用户输入

对输入进行合法性检查

将合法数据传入UserHandle进行相应操作

对不合法输入进行提示;

依据UserHandle的反馈显示相应界面,界面具体数据由UserHandle进行填充;

从业务角度详细描述根据输入数据产生输出数据的业务算法和流程。

3.2.4.6数据设计

(1)Server:

       max:int:定义最大连接数;

       port;int:定义连接端口;

       count:int:当前连接用户数;

       serverThread:ServerThread:负责接受客户socket的线程;

(2)Client:

       frame:JFrame:视图框架;

       main:JPanel:主面板;

       account:JTestField:账号输入框;

       passward:JPasswordField:密码输入框;

       ensure_pswd:JPasswordField:密码确认框;

 

给出本程序中的局部数据结构说明,包括数据结构名称,功能说明,具体数据结构说明(定义、注释设计、取值)等。相关数据库表,数据存储设计(具体说明需要以文件方式保存的数据文件名、数据存储格式、数据项及属性等。)

3.2.4.7源程序文件说明

 

该模块位于TreeHouse/src/UI包下面;

(1)    包BasePanel

定义了主界面

其中ServerPanel为服务器主界面,CardPanel为客户端主界面

(2)    包Component

一些自定义的组件

CircleButton:圆形按钮;

MultiComboBox:多选下拉框;

MultiPopub:多选弹出框;

MyListCellRenderer:为JList绘制边框;

(3)    包Pages:

Page1:主界面页面1,显示文章界面

Page2:主界面页面2,显示设计面板;

Page3:主界面页面3,显示个人设置;

(4)    包subPage

AddObject:添加对象输入框;

ReadArticle:文章详情窗口;

WriteArticle:编辑文章窗口;

(5)    Client:程序入口,同时显示登陆和注册界面;

(6)    Server:程序入口,显示服务器后台界面;

给出本程序的各源程序文件的说明,包括源程序文件名称及其所在目录,功能说明,包含的前导文件及函数名称等。

3.2.4.8函数说明

对UI模块无意义

具体说明本程序中的各个函数,包括函数名称及其所在文件,功能,格式,参数,全局变量,局部变量,返回值,算法说明,使用约束等。

 

4. 接口设计

4.1 内部接口

4.1.1 客户端

4.1.1.1 接口说明

UI界面接口:

(1)DefaultListModel cmtList;   向主界面添加评论
(2)DefaultListModel atcList;   向主界面添加文章
(3)DefaultListModel userList;  向主界面添加好友
(4)DefaultListModel groupList; 向主界面添加社团
(5)List<Article> articles;             向主界面添加文章详情
(6)List<DefaultListModel> userChat;    向主界面添加用户聊天信息
(7)List<DefaultListModel> groupChat;   向主界面添加社团聊天信息

MsgHandel:

(1)    Message msg:要发送的信息

4.1.1.2 调用方式

UI界面:通过对象的句柄直接调用响应方法即可改变主界面显示内容;

MsgHandle:调用其sendMsg(Message msg)以及基于该方法的拓展方法即可将消息发送到服务,返回控制消息消息的状态码(如果有的话)。

4.1.2 服务器

4.1.2.1 接口说明

UI界面接口:

DefaultListModel userModel;    向主界面添加用户
DefaultListModel groupModel;   向主界面添加社团

ServerHandle:

       Socket socket:要处理用户的套接字

4.1.2.2 调用方式

UI界面接口:直接改变对应模型数据即可改变主界面的显示

ServerHandle:通过socket指定要处理的对象,没有返回值;

4.2 外部接口

4.2.1 接口说明

ObjectInputStream ois;

ObjectOutputStream oos;

例如:xx子系统通过xx从xx子系统取得xx等,相关标准,调用示例,可根据需要增加章节描述接口。

4.2.2 调用方式

通过oos.writeObject(obj)方法即可向服务器/客户端发送对象;

通过ois.readObject(obj)方法即可获得服务器/客户端传输的对象;

例如:内部接口调用:

例:

/**

*通过用户服务号码取得该客户认证密码等信息,如果该客户存在返回为0,其他情况参考错误编码

*/

public  RUserInfo  getUserInfo (String userNo);

5. 数据库设计

本项目暂未使用数据库。

详见[xxx数据库设计说明书]

如果数据库设计内容比较少,则直接在此处描述。

6. 系统安全保密设计

6.1 说明

保证只有合法用户(已注册)才能登陆本系统。

例如:由于存在与外部系统的接口,所以需要考虑访问安全的问题.

6.2 设计

在用户登陆系统时进行身份验证。

例如:分为数据传输部分,IP过滤部分,身份验证部分.[章节可补充]

6.2.1 数据传输部分

暂未对传输数据加密。

例如:在部分数据传递的时候,考虑以https协议,需要在部署的时候作相关处理.

6.2.2 IP过滤分部

只有内网用户才能登陆本系统地址。

例如:可在系统前端通过Filter实现,该Filter实现对该地址访问的IP过滤作用.可信任IP地址通过xml文件进行配置.

6.2.3 身份验证部分

在用户登陆时将用户信息发送到服务器,进行合法性检查后返回登陆状态。

例如:对信任的用户,颁发身份验证码,通过该标识进行身份识别.

 

7. 系统性能设计

使用生产者—消费者模型:

客户端获得服务器返回的状态码后,直接将状态码压入队列,之后继续执行,不再等待其他线程取走状态码;其他线程要使用状态码时都从队列中获得,平衡了系统的处理能力。

8. 系统出错处理

8.1 登陆时服务器未上线

 

 

8.2 登陆时用户名或密码未填写:

 

8.3 登陆账户不存在

 

8.3登陆密码错误

 

8.4注册时信息不完整

 

 

8.5注册时两次输入密码不一致

 

 

8.6 尝试添加不存在的用户为好友

 

8.7 尝试加入不存在的社团

 

8.8 发布文章时未写标题或正文

 

8.9 服务器下线

 

例如:为了在系统出现异常情况下给用户以明确的提示,可采用两种方式予以提示:

1.使用javascript的alert()函数直接提示,这主要在输入或修改的情况下使用;

2.使用统一的错误界面提示,该界面对应于errorpage.jsp页面。错误界面样式如下图所示:









































































以上是关于树屋详细设计文档的主要内容,如果未能解决你的问题,请参考以下文章

树屋测试计划文档

BZOJ2822: [AHOI2012]树屋阶梯

[AHOI2012]树屋阶梯 题解(卡特兰数)

树屋阶梯(codevs 1741)

vbscript 各种自定义代码片段 - 有关详细信息,请参阅注释

css 选择者(树屋)