《社团管理系统》详细设计说明书.pdf
详细设计说明书V1.0(版本号)拟 制 人审 核 人 年月日 目录1.引言 .31.1 编写目的.31.2 项目背景.31.3 定义 .31.4 参考资料.32.总体设计.42.1 需求概述.42.2 软件结构.53.程序描述.63.1 功能 .63.2 性能 .83.3 运行环境及设备要求.93.4 算法 .93.5 程序逻辑.21 3.6 数据库设计.22 3.7 测试要点.25 1.引言1.1 编写目的本说明书在概要设计的基础上,对信息发布系统的各模块、程序分别进行了实现层面上的要求和说明。1.2 项目背景项目全称:理工学院社团管理系统项目发起者:09 软件工程 2 班 DWLGY小组项目开发者:09 软件工程 2 班 DWLGY小组项目用户:理工的广大师生1.3 定义USE CASE 用例会员社团管理系统中合法的注册用户游客未注册或者未登录的社团管理系统平台浏览者管理员系统的管理者1.4 参考资料1 天极网新技术研究室.ASP.NET完全入门.人民邮电,2001.6 2 Sanjeev Rohilla 等著,君等译.ADO.NET专业项目实例开发.中国水利水电,2003.5 3 启明工作室编著.ASP.NET网络应用系统开发与实例.人民邮电,2005.7 4 王华杰,律松一波等编著.C#数据库开发技术.清华大学,2003.2 5 攀建编著.ASP.NET+ADO.NET 项目开发实例.清华大学,2004.1 6(美)A.Russell Jones著,高春蓉等译.ASP.NET从入门到精通.电子工业出版,2002.1 7 Scott Worley 著,王文龙湘宁译.ASP.NET技术幕.人民邮电,2002.4 8 Russ Basiura等著,浩译.ASP.NET Web 服务高级编程.清华大学,2003.2 9(美)Angshuman Chakraborti 等著,唐云深,世华等译.NET Framework 专业项目实例开发.中国水利水电,2003.6 10 Scott Allen 等著.C#数据库入门.郝启堂哲峰译.清华大学,2003.2 11(美)微软公司著.NET框架 1.1 类库参考手册.清华大学,2004.1 12 Steve Walther 著.ASP.NET:Tips,Tutorials,and Code.电子工业,2003.7 13(美)Jeffrey Richte 著.Microsoft.NET Frameworks.清华大学,2003.4 14 Alex Homer 等.ASP.NET Web Forms Programming.清华大学,2003.1 2.总体设计2.1 需求概述社团管理系统需要满足来自三方面的需求,这三个方面分别是会员、社团和管理员。会员的需查询院系各社团的活动情况、会员参加的各个社团情况及会员信息的修改;社团需对会员参加社团、注销社团的基本情况进行操作;社团管理系统的管理员的功能最为复杂,包括对会员、社团的活动等各方面的信息进行管理和统计,及系统状态的查看、维护并生成会员社团统计表。会员可以直接查看参加社团及社团活动情况,会员可以根据本人学号和密码登录系统,还可以进行对本人参加社团情况的查询和维护部分个人信息以及各社团的活动安排等相关信息。一般情况下,会员只应该查询和维护本人的参加社团情况和个人信息,若查询和维护其他会员的信息,就要知道其他会员的学号和密码。这些是很难得到的,特别是密码,所以不但满足了会员的要求,还保护了会员的个人隐私。社团工作人员有修改会员个人信息的权限,所以需对工作人员登陆本模块进行更多的考虑。在此系统中,社团工作人员可以为会员加入社团或是登陆记录,并打印生成相应的报表给用户查看和确认院系管理人员功能的信息量大,数据安全性和性要求最高。本功能实现对会员参加各社团相关信息的查询和统计、工作人员和管理人员信息查看及维护。社团管理员可以浏览、查询、修改、统计社团的基本信息;浏览、查询、统计和修改会员参加社团活动的基本信息,设计不同用户的操作权限和登陆方法对所有用户开放的会员信息查询和个人部分信息维护查看个人情况信息维护会员个人密码根据注册的情况对数据库进行操作并生成报表。社团管理系统的数据流程:首先由社团工作人员或系统管理员等有录入权限的用户将各自权限围的信息进行录入处理,然后保存信息到数据库中。有权限的人可以对这些库信息进行修改和删除处理。所有用户均可以进行信息查询和统计,没有权限用户还可以基于注册界面进行注册,来参加相应的社团。2.2 软件结构本程序采用 B/S 架构,并使用了四层逻辑结果,如图1 所示:图 1 系统结构示意图以下为用户社团管理系统流程图,也是我们的核心工作流程图,如图 2 所示:用户层(UI)业务逻辑层(BLL)数据访问层(DAL)数据层(DB)图 2 系统流程图3.程序描述3.1 功能工作流程为:打开该系统,普通浏览者能浏览、阅读和社团信息及新闻,能进行注册,注册后为准会员,系统管理员登录进入新闻后台管理区,可以进行如下管理:社团信息管理删除和修改社团信息对已有社团进行部门管理对社团章程管理对社团的活动信息进行管理添加社团(注:授权码最为重要,它将在社团注册时为唯一识别码)管理员信息管理添加管理员修改或删除管理员信息新闻管理公告管理(添加、删除和修改)新闻管理(添加、删除和修改)用户管理个人用户管理(添加、删除和修改)协会用户管理(添加、删除和修改)下载管理表格管理(修改和删除)资料管理(删除和修改)添加信息(添加下载资料)留言管理个人留言管理(回复和删除留言)图片管理添加图片删除图片修改图片实用信息管理添加使用信息系部管理(添加、删除和修改系部)3.2 性能该系统操作简单、界面友好:完全控件式的页面布局,使得社团信息及新闻的录入工作更简便,为用户提供方便快捷的社团管理及相关信息的发布,更将作为一个向外部展示本学校的社团建设成就。即时可见:对社团信息的处理(包括录入、修改、删除)将立即在主页的对应栏目显示出来,达到“即时发布、即时见效”的功能;系统运行应该快速、稳定、高效和可靠;在结构上应具有很好的可扩展性,便于将来的功能扩展和维护。3.3 运行环境及设备要求设备客户机硬件要求:具有Pentium III 处理器以上且满足以下要求的计算机:最低 64 MB 存,最小2.1 GB 硬盘。服务器硬件要求:具有Pentium III 处理器以上且满足以下要求的计算机:最低 256MB 存,最小8 GB 硬盘。支持程序客户端操作系统:Windows 98/NT/2000/XP 或更高版本浏览器:IE 5.0 以上或 Netscape同等版本以上服务器操作系统:Windows 2000 Server或者 Windows 2003 Server Web服务器:MS IIS 应用服务器:IIS、COM+等企业级应用服务器数据库:SQL SERVER 3.4 算法重要算法及部分代码Web 用户控件该系统中创建了两个Web用户控件 Foot.ascx和 Head.ascx,在首页、新闻动态、社联简介、资料下载等页面的HTML 代码里都进行了引用,调用方式为:Register指令注册用户控件,同时把属性 TagName(标签名)和 TagPrefix(标签前缀)添加到 Register指令中,Src属性表示该用户控件相对于父页面的相对地址。用户控件也是服务器端控件,还必须在用户控件代码中添加Runat=server属性,用法如下:其中 Head.ascx用户控件作用是显示导航栏Flash按钮,Foot.ascx用户控件作用是显示底部相关信息等。用户控件是非常易于代码重用的,可以把许多相关功能和用户界面封装在一个用户控件中,然后在任何需要该功能的地方重用此控件。通用类代码在所有相关页面显示文件和Web用户控件的代码隐藏文件.aspx.cs或.ascx.cs中,通过对数据访问类的引用(以创建类实例方式),调用数据访问类里的相应函数完成相关功能,如建立数据库连接、打开和关闭数据库、对数据库执行查询、插入、删除和更新操作、页面登陆检验等。此处列举 Dbhelp 类(数据访问类)中主要函数的源码:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;using System.Text;using System.Text.RegularExpressions;/Dbhelp 的摘要说明/publicclassDbhelp protectedstaticstring con=ConfigurationManager.ConnectionStringsconnstr.ToString();publicSqlConnection conn=new SqlConnection(con);/public SqlConnection conn=new SqlConnection(Data Source=.;Initial Catalog=Studentdatabase;uid=sa;pwd=123456;);#region用户登录验证/验证用户是否是合法用户/接受SQL 语句/publicint CheckLogin(string sql)try SqlCommand cmd=new SqlCommand(sql,conn);if (conn.State=ConnectionState.Closed)conn.Open();int result=(int)cmd.ExecuteScalar();return result;catch (Exception ex)HttpContext.Current.Response.Write(ex.Message);throw;#endregion#region用户信息提示/对话框信息/接受要显示给用户的信息 publicvoid MessageShowBox(string TxtMessage)HttpContext.Current.Response.Write(alert(+TxtMessage+);#endregion#region查询数据库信息/数据填充/接受SQL 语句/返回DataSet类型数据 ds publicDataSet GetData(string sql)try DataSet ds=new DataSet();SqlDataAdapter da=new SqlDataAdapter(sql,conn);if (conn.State=ConnectionState.Closed)conn.Open();da.Fill(ds,DataTable);return ds;catch (Exception ex)HttpContext.Current.Response.Write(ex.Message);throw;#endregion#region数据库信息更新/实现数据库的更新/接受Sql语句/返回受影响行数 publicint Exucte(string sql)try SqlCommand cmd=new SqlCommand(sql,conn);if (conn.State=ConnectionState.Closed)conn.Open();int result=cmd.ExecuteNonQuery();return result;catch (Exception ex)HttpContext.Current.Response.Write(ex.Message);throw;#endregion#region读取数据库数据publicDataSet Excute1(string sql)DataSet ds=new DataSet();SqlDataAdapter da=new SqlDataAdapter(sql,conn);if (conn.State=ConnectionState.Closed)conn.Open();da.Fill(ds,News);if (conn.State=ConnectionState.Open)conn.Close();return ds;#endregion#region Session 传值判断注册身份publicvoid TeamAdd()HttpContext.Current.Sessionidentity=团体注册 ;HttpContext.Current.Response.Redirect(Register.aspx);publicvoid Person()HttpContext.Current.Sessionidentity=个人注册;HttpContext.Current.Response.Redirect(Register.aspx);#endregion#region获取数据库字段publicSqlDataReader GetRed(string sql)SqlCommand cmd=new SqlCommand(sql,conn);if (conn.State=ConnectionState.Closed)conn.Open();SqlDataReader red=cmd.ExecuteReader();return red;red.Close();conn.Close();#endregion 前台主要页面代码1.首页1)填充首页各信息控件模块:ApplicationUserInfor=string.Empty;/将用户登陆信息置空 GVNews.DataSource=dh.GetData(select top 6*from News order by NewID desc);/读取最新前六条新闻 GVNews.DataBind();TxtName.Focus();GvDonload.DataSource=dh.GetData(select top 5 DName,Id from Download order by Id desc);/读取最新下载资料 GvDonload.DataBind();GvLeague.DataSource=dh.GetData(select top 5*from League_Table order by ID desc);/填充协会信息模块 GvLeague.DataBind();DataSet ds=dh.GetData(select top 1 Contents from Affiche order by Id desc);/填充通告模块if(ds.Tables0.Rows.Count0)LblAd.Text=ds.Tables0.Rows00.ToString();GVActivity.DataSource=dh.GetData(select top 5 Name,Activity,ID from League_Table where IntActivity=1 order by ID desc);GVActivity.DataBind();/填充社团活动新闻信息模块 ds=dh.GetData(select top 1 Viscera from News order by NewID desc);/填充专题报道信息模块if(ds.Tables0.Rows.Count0)LblReport.Text=ds.Tables0.Rows00.ToString();DataList1.DataSource=dh.GetData(select*from ShowImage);DataList1.DataKeyField=Id;/根据主键:Id 读取数据库中新闻图片的存储路径用以动态填充图片新闻模块 DataList1.DataBind();DataList2.DataSource=dh.GetData(select top 6*from UrlMessege order by Id desc);DataList2.DataBind();/填充实用信息模块在HTML 代码中对后台代码的Data数据集进行调用: asp:Imageid=ImageShowAlternateText=风 景 如 画 Height=120Width=90runat=serverImageUrl=_designer:wfdid=w32.下载页面代码:1)实现下载功能代码:从数据库中读取文件路径:string num=ds.Tables0.Rows00.ToString();string FilePath=ds.Tables0.Rows01.ToString();判断数据库文件类型:if (FilePath.Trim()=Word文件)filetype=DownLoad_Doc;filepostfix=.doc;elseif (FilePath.Trim()=Excel 表格)filetype=DownLoad_xls;filepostfix=.xls;string fileName=num+filepostfix;/客户端保存的文件名string filePath=Server.MapPath(filetype+/+fileName);/路径/以字符流的形式下载文件FileStream fs=new FileStream(filePath,FileMode.Open);byte bytes=new byte(int)fs.Length;fs.Read(bytes,0,bytes.Length);fs.Close();Response.ContentType=application/octet-stream;/通知浏览器下载文件而不是打开 Response.AddHeader(Content-Disposition,attachment;filename=+HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8);Response.BinaryWrite(bytes);Response.Flush();Response.End();3.留言本实现代码:using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;publicpartialclassMessage :System.Web.UI.Page Dbhelp dh=new Dbhelp();publicstringsql=select top 5*from Massage order by Id desc;/从数据库中读取前五条最新留言protectedvoid Page_Load(object sender,EventArgs e)DLBinit(sql);#region绑定数据protectedvoid DLBinit(string sql)/用数据适配器对 DataSet数据集进行填充留言本容if (dh.conn.State=ConnectionState.Closed)dh.conn.Open();SqlDataAdapter da=new SqlDataAdapter(sql,dh.conn);DataSet ds=new DataSet();da.Fill(ds,table);PagedDataSource ps=new PagedDataSource();ps.AllowPaging=true;/允许分页功能 ps.PageSize=5;/设置每页显示五条信息 ps.DataSource=ds.Tablestable.DefaultView;DataList1.DataSource=ps;DataList1.DataBind();#endregion protectedvoid BtnMassage_Click(object sender,EventArgs e)/点击留言按钮跳转到留言界面 Response.Redirect(ReplyMassage.aspx);后台主要页面代码1.图片管理页面代码:填充图片信息代码:protectedvoid DLBinit(string sql)/进行填充已上传的图片进行填充模块if (dh.conn.State=ConnectionState.Closed)dh.conn.Open();SqlDataAdapter da=new SqlDataAdapter(sql,dh.conn);DataSet ds=new DataSet();da.Fill(ds,table);PagedDataSource ps=new PagedDataSource();ps.DataSource=ds.Tablestable.DefaultView;GridView1.DataSource=ps;GridView1.DataBind();删除图片信息代码:protectedvoid GridView1_RowDeleting(object sender,GridViewDeleteEventArgs e)/删除图片信息int id=int.Parse(GridView1.DataKeyse.RowIndex.Value.ToString();string sql=select*from ShowImage where Id=+id+;DataSet ds=dh.GetData(sql);string filename=ds.Tables0.Rows01.ToString();try string value=filename.Split(/);filename=value2.ToString();catch (Exception)dh.MessageShowBox(删除失败!);return;物理删除图片代码:string filepath=Server.MapPath()+/ShowImage/+filename;if (File.Exists(filepath)/判断文件是否存在 File.Delete(filepath);/进行物理删除文件 sql=delete ShowImage where Id=+id+;/删除数据库中文件信息if (dh.Exucte(sql)0)sql=select*from ShowImage;DLBinit(sql);/删除后重新进行填充模块 else dh.MessageShowBox(删除失败!);2.资料信息管理代码:删除下载资料代码:protectedvoid GVAdminLoad_RowDeleting(object sender,GridViewDeleteEventArgs e)/删除下载资料信息string sql=select DName from DownLoad where Id=+GVAdminLoad.DataKeyse.RowIndex.Value.ToString()+;DataSet ds=dh.GetData(sql);string name=ds.Tables0.Rows00.ToString();stringfilepath=Server.MapPath()+DownLoad_Doc+name+.doc;if (File.Exists(filepath)/物理删除下载资料信息File.Delete(filepath);int id=int.Parse(GVAdminLoad.DataKeyse.RowIndex.Value.ToString();sql=delete DownLoad where Id=+id+;if (dh.Exucte(sql)0)DataBinit();else dh.MessageShowBox(删除失败!);return;添加下载资料信息代码:using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;using System.IO;publicpartialclassWeb_Admin_AdminSource :System.Web.UI.Page string filepath=;string filepostfix=;Dbhelp dh=new Dbhelp();protectedvoid Page_Load(object sender,EventArgs e)TxtName.Focus();protectedvoid BtnSubmit_Click(object sender,EventArgs e)/进行添加下载资料信息string str=FUFile.PostedFile.FileName;if (str=String.Empty)dh.MessageShowBox(附件不能为空!);return;this.GetFilePath();filepostfix=str.Substring(str.LastIndexOf(.);try /判断上传资料文件类型if (DDLType.Text.Trim()=Word文件)if (filepostfix!=.doc)dh.MessageShowBox(请附加正确的 Word 文件);return;elseif (DDLType.Text.Trim()=Excel 表格)if (filepostfix!=.xls)dh.MessageShowBox(请附加正确的 Excel 表格);return;/将文件进行物理添加stringfilename=str.Substring(str.LastIndexOf()+1);string name=filename.Substring(0,filename.Length-4);string path=././+filepath+/+filename;FileInfo fileinfo=new FileInfo(str);long filesize=(fileinfo.Length/1024)/1024;if (filesize 20)/限制文件大小不能超过 20兆 dh.MessageShowBox(对不起,文件大小不能超过20MB!);return;/将所上传文件信息上传到数据库中string sql=insert into DownLoad(DName,DType)values(+name+,+DDLType.Text.Trim()+);if (dh.Exucte(sql)0)this.FUFile.PostedFile.SaveAs(Server.MapPath(path);dh.MessageShowBox(上传成功!);else dh.MessageShowBox(上传失败!);return;catch (Exception ex)Response.Write(ex.Message);throw;#region获取文件路径protectedvoid GetFilePath()if (DDLType.Text.Trim()=Word文件)filepath=DownLoad_doc;elseif (DDLType.Text.Trim()=Excel 表格)filepath=DownLoad_xls;#endregion protectedvoid BtnCancel_Click(object sender,EventArgs e)/Response.Redirect();3.5 程序逻辑逻辑模型就是把概念模型,即E-R图,转换为与数据模型相符合的逻辑模型关系模型。E-R图向关系模型转换,首先要进行数据的规化。所谓规化是指在一个数据结构中没有重复出现的项组。规化是在关系数据库中减少数据冗余的过程。具体E-R图向关系模型转换的结果如下所示,其中带下划线的为关键码:普通会员:(会员编号、所属社团、届时、加入时期、职位、性别、出生日期、所在班级、所在系、寝室号、备注)社团:(社团编号、社团全称、社团负责人、社团创始人、主管单位、成立日期、社团性质、社团简介、备注)活动表:(活动编号、活动主题、日期、审核状态、活动负责人、社联监查人员、承办单位、活动容、备注)社联:(社联届时、社联负责人、办公地点、联系、备注)社团评优表:(社团编号、届时、总得分、备注)财务:(社团编号、届时、金额、收入支出性质、经手人、日期、备注)系统 E-R图3.6 数据库设计数据库设计该系统使用 SQL SERVER 作为应用程序的数据库,建立了有16 数据表,下面主要介绍以下9 具有代表性的表:Administration 表用于存储管理员的信息,AssociationInfor 表用于存储协会部门信息,Depart 表用于存储学院系部信息,DownLoad 表用于存储下载资料的存储路径信息,LeagueLogin_Table表用于存储社团注册信息,LeagueRule表用于存储协会章程信息,Massage 表用来存储留言信息,News表用来存储新闻信息,ShowImage表用来存储新闻图片的存储路径,在 6 个数据表中,介绍一下新闻表和账户表如下:Administration 表如表 3-6-1 所示:表 3-6-1 管理员信息表Id 为该表主键,Name 为管理员名称,Pwd为密码。AssociationInfo 表如表 3-6-2 所示:表 3-6-2 社团部门表Id 为该表主键,Department 部门,Duty 为部门职责,Rules协会章程。Depart 表如表 3-6-3所示:表 3-6-3 系部表ID 为该表主键,DepartName 为系部名称,SpecialityName 为所属系部的专业名称。DownLoad 表如表 3-6-4 所示:表 3-6-4 资料下载表Id 为该表主键,Dname为资料标题,Dtimes 为上传时间,Dtype 为文件类型,DfileFhpoto 为文件存储路径。LeagueLogin_Table表如表 3-6-5 所示:表 3-6-5 社团注册表ID 为该表主键,LeagueName为社团名称,LeaguePwd为密码,Name 为负责人,TeacherName为知道老师,BiuldTime 为成立时间,Depart 为社团所属系别,Speciality为所属专业,Phone 为社团联系,CheckCode为授权码,IntRule 判断社团章程章程是否添加。LeagueRule表如表 3-6-6 所示:表 3-6-6 社团章程表Id 为该表主键,Name 为章程所属社团名称,Rules为社团章程。Massage表如表 3-6-7 所示:表 3-6-7 留言信息表Id 为该表主键,Name 为留言者名称,Times 为留言时间,Contents 为留言容,Reply为管理员的回复容。News 表如表 3-6-8 所示:表 3-6-8 新闻表NewID 为该表主键,Name 为新闻主题,Time 为新闻发布时间,Viscera 为新闻容。ShowImage表如表 3-6-9 所示:表 3-6-9 图片信息表Id 为该表主键,FilePhotoPath为图片存储路径,PhotoName 为图片名称。3.7 测试要点软件测试就是在软件投入运行之前对软件的需求分析、设计规格说明和编码实现的最终审核,是保证软件质量的关键因素。即软件测试是为了发现错误而执行程序的过程。当模块设计完成并经过编译没有错误之后,便要进行调试和测试,这是程序设计中一个非常重要的环节,只有通过在不同的应用环境下反复调试和测试,才能确保能实现其预期的目标和保障系统的可靠性,实用性的提高。以下我选取登陆系统测试举例。首先进入登陆页面,如果漏输用户名、权限、密码任何一个而登录,则跳出消息提示:“请检查用户名、密码、权限是否为空”;若输入用户名与权限、密码不符,则跳出消息提示:“请查看用户名、密码或用户权限是否正确,重新输入”;用户名、权限及密码输入正确,不同身份进入不同的界面。