《OA办公管理系统详细设计说明书.docx》由会员分享,可在线阅读,更多相关《OA办公管理系统详细设计说明书.docx(64页珍藏版)》请在三一办公上搜索。
1、OA协同办公系统详细设计说明书书1引言41.1编写目的41.2背景41.3基线41.4范围41.5定义41.6参考资料42总体设计52.1概述52.1.1功能描述52.2运行环境52.2.1软件环境52.2.2硬件环境52.3开发环境62.3.1服务器软件环境62.3.2服务器硬件环境62.3.3开发机器软件环境62.3.4开发机器硬件环境62.4设计思想72.4.1系统构思72.4.2关键技术与算法72.4.3关键数据结构82.4.4人工处理过程93子系统模块设计93.1工作管理模块93.2在线信息子系统193.2.1模块1203.2.2模块2203.2.3模块3213.2.4模块4213.
2、2.5模块5213.2.6模块6223.2.7模块7223.3公司通讯录子功能263.4扩展功能模块303.5系统管理模块393.6名片夹管理模块453.7个人信息管理模块513.8会议室管理模块573.9会议管理671 引言1.1 编写目的本说明书目的在于明确说明协同办公系统各功能的实现方式,指导开发员进行编码。本说明书的预期读者为:项目组内成员、其他开发项目组成员、指导老师1.2 背景待开发软件系统的名称:协同办公系统此软件系统任务提出者:卢宝波此软件系统任务开发者:程之兴、姬广钊、钟晨、俞斐、施会华此软件系统任务用户:OA协同工作系统的用户1.3 基线OA协同办公系统需求说明1.4 范围
3、系统包括的范围:个人办公、会议管理,系统管理。1.5 定义读者设置:指将读者权限授予别人,拥有读者权限的用户可以看到自己工作安排。代办工作:指将代办权限授予别人,拥有代办权限的用户除可以看到自己的工作外还可以给自己安排工作。 待办工作:指等待员工自己去完成的工作。1.6 参考资料需求分析说明书、概要设计说明书_v1.4.doc、Oracle数据库使用教程、Ora9iSQLRef.chm、Oracle数据库使用帮助文档、CSS中文教程、HTML 开发手册、JAVA高级编程指南、JSP应用开发详解、功能结构图。2 总体设计2.1 概述2.1.1 功能描述 本系统分为三个主要流程:1、个人办公 2、
4、会议管理 3、系统管理 个人办公:普通职员登陆到系统后,通过点击个人办公连接,进入个人办公页面。之后可以选择个人信息、日程安排、名片夹、公司通讯录、待办事项、在线信息、个人文件夹进行办公。会议管理:部门领导登陆到系统后选择会议管理,进入会议管理页面。在会议管理页面中可以增、删、改、查会议。其中发起会议需首先预约会议室,然后将输入与会人名单,开会议信息通过邮件发送到每个与会人的信箱里。系统管理:系统管理员登陆到系统后,点击系统管理,进入系统管理页面。可以选择部门管理、角色管理、职员管理、文件夹管理进行系统维护。2.2 运行环境2.2.1 软件环境分类名称版本语种操作系统Microsoft win
5、dows 2003中文操作系统的附加功能无数据库平台Oracle9.2i/10g中文数据库平台补丁无应用平台tomcat6.0英语应用平台补丁无客户端软件无2.2.2 硬件环境服务器最低配置推荐配置应用和数据库服务器Tomcat6.0JBoss5 weblogic102.3 开发环境2.3.1 服务器软件环境分类名称版本语种操作系统Microsoft windows 中文操作系统的附加功能无数据库平台Oracle9.2i/10g中文数据库平台补丁无应用平台应用平台补丁无版本控制系统SVN英文客户端软件无2.3.2 服务器硬件环境服务器最低配置推荐配置应用服务器、数据库服务器、邮件服务器、目录服
6、务器Tomcat6.0JBoss 5/weblgic10AccessOracle 9.2i/10g2.3.3 开发机器软件环境分类名称版本语种操作系统Microsoft windowsXp/win7中文操作系统的附加功能无数据库平台Oracle9.2i/10g中文应用平台开发平台客户端软件2.3.4 开发机器硬件环境分类最低配置推荐配置开发机器2.4 设计思想2.4.1 系统构思系统功能结构图 见 系统功能结构图.doc系统实现结构图 2.4.2 关键技术与算法2.4.2.1 预约会议室冲突检查会议室预约中需要对新预约的会议室与原有预约安排比对,在时间上进行冲突检测,如果有冲突提示日程安排冲突
7、,预约失败。日程管理类冲突检测算法:算法首先查找设定的预约时间内由那些会议室可以被预约。算法步骤:判断用户输入的预约时间,比较输入的预约开始时间与预约表中会议的结束时间,将预约开始时间后于愉悦表中结束时间的会议室ID号选出,放入一个ArrayList中,然后在会议室表中选择会议室ID在ArrayList中的会议室,显示给用户。2.4.3 人工处理过程人工处理过程原因输入输出处理过程数据库数据备份保障数据安全数据库操作命令关键数据、当日数据库的运行日志数据库使用率最低时备份可恢复数据,存档数据库数据维护维护数据库性能数据库操作命令数据库相关参数状态日志在规定的日期内完成对数据库的状态检测3 子系
8、统模块设计3.1 工作管理模块模块名称权限管理功能描述为员工提供工作安排维护和查询功能,系统根据设定时间将提示内容发布到该员工的工作安排中。员工可以设置自己的工作安排的读者,以便别人知道自己的安排;也可以将自己的工作安排权限开放给指定的人,以便别人替自己安排工作。此模块包含的功能有:读者设置、代办设置、日历查看。接口与属性用户与接口ManageWork交互进行相关的操作。ManageWork接口中包含的操作有:代办管理功能:CommissionAdd():添加代办功能。该函数通过与Commission对象类关联得到操作所需要的数据。其中Commission类中的属性有:private Stri
9、ng sender_id; /将要设置代办的系统用户idprivate String use_id; /将要被设置为代办的系统用户idprivate String department; /将要被设置为代办的系统用户的部门 private String position; /将要被设置为代办的系统用户的职位Commission类中包含的主要方法有:上述各属性的get()、set()方法ManageWork类中的CommissionAdd()方法将通过Commission类的实例调用相应的get()、set()方法得到或传入数据CommissionAdd()方法中将实例化数据库的对象,完成添加代
10、办的工作。在添加代办之前方法将优先进行加入人员id的检测,若用户已在代办列表中则将提示用户并拒绝重复加入代办。如果欲加入的代办不在该用户的代办列表中则加入该代办,并进行相应的页面跳转,显示该用户所有的代办列表。CommissionDelete():删除代办功能。该函数通过与Commission对象类关联得到操作所需要的数据。其中Commission类中的属性有:private String sender_id; /将要设置代办的系统用户id private String user_id; /将要被设置为代办的系统用户idCommission类中包含的主要方法有:上述各属性的get()、set(
11、)方法ManageWork类中的CommissionDelete()方法将通过Commission类的实例调用相应的get()、set()方法得到或传入数据ManageWork类中的CommissionDelete()方法将通过Commission类的实例调用相应的get()、set()方法得到或传入数据CommissionDelete()方法中将实例化数据库的对象,完成删除代办的工作。在删除代办之前系统将给出相应删除提示,在用户确认删除后对数据库进行删除操作,并进行相应的页面跳转,显示该用户删除该代办后的所有的代办列表。读者管理功能:ReaderAdd():添加读者功能。该函数通过与Read
12、er对象类关联得到操作所需要的数据。其中Reader类中的属性有:private String icus_user_id; /将要设置读者的系统用户id private String iaro_role_id; /将要被设置为读者的系统用户id private String icus_user_name; /将要被设置为读者的系统用户的姓名private String department_name;/将要被设置为读者的系统用户所在的部门private String position_name;/将要被设置为读者的系统用户的职位Reader类中包含的主要方法有:上述各属性的get()、set(
13、)方法CommissionManage类中的ReaderAdd()方法将通过Reader类的实例调用相应的get()、set()方法得到或传入数据ReaderAdd ()方法中将实例化数据库的对象,完成添加读者的工作。在添加读者之前方法将优先进行加入人员id的检测,若用户已在读者列表中则将提示用户并拒绝重复加入读者。由于根据系统规格说明的相关说明,代办的权限大于读者的权限,即代办自动拥有读者的全部权利,因此如果欲加入读者是当前用户的代办则系统同样拒绝加入该读者。如果欲加入的代办不在该用户的读者列表中则加入该读者,并进行相应的页面跳转,显示该用户所有的读者列表。ReaderDelete():删除
14、读者功能。该函数通过与Reader对象类关联得到操作所需要的数据。其中Reader类中的属性有:private String icus_user_id; /将要设置读者的系统用户id private String iaro_role_id; /将要被设置为读者的系统用户id private String icus_user_name; /将要被设置为读者的系统用户的姓名private String icde_department_name;/将要被设置为读者的系统用户所在的部门private String user_position_name;/将要被设置为读者的系统用户的职位Reader类中
15、包含的主要方法有:上述各属性的get()、set()方法CommissionManage类中的ReaderDelete()方法将通过Reader类的实例调用相应的get()、set()方法得到或传入数据ReaderDelete()方法中将实例化数据库的对象,完成删除读者的工作。在删除读者之前系统将给出相应删除提示,在用户确认删除后对数据库进行删除操作,并进行相应的页面跳转,显示该用户删除该读者后的所有的读者列表。采用日历控件输入时间功能:根据需求规格说明书的要求,系统将提供给用户日历查询功能,以方便其对于工作的管理。在此通过javascript语言实现日历的显示与查询功能。用户可以通过在tex
16、tbox中输入所需的年份,在下拉列表中选择相应的月份,提交察看所需日期的具体情况。数据结构与算法 判断欲加入代办的存在性:判断欲加入代办是否已在用户的代办列表中主要通过session中存储的登陆用户信息及数据库中表间外键联系,构造sql语句得到相应的结果集。若该查询的结果集为空则说明欲加入代办不在用户的代办列表中,进行加入操作。否则系统给出提示信息。 通过页面加入代办的主要数据结构:根据需求规格说明书的相应要求,用户提出相应的代办操作申请后,系统将给出组织结构图,只有通过组织结构图用户才能进行相应的操作。组织结构图的每个系统用户名的前部都将设有复选框。用户通过勾取所需的用户进行相关的增加或删除
17、操作。系统采用struts架构,页面的复选框属性将作为String型的数组传入系统后台的功能模块层。通过相应的函数确定是否选重的属性。根据该属性关联的icus_user_id系统用户id对相关的数据库表格进行操作。 利用javascript实现日历功能的设计因素:在工作管理的多个模块的需求描述中都明确提到了需要日历的查询和使用功能。但从系统的整体出发,日历的使用范围基本局限于工作管理部分,因此考虑使用javascript减轻系统负担,方便用户使用。模块名称工作维护功能描述为员工提供工作安排维护和查询功能,系统根据设定时间将提示内容发布到该员工的工作安排中。此模块包含的功能有:工作安排、综合查询
18、。接口与属性所有的的操作基于Work实体类完成。Work类中的属性包括: Private Integer worked ,/系统为工作自动分配的ID号 Private userID;/工作执行人的ID号 Private FromID;/工作安排人的 ID号 private String start_date; /工作开始日期 private String end_date; /工作结束日期 private String work_content; /工作内容 private String work_title; /工作标题Work类中包含的主要方法有:上述各属性的get()、set()方法工作
19、维护功能:Add_Work():添加工作功能。该函数通过与对象类关联得到操作所需要的数据。Work类中包含的主要方法有:上述各属性的get()、set()方法WorkManage类中的WorkAdd()方法将通过work类的实例调用相应的get()、set()方法得到或传入数据WorkAdd()方法中将实例化数据库的对象,完成添加工作的工作。在添加工作之前进行申请加入操作人员id的检测,若工作执行人为登陆用户本身,或者登陆用户的被执行代办人,则在该用户提交申请后系统自动进行工作冲突的检测。若工作检测后系统返回值为非冲突,则加入该工作,否则系统提示用户相关的信息并拒绝加入工作。WorkDelet
20、e():删除工作功能。该函数通过与Work对象类关联得到操作所需要的数据。WorkManage类中的WorkDelete()方法将通过Work类的实例调用相应的get()、set()方法得到或传入数据Workdelete()方法中将实例化数据库的对象,完成删除工作的工作。在删除工作之前方法将优先进行申请删除操作人员id的检测,若工作执行人为登陆用户本身,或者工作的安排人,则系统将给出相应删除提示,在用户确认删除后对数据库进行删除操作,并进行相应的页面跳转,显示该用户删除该工作后的所有的工作列表。WorkSearch():包括综合查询的日历查询 查询工作功能。该函数通过与Work对象类关联得到操
21、作所需要的数据。WorkManage类中的WorkSearch()方法将通过Work类的实例调用相应的get()、set()方法得到或传入数据WorkSearch()方法中将实例化数据库的对象,完成查询工作的工作。根据需求规格说明书的要求:可以通过:1,工作执行人,执行人所在部门,执行人职位或者2,工作安排的时间字段查找相应的工作。从在系统进行工作查询后将通过页面显示工作列表。在用户输入多条查询条件的情况下,采用部分匹配策略,即数据库中有部分符合输入条件的数据而非全部符合条件的记录。WorkEdit():修改工作功能。该函数通过与Work对象类关联得到操作所需要的数据。WorkManage类中
22、WorkEdit()方法将通过Work类的实例调用相应的get()、set()方法得到或传入数据WorkEdit()方法中将实例化数据库的对象,完成修改工作的工作。在修改工作之前方法将优先进行申请加入操作人员id的检测,若工作执行人为登陆用户本身,或者原工作的安排人且依然则在该用户提交申请后系统自动进行工作冲突的检测。若工作检测后系统返回值为非冲突,则修改该工作,否则系统提示用户相关的信息并拒绝加入工作。数据结构与算法检测工作冲突功能:根据需求规格说明书的要求,系统将提供给用户工作冲突检测功能,以方便其对于工作的管理。检测工作冲突主要侧略为:优先检测工作执行人欲安排的工作与其已有的工作安排的冲
23、突。检测过程中需要三步判断:1.1) 欲安排工作起始日期之间是否有其它的工作安排1.2) 欲安排工作起始日期是否在其它已安排工作之间1.3) 欲安排工作结束日期是否在其他已安排工作之间若有没有冲突则安排工作否则系统给出错误信息。检测人员权限功能:根据系统规格说明书的相关说明,不同权限的用户对于工作安排的操作的权限是不同的,检测的策略为:1 根据session中的信息判断登陆用户是否工作管理相关操作的责任人2 根据读者&代办表中的相关记录判断工作管理相关操作责任人是否具有代办的权限。补充说明 bb模块名称待办事项模块功能描述此模块实现了对待办事项的增加、删除、显示以及所有日程安排清单的按日期排序
24、显示功能。接口与属性抽象类BaseOperate:抽象方法sortAccordToTime:输入参数:要排序的对象列表 List obj输出参数:无返回值:排序好的对象列表: List objaddWork:输入参数:要插入的待办事项对象的引用 Work bus输出参数:无返回值:bool类型,插入成功与否deleteWork:输入参数:要删除的待办事项的ID int workID输出参数:无返回值:bool类型,删除成功与否display():输入参数:无输出参数:要显示的对象列表返回值:bool类型,显示成功与否displayAll():输入参数:无输出参数:要显示的对象列表返回值:boo
25、l类型,显示成功与否PendingWorkOperate:sortAccordToTime:输入参数:要排序的Work(PendingWork)对象列表 List pbu输出参数:无返回值:排序好的对象列表: List pbuaddWork:输入参数:要插入的待办事项对象的引用 Work bus输出参数:无返回值:bool类型,插入成功与否deleteWork:输入参数:要删除的待办事项的ID int id输出参数:无返回值:bool类型,删除成功与否display():输入参数:无输出参数:要显示的对象列表返回值:bool类型,显示成功与否displayAll():输入参数:无输出参数:要显
26、示的对象列表返回值:bool类型,显示成功与否数据结构与算法对象类Work:与数据库中的Work表的各个字段相对应序列号 ID Integer名称 name String负责人 person String起始时间 start_Date time结束时间 end_Date time事项内容 workContent String事项标题 workTitle String是否完成 done bool补充说明工作安排类图:权限设置类图序列图:工作安排维护序列图:工作安排维护扩展序列图:他人工作安排查询序列图:他人工作安排查询扩展序列图:读者权限维护序列图:读者权限维护扩展序列图:代办权限维护序列图:代
27、办权限维护扩展序列图:3.2 在线信息子系统模块名称在线信息模块功能描述本子系统主要为用户提供留言交流的平台,用户可以发送留言,接收留言,查看留言以及对留言进行查询,回复,删除等操作接口与属性主要由MessageManage类通过操纵Message类实现对留言的管理、接收、发送等。1其中Message类主要属性包括:Int fromID /留言发送者员工号String fromName /留言发送者姓名Int toID /留言接收者员工号String toName /留言接收者姓名String title /留言主题String content /留言内容Date date /留言日期Int
28、messageNumber /留言编号int issent /判断留言是否已经发送int isReaded /判断留言是否已经被阅读int from_delete /判断发送者是否将留言删除int to_delete /判断接收者是否将留言删除主要接口与方法有:对类中每个属性的get()与set()方法2MessageManage属性包括:Boolen isOK /判断对留言的操作是否成功接口与方法包括:saveMessage() /保存留言editMessage() /编辑留言see Message() /查看留言send Message() /发送 留言search Message() /
29、查询留言add Message() / 添加留言delete Message() /删除留言replay Message() /回复留言数据结构与算法数据库语句实现功能。补充说明3.2.1 模块1模块名称发送留言功能描述指利用系统发送短消息。用户点击“发送”后,系统将留言写进数据库,并将int issent改为1。接口与属性MessageManage类通过Message类的get()与set()方法实现对留言的管理。sendMessage()函数实现发送留言功能。输入参数有int toID, String toName ,String title String content, Date da
30、ta。返回值为Boolean isOK.sendMessage()方法将实例化Message对象,通过调用该对象的方法,来获取留言的基本信息,然后实习留言的发送功能。数据结构与算法数据库语句实现功能。补充说明3.2.2 模块2模块名称保存留言功能描述指利用系统保存短消息。用户点击“保存”后,系统将留言写进数据库,并将int issent改为0。接口与属性MessageManage类通过Message类的get()与set()方法实现对留言的管理。saveMessage()函数实现保存留言功能。输入参数有int toID, String toName, int toID, int toName
31、, Date date, String title, String content 。返回值为Boolean ok.saveMessage()方法将实例化数据库对象,然后对留言信息进行验证,验证通过后将其保存在数据库中,返回保存成功的信息。数据结构与算法数据库语句实现功能。补充说明3.2.3 模块3模块名称查找留言功能描述指利用系统查找短消息。用户输入查询条件,点击“查找”后,系统将从数据库中查找,并将结果返回。接口与属性MessageManage类通过Message类的get()与set()方法实现对留言的管理。searchMessage()函数实现查询留言功能。输入参数有String na
32、me, int fromID,int toID searchMessage()将实例化数据库对象,通过查询条件对数据库进行查询操作,然后将查询结果以列表的实行返回给用户。数据结构与算法数据库语句实现功能。补充说明3.2.4 模块4模块名称查看留言功能描述指利用系统查看短消息。用户点击某条留言后,系统将具体内容返回,并将boolean isreaded改为true。接口与属性MessageManage类通过Message类的get()与set()方法实现对留言的管理。seeMessage()函数实现查看留言。输入的参数有int messageNumberseeMessage()将实例华数据库对象
33、,通过int messageNumber在数据库中查找信息,将结果返回给用户,进行查看数据结构与算法数据库语句实现功能。补充说明3.2.5 模块5模块名称删除留言功能描述指利用系统删除短消息。用户选定留言后,系统将boolean from_delete或to_delete改为true。接口与属性MessageManage类通过Message类的get()与set()方法实现对留言的管理。deleteMessag()函数实现删除留言功能。输入参数有int messageNumber。返回值为Boolean isOK. deleteMessag()将实例化数据库对象,在验证完用户要删除的留言之后回
34、返回一个确认信息,如果用户确定删除,将删除留言在数据库中的记录。数据结构与算法数据库语句实现功能。补充说明3.2.6 模块6模块名称更改留言功能描述指利用系统更改未发送的短消息。用户选择某条未发送留言,点击详“细信息”后,系统将从数据库取出。再点击“编辑”,对该留言进行编辑接口与属性MessageManage类通过Message类的get()与set()方法实现对留言的管理。editMessage()函数实现编辑留言功能。输入的参数有int toID, String toName, String title, String content editMessage()将实例化数据库对象,在获取用
35、户的更改信息之后,返回确认信息,待用户确认更改后,进行数据库的更新操作。数据结构与算法数据库语句实现功能。补充说明3.2.7 模块7模块名称回复留言功能描述指利用系统回复短消息。用户查看某条留言,点击“回复”后,系统将留言引入到写留言中,并将留言的fromID付给新建留言的toID。fromName付给新建留言的toName。接口与属性MessageManage类通过Message类的get()与set()方法实现对留言的管理。replyMessage()函数实现回复留言功能。输入的参数有int toID, String toName replyMessage()将实例化Message类对象,
36、将收到的信息的发送人ID,Name 作为新的参数写入新的回复留言,之后调用sendMessage()方法发送留言。数据结构与算法数据库语句实现功能。补充说明类图:1.查询留言时序图2.查询留言扩展时序图:3.维护留言时序图4.维护留言扩展时序图5.发送留言时序图6.3.3 公司通讯录子功能模块名称公司通讯录功能描述为职员提供查询公司所有员工通讯录的功能,系统根据设定的查询条件将查询结果显示给用户中。职员可以将查询的结果导出为excel保存到自己本机选定的地址。此模块包含的功能有:查询通讯录 导出位excel。接口与属性用户与接口UserMange交互进行查询的操作。在本子功能中只用到UserM
37、anage接口中包含的查询操作。该子功能包含的功能有:1. 查询公司通讯录getAttribute():获得查询条件。该函数接受从页面传过来的参数作为查询条件,查询所需要的数据。getAttribute()调用UserManage接口的searchUser方法,查找用户要查询的用户通讯录,以列表的方式显示给用户。2. 导出为Excel用户查询出通讯录之后可以点击“导出为Excel”,弹出导出为Excel,用户指定文件导出路径,将表格导出。本功能用到jxl.jar包,具体实现方法为:public boolean export(String sql,String name,OutputStream
38、 os) targetFile+=/abc+.xls; System.out.println(!); content=getContent(sql);/以向量的形式存放所有的记录 /String path=context.getRealPath(targetFile); try Vector inner=null; String value=;/存放在cell中的文本值 int num=0;/存放在cell中的数字值 /OutputStream os=new FileOutputStream(path); WritableWorkbook workbook=Workbook.createWor
39、kbook(os);/创建工作薄 WritableSheet worksheet=workbook.createSheet(record,0);/创建第一个工作表,name:工作表名称 Label label=null;/用于写入文本内容到工作表中去 jxl.write.Number nmb=null;/用于写入数值到工作表中去 /开始写入第一行,即标题栏 for(int i=0;ititle.length;i+) label=new Label(i,0,titlei);/参数依次代表列数、行数、内容 worksheet.addCell(label);/写入单元格 /开始写入内容 for(in
40、t i=0;icontent.size();i+) inner=(Vector)content.get(i);/获取一条记录 for(int j=0;jinner.size();j+) /一个一个字段的放入excel中去 if(j=1|j=3)/插入的数值 Integer num_=(Integer)inner.get(j); num=num_.intValue(); nmb=new jxl.write.Number(j,i+1,num); worksheet.addCell(nmb); else value=(String)inner.get(j); label=new Label(j,i+1,value); worksheet.addCell(label); workbook.write(); workbook.close();