当前位置:文档之家› 《社团管理系统》详细设计说明书

《社团管理系统》详细设计说明书

<社团管理系统>详细设计说明书[V1.0(版本号)]拟制人___________________________ 审核人___________________________[ 年月日]目录1.引言 (3)1.1 编写目的 (3)1.2 项目背景 (3)1.3定义 (3)1.4 参考资料 (3)2.总体设计 (4)2.1 需求概述 (4)2.2 软件结构 (5)3.程序描述 (6)3.1 功能 (6)3.2 性能 (8)3.3 运行环境及设备要求 (9)3.4算法 (9)3.5程序逻辑 (21)3.6 数据库设计 (22)3.7 测试要点 (25)1.引言1.1编写目的本说明书在概要设计的基础上,对信息发布系统的各模块、程序分别进行了实现层面上的要求和说明。

1.2项目背景项目全称:理工学院社团管理系统项目发起者:09软件工程2班DWLGY小组项目开发者:09软件工程2班DWLGY小组项目用户:理工的广大师生1.3定义1.4参考资料[1]天极网新技术研究室完全入门•人民邮电,2001.6[2]Sanjeev Rohilla等著,君等译专业项目实例开发•中国水利水电,2003.5[3]启明工作室编著网络应用系统开发与实例.人民邮电,2005.7[4]王华杰,律松一波等编著.C#数据库开发技术.清华大学,2003.2⑸ 攀建编著+项目开发实例.清华大学,2004.1⑹(美)A.Russell Jones著,高春蓉等译从入门到精通.电子工业出版,2002.1[7] Scott Worley著,王文龙湘宁译技术幕.人民邮电,2002.4[8]Russ Basiura等著,浩译 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 著:Tips,Tutorials,and Code电子工业,2003.7[13](美Jeffrey Richte 著 Frameworks.清华大学,2003.4[14]Alex Homer 等 Web Forms Programming清华大学,2003.12.总体设计2.1 需求概述社团管理系统需要满足来自三方面的需求,这三个方面分别是会员、社团和管理员。

会员的需查询院系各社团的活动情况、会员参加的各个社团情况及会员信息的修改;社团需对会员参加社团、注销社团的基本情况进行操作;社团管理系统的管理员的功能最为复杂,包括对会员、社团的活动等各方面的信息进行管理和统计,及系统状态的查看、维护并生成会员社团统计表。

会员可以直接查看参加社团及社团活动情况,会员可以根据本人学号和密码登录系统,还可以进行对本人参加社团情况的查询和维护部分个人信息以及各社团的活动安排等相关信息。

一般情况下,会员只应该查询和维护本人的参加社团情况和个人信息,若查询和维护其他会员的信息,就要知道其他会员的学号和密码。

这些是很难得到的,特别是密码,所以不但满足了会员的要求,还保护了会员的个人隐私。

社团工作人员有修改会员个人信息的权限,所以需对工作人员登陆本模块进行更多的考虑。

在此系统中,社团工作人员可以为会员加入社团或是登陆记录,并打印生成相应的报表给用户查看和确认院系管理人员功能的信息量大,数据安全性和性要求最高。

本功能实现对会员参加各社团相关信息的查询和统计、工作人员和管理人员信息查看及维护。

社团管理员可以浏览、查询、修改、统计社团的基本信息;浏览、查询、统计和修改会员参加社团活动的基本信息,设计不同用户的操作权限和登陆方法对所有用户开放的会员信息查询和个人部分信息维护查看个人情况信息维护会员个人密码根据注册的情况对数据库进行操作并生成报表。

社团管理系统的数据流程:首先由社团工作人员或系统管理员等有录入权限的用户将各自权限围的信息进行录入处理,然后保存信息到数据库中。

有权限的人可以对这些库信息进行修改和删除处理。

所有用户均可以进行信息查询和统计,没有权限用户还可以基于注册界面进行注册,来参加相应的社团。

2.2软件结构本程序采用B/S架构,并使用了四层逻辑结果,如图1所示:图1系统结构示意图以下为用户社团管理系统流程图,也是我们的核心工作流程图,如图2所示:适贞击“谨八菇疑“豆示萤宁页体■-進过验证(目动记轨管理级别与权限〕会员和衬团诲斛管-奁询与打耳I”23.程序描述3.1功能工作流程为:打开该系统,普通浏览者能浏览、阅读和社团信息及新闻,能进行注册,注册后为准会员,系统管理员登录进入新闻后台管理区,可以进行如下管理:社团信息管理删除和修改社团信息对已有社团进行部门管理对社团章程管理对社团的活动信息进行管理添加社团(注:授权码最为重要,它将在社团注册时为唯一识别码)管理员信息管理添加管理员修改或删除管理员信息新闻管理公告管理(添加、删除和修改)新闻管理(添加、删除和修改)用户管理个人用户管理(添加、删除和修改)协会用户管理(添加、删除和修改)下载管理表格管理(修改和删除)资料管理(删除和修改)添加信息(添加下载资料)留言管理个人留言管理(回复和删除留言)图片管理添加图片删除图片修改图片实用信息管理添加使用信息系部管理(添加、删除和修改系部)4測览社团信慝3.2性能该系统操作简单、界面友好:完全控件式的页面布局,使得社团信息及新闻 的录入工作更简便,为用户提供方便快捷的社团管理及相关信息的发布, 更将作 为一个向外部展示本学校的社团建设成就。

即时可见:对社团信息的处理(包括录入、修改、删除)将立即在主页的对 应栏目显示出来,达到“即时发布、即时见效”的功能;系统运行应该快速、稳定、高效和可靠;在结构上应具有很好的可扩展性,便于将来的功能扩展和维护通 測 览 者4浏览网詁“■ f *\注册用 户*-------- P—矍录后经权眼和辭—」社团信息管理7 ・管理员信烏管" ■新闻管理门菅哩用户J> ----------------- 2F 載管理43.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 SERVER3.4 算法重要算法及部分代码Web 用户控件该系统中创建了两个 Web用户控件Foot.ascx和Head.ascx,在首页、新闻动态、社联简介、资料下载等页面的 HTML 代码里都进行了引用,调用方式为:<% Register Src="../WebControl/Head.ascx" TagName="Head" TagPrefix="uc1" %><% Register Src="../WebControl/Foot.ascx" TagName="Foot" TagPrefix="uc2" %>Register指令注册用户控件,同时把属性TagName标签名)和TagPrefix(标签前缀)添加到Register指令中,Src属性表示该用户控件相对于父页面的相对地址。

用户控件也是服务器端控件,还必须在用户控件代码中添加 Runat=server属性,用法如下:<uc1:Head ID="Head1" runat="server" /><uc2:Foot ID="Foot1" 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;/// <summary>/// Dbhelp 的摘要说明/// </summary>public class Dbhelp{protected static string con =ConfigurationManager .ConnectionStrings[ "connstr" ].ToString();public SqlConnection conn = new SqlConnection (con);//public SqlConnection conn = new SqlConnection("DataSource=.;Initial Catalog=Studentdatabase;uid=sa;pwd=123456;");#region 用户登录验证/// <summary>/// 验证用户是否是合法用户/// </summary>/// vparam name="sql"> 接受 SQ语句 v/param>/// <returns></returns>public int CheckLogin( string sql){try{SqlCommandcmd = new SqlComman(dsql, 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 用户信息提示/// vsummary>/// 对话框信息/// v/summary>/// vparam name="TxtMessage">接受要显示给用户的信息 </param> public void MessageShowBox(string TxtMessage){HttpContext .Current.Response.Write( "vscript language='javascript' type='text/javascript'>alert('" + TxtMessage + "')v/script>" );}#endregion#region 查询数据库信息/// vsummary>/// 数据填充/// v/summary>/// vparam name="sql"> 接受 SQL语句 </param>/// <returns> 返回 DataSet类型数据 ds</returns> public DataSetGetData( string sql)tryDataSet 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 数据库信息更新/// <summary>/// 实现数据库的更新/// </summary>/// vparam name="sql"> 接受 Sql 语句 v/param>/// <returns> 返回受影响行数 </returns>int Exucte( string sql)public{try{SqlCommandcmd = new SqlComman(dsql, 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 读取数据库数据public DataSet 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;SqlCommandcmd = new SqlComman(dsql,conn); if (conn.State == ConnectionState .Closed) conn.Open();SqlDataReader red = cmd.ExecuteReader(); return red; red.Close();conn.Close(); }#endregion}前台主要页面代码1. 首页1) 填充首页各信息控件模块: Application[ "UserInfor" ] = 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}#endregion#region Session 传值判断注册身份 public void TeamAdd(){HttpContext .Current.Session[ "identity"HttpContext .Current.Response.Redirect(}public void Person(){HttpContext .Current.Session[ "identity" HttpContext .Current.Response.Redirect(}#endregion#region 获取数据库字段public SqlDataReader GetRed( string sql)] = " 团体注册 "; "Register.aspx" ] = " 个人注册 " "Register.aspx" ); );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.Tables[0].Rows.Count>0)LblAd.Text = ds.Tables[0].Rows[0][0].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 Newsorder by NewID desc" ); // 填充专题报道信息模块if (ds.Tables[0].Rows.Count>0)LblReport.Text = ds.Tables[0].Rows[0][0].ToString();DataList1.DataSource = dh.GetData( "select * fromShowImage");DataList1.DataKeyField = "Id" ;// 根据主键: Id 读取数据库中新闻图片的存储路径用以动态填充图片新闻模块DataList1.DataBind();DataList2.DataSource = dh.GetData( "select top 6 * from UrlMessege order by Id desc" );DataList2.DataBind();// 填充实用信息模块在HTML弋码中对后台代码的Data数据集进行调用:vmarquee id ="marquee3"onmouseover=this.stop() onmouseout=this.start() behavior ="scroll" direction ="left" scrollamount ="3" style ="width: 859px; height: 103px; border-right:#ccffff thin double; border-top: #ccffff thin double;border-left: #ccffff thin double; border-bottom: #ccffff thin double; text-align: right;">< A style ="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none" href ="Association.aspx"></A>&nbsp; <A style ="BORDER-RIGHTm: ediumnone; BORDER-TOPm: ediumnone; BORDER-LEFTm: e d i u m none; BORDER-BOTTOmMe: d i u m none" onmouseover="show()" href ="Association.aspx"></ A>&nbsp; <A style ="BORDER-RIGHTm: ediumnone; BORDER-TOPm: e d i u m none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none"href ="Association.aspx"></ A>&nbsp; <A style ="BORDER-RIGHTm: ediumnone; BORDER-TOPmedium non e; BORDER-LEFTnediu mnone; BORDER-BOTTOMfedium none" href ="Association.aspx"></ A> <asp: DataList id ="DataList1"runat ="server" __designer : wfdid ="w2"RepeatDirection ="Horizontal">< ItemTemplate ><asp: Image id ="lmageShow" AlternateText ="风景如画"Height ="120" Width ="90" run at ="server" ImageUrl ='<%#Eval("FilePhotoPath") %> __designer : wfdid="w3"></ asp: Image>2.下载页面代码:1)实现下载功能代码:从数据库中读取文件路径:string num = ds.Tables[0].Rows[0][0].ToStri ng();stri ng FilePath = ds.Tables[0].Rows[0][1].ToStri ng();判断数据库文件类型:if (FilePath.Trim() == "Word文件"){filetype = "Dow nLoad_Doc;filepostfix = ".doc";}else if (FilePath.Trim() == "Excel 表格"){filetype = "DownLoad_xls";filepostfix = ".xls";}string fileName = num + filepostfix; // 客户端保存的文件名stri ng filePath = Server.M apPath(filetype + "/" + fileName); // 路径//以字符流的形式下载文件FileStream fs = new FileStream (filePath,FileMode .Open);byte [] bytes = new byte [( int )fs.Length];fs.Read(bytes, 0, bytes.Le ngth);fs.Close();Resp on se.C onten tType = "applicatio n/octet-stream" ;//通知浏览器下载文件而不是打开Response.AddHeader( "Content-Disposition" , "attachment; file name=" + HttpUtility .UrlE ncode(fileName,System.Text. Encoding.UTF8));Resp on se.Bi naryWrite(bytes);Resp on se.Flush();Resp on se.E nd();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;public partial class Message: System.Web.UI. Page{Dbhelp dh = new Dbhelp();public string sql = "select top 5 * from Massageorder by Id desc" ;// 从数据库中读取前五条最新留言protected void Page_Load( object sender, EventArgs e){DLBinit(sql);}#region 绑定数据 protected void 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.Tables[ "table" ].DefaultView;DataList1.DataSource = ps;DataList1.DataBind();}#endregionprotected void BtnMassage_Click( object sender, EventArgs e) { // 点击留言按钮跳转到留言界面Response.Redirect( "ReplyMassage.aspx" );}后台主要页面代码1. 图片管理页面代码:填充图片信息代码: protected void DLBinit( string sql){ // 进行填充已上传的图片进行填充模块if (dh.conn.State == ConnectionState .Closed) dh.conn.Open();SqlDataAdapter da = new SqlDataAdapter (sql, dh.conn); DataSet ds = newDataSet ();da.Fill(ds, "table" ); PagedDataSource ps = new PagedDataSource();ps.DataSource = ds.Tables[ "table" ].DefaultView;GridView1.DataSource = ps;GridView1.DataBind();}删除图片信息代码:protected void GridView1_RowDeleting( object sender, GridViewDeleteEventArgs e) { // 删除图片信息 int id =int .Parse(GridView1.DataKeys[e.RowIndex].Value.ToString());string sql = "select * from ShowImage where Id='" + id + DataSet ds =dh.GetData(sql);string filename = ds.Tables[0].Rows[0][1].ToString(); try {string [] value = filename.Split( '/' ); filename =value[2].ToString(); } catch ( Exception ) {dh.MessageShowBox ( " 删除失败! "); return ;} 物理删除图片代码:sql = DLBinit(sql);//"select * from ShowImage" ; 删除后重新进行填充模块} }else {dh.MessageShowBox( " 删除失败! "); }2. 资料信息管理代码: 删除下载资料代码: protected voidGVAdminLoad_RowDeleting(object sender, GridViewDeleteEventArgs e) { // 删除下载资料信息 string sql = "select DName from DownLoad where Id='"+GVAdminLoad.DataKeys[e.RowIndex].Value.ToString()+ "'" ; DataSet ds = dh.GetData(sql); string name = ds.Tables[0].Rows[0][0].ToString(); string filepath = Server.MapPath( "~" )+ "\\DownLoad_Doc\\" + name + ".doc" ;if ( File .Exists(filepath)) { // 物理删除下载资料信息File .Delete(filepath); int id=int .Parse(GVAdminLoad.DataKeys[e.RowIndex].Value.ToString());sql = "delete DownLoad where Id='" + id + "'" ;if (dh.Exucte(sql) > 0){ DataBinit(); } }else {if ( File r .Exists(filepath))// 判断文件是否存在{File .Delete(filepath);// 进行物理删除文件sql = "delete ShowImage where Id='" + id + "'" ;/ 删除数据库中文件信息string filepath = Server.MapPath("~" )+"/ShowImage/" + filename;if (dh.Exucte(sql) > 0)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;public partial class Web_Admin_AdminSource: System.Web.UI. Page{string filepath = "" ;string filepostfix = "" ;Dbhelp dh = new Dbhelp();protected void Page_Load( object sender, EventArgs e) {TxtName.Focus();}protected void BtnSubmit_Click( object sender, EventArgs e) { // 进行添加下载资料信息string str = FUFile.PostedFile.FileName;if (str == String .Empty){dh.MessageShowBox( " 附件不能为空!! ");return ;}this .GetFilePath();filepostfix = str.Substring(stIndexOf( "." ));try{ // 判断上传资料文件类型if (DDLType.Text.Trim() == "Word文件"){if (filepostfix != ".doc" ){dh.MessageShowBox( "请附加正确的 Wore文件");return ;}}else if (DDLType.Text.Trim() == "Excel 表格"){if (filepostfix != ".xls" ){dh.MessageShowBox( "请附加正确的 Excel 表格");return ;}// 将文件进行物理添加string filename = str.Substring(stIndexOf( "\\" ) + 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('"}#en dregi onprotected void BtnCancel_Click ( object sender, EventArgs e ) { _+ name +Ill III+ 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 获取文件路径protected void GetFilePath(){if (DDLType.Text.Trim() == "Word 文件") { filepath = "DownLoad_doc"; }else if (DDLType.Text.Trim() == "Excel 表格") { filepath ="DownLoad_xls" ;//Respo nse.Redirect("");}}3.5程序逻辑逻辑模型就是把概念模型,即E-R图,转换为与数据模型相符合的逻辑模型――关系模型。

相关主题