目 录
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).连接Socket:public 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页面。错误界面样式如下图所示:
原文地址:https://www.cnblogs.com/geminit369/p/9230944.html