C#毕业设计——基于C#+asp.net+sqlserver的教务管理平台设计与实现(毕业论文+程序源码)——教务管理平台

基于C#+asp.net+sqlserver的教务管理平台设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于C#+asp.net+sqlserver的教务管理平台设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦

文章目录:

1、项目简介

  1. 务系统中的用户数量众多,需要具有不同的权限,以实现不同的应用。本论文介绍了开发背景,开发平台,并基于需求分析实现了教务管理平台中基于角色控制的权限系统(RBAC)及公共模块的设计与开发。RBAC实现了用户与访问权限的逻辑分离,更符合教务平台的用户、数据和应用特征;在公共模块中实现了系统通用的日志管理,异常处理,常用类库方法等。通过设计和应用本系统,有效的解决了教务平台中关于用户管理与权限操作等方面的问题,为系统公共模块的实现打下坚实的基础。通过较为详尽的功能测试,表明本文的设计内容具有一定的通用性,可用于需要动态分配权限与角色的管理系统中。

2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:9328个字26页
包含内容:整套源码+完整毕业论文


3、关键词:

权限;公共模块;RBAC

4、毕设简介

提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。

1 引言
教务管理平台对安全问题有较高的要求,传统的访问控制方法DAC(Discretionary Access Control,自主访问控制模型)、MAC(Mandatory Access Control,强制访问控制模型)难以满足复杂的教务管理平台需求。NIST(National Institute of Standards and Technology,美国国家标准化和技术委员会)于90年代初提出了基于角色的访问控制方法(RBAC),实现了用户与访问权限的逻辑分离,更符合企业的用户、组织、数据和应用特征。

RBAC(角色访问控制)的基本思想即把整个访问控制过程分成两步:访问权限与角色相关联,角色再与用户关联,从而实现了用户与访问权限的逻辑分离。

由于RBAC实现了用户与访问权限的逻辑分离,因此它极大的方便了权限管理。例如,如果一个用户的职位发生变化,只要将用户当前的角色去掉,加入代表新职务或新任务的角色即可,角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,并且委派用户到角色不需要很多技术,可以由行政管理人员来执行,而配置权限到角色的工作比较复杂,需要一定的技术,可以由专门的技术人员来承担,但是不给他们委派用户的权限,这与现实中情况正好一致。

1.1 课题背景
省略

在这样的大环境下,我们选择了“教务管理平台”这个系统,符合实际需求。其中教务管理平台中使用人员的复杂性和众多模块的管理,需要较为复杂和安全的权限系统,另外由于团队开发和系统平台的需要,也需要一定的公共模块的支持。例如日志管理,异常处理,数据验证和过滤等。

1.2 课题目的
为教务管理平台设计一套安全,通用,可扩展的权限系统和系统公共基础模块的设计与开发,以应对系统和团队开发的需要。

1.3 课题意义
通过完成本课题系统的设计与开发,为团队开发教务管理平台打下基础,加快整个教务管理系统的开发速度,以应对实际教务管理工作自动化的需要,极大提高教务管理工作人员的效率。

2 系统平台与相关技术
2.1 系统架构
B/S架构的优点在于客户端和服务器通过Intranet进行数据交换,客户端基于统一的WEB浏览器,减少了投资,解决了系统维护升级的问题,另外只有极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,这也就充分保护了数据的安全。根据教务平台的需求和实际使用情况,由于人员的复杂性和访问机器的分布性,适合使用B/S架构。

2.2 开发平台介绍
本毕业设计的命题是教务管理平台中权限系统和公共模块的设计和开发,根据团队要求和开发成本选择了Visual Studio 2005+SQL 开发环境,使用的语言为c#。

2.2.1 Visual Studio 介绍
Visual Studio 是一系列高效的、智能的开发工具的统称,它拥有一个庞大的产品线,包括面向学生、爱好者、初学者的Express版,面向专家、Visual Basic 6的Standard版,面向顾问、企业开发人员的Professional版和面向架构师的Team System版本。在这些版本中,有些集成了开发软件常用到的东西,比如重构、单元测试、类设计器等等,以方便开发人员快速的设计各类软件。

2.2.2 SQL Server 介绍
SQL Server 是一个全面的数据库平台,使用集成的商业智能工具提供了企业级的数据管理。SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。SQL Server 数据引擎是企业数据管理解决方案的核心。此外 SQL Server 结合了分析、报表、集成和通知功能。

2.3 开发技术介绍
2.3.1 Asp.net
ASP.NET是微软流行的动态WEB编程技术活动服务器网页(ASP)的最新版本,但它远不是传统ASP简单升级。ASP.NET和ASP的最大区别在于编程思维的转换,ASP.NET是真正的面向对象(Object-oriented),而不仅仅在于功能的增强。

在ASP.NET中,Web 窗体页由两部分组成:视觉元素(HTML、服务器控件和静态文本和该页的编程逻辑。其中每一部分都存储在一个单独的文件中。可视元素在一个扩展名为 .aspx 文件中创建,而代码位于一个单独的类文件中,该文件称作代码隐藏类文件扩展名为.aspx.vb 或 .aspx.cs。这样,.aspx文件中存放所有要显示的元素,aspx.vb或.aspx.cs文件中存放逻辑。

2.3.2 RBAC
企业环境中的访问控制策略一般有三种:自主型访问控制方法、强制型访问控制方法和基于角色的访问控制方法(RBAC)。其中,自主式太弱,强制式太强,二者工作量大,不便于管理。基于角色的访问控制方法是目前公认的解决大型企业的统一资源访问控制的有效方法。其显著的两大特征是:1.减小授权管理的复杂性,降低管理开销;2.灵活地支持企业的安全策略,并对企业的变化有很大的伸缩性。

基于角色的访问控制RBAC作为一种灵活和直观的访问控制技术在20世纪90年代迅速发展起来,RBAC通过引入角色的新概念来实施访问控制策略。不同的角色和它所应具有的权限许可互相联系,用户作为某些角色的成员,获得角色所拥有的权限。角色可以根据实际的单位或组织的不同工作职能和权限来划分,依据用户所承担的不同权利和义务来授权相应的角色,对于一个存在大量用户和权限的权限分配系统来说,从用户到角色的管理,简化了权限分配的复杂性,提高了安全管理的效率和质量。

3 需求分析和数据库设计
3.1 应解决的问题
3.1.1 基于RBAC的权限系统.
1. 用户(user)和角色(role)
用户指访问系统中的资源的主体,一般为人,也可为 Agent 等智能程序。角色指应用领域内一种权力和责任的语义综合体,可以是一个抽象概念,也可以是对应于实际系统中的特定语义体,比如组织内部的职务等。针对角色属性的不同,某些模型中将角色进一步细分为普通角色和管理员角色(可理解为全局角色)。

2. 许可(Permissions)和权限(Permission)
许可描述了角色对计算机资源的访问和操作所具有的权限,其反映的是授权的结果。比如授予某个角色对计算机资源有读的权限,则代表了一个许可的存在,这个许可表示:角色获取了对计算机资源的读许可。针对操作来说,其描述的是许可和操作之间的一种关联关系,而这层关系则表示了某一角色对某一操作所具有的权限及权限状态。

3. 角色和指派(Assignment)
指派包含两个方面,用户指派和许可指派。用户指派表示的是,将用户指派给特定的角色。许可指派表示的是为角色指派计算机资源的访问和操作许可。

3.1.2 平台需要的公共模块
1.日志管理
2.异常处理
3.加密模块及字符串验证与过滤等公共模块。
3.2 功能需求
按照教务平台RBAC权限系统的需要,和相关公共基础模块的需要,有如下的功能需求。如图1所示。
在这里插入图片描述

图1 系统功能图
RBAC中用户,角色,权限,资源之间的关系如图2所示。
在这里插入图片描述

图2 RBAC关系图

3.2.1 用户信息管理
用户是权限的拥有者或主体。用户和权限实现分离,通过授权管理进行绑定。用户信息管理主要提供教务管理平台相关使用人员的信息的管理,包括添加,删除,修改等相关操作。

3.2.2 角色信息管理
角色是权利和责任的标识,角色信息管理主要提供教务管理平台相关使用人员所属角色信息的管理,包括添加,删除,修改等相关操作。角色和权限管理起来后,就拥有了一定的资源操作权力。

3.2.3 资源管理
资源管理主要提供教务管理平台中各个功能模块可访问资源的管理,包括各种资源相关权限的添加,删除,修改等相关操作。资源包括各种操作和可访问的页面等。

3.2.4 用户角色分配
实现用户和角色之间的关联关系映射。
在用户信息列表中,选择要分配角色的用户,单击列表中的用户名,进入分配角色页面所示的窗口。

在为用户分配角色的窗口中,主要是通过职能范围来确定用户的权限。每一个用户在每一个职能范围中均有一个默认的角色,并可以浏览该职能域中密级为“公开”的数据元。

为用户分配角色主要就是修改选定的用户在每一个职能范围中的角色,以及在每个职能范围中可以操作的数据元的密级。

3.2.5 角色权限分配
实现权限操作和角色之间的关联关系映射。角色描述用户的职能,权限是可访问资源的标识,给指定的角色分配权限,使角色具有了真正意义上的职能范围。

3.2.6 权限操作
完成资源和权限之间的绑定。可访问的资源或操作需要一个标识来标明,权限用通俗的语言来描述这种可用操作。例如用户查看某个列表,“查看”就代表了权限,而“列表“就是资源。

3.2.7 日志管理
日志是每个系统必不可少的东西,教务平台中用户的登陆信息,操作信息或异常信息都需要保存,以方便管理员的调用。日志管理主要完成对系统相关各种日志的记录和管理,将信息持久化保存。

3.2.8 异常处理
异常处理是每个系统必备的,自定义异常有助于把系统的错误信息按照自己定义的方式来处理,教务平台中把异常信息的保存进日志系统中,方便系统管理员查看,以及时修补系统存在的问题。

3.2.9 基础公共类库
完成相关系统基本类库的设计。涉及到数据库操作,相关javascript操作,字符串过滤和编码解码,分页等。这类方法通常具有一般的通用性,以方便教务平台各模块的调用。

3.3 非功能需求
省略

3.4 数据库设计
根据需求分析中的各种模块,设计了如下的数据库。
 用户表 Accounts_Users用来存储系统用户。表的字段说明如表1所示。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

图3 数据库关系图
数据库表之间的关系如图3所示。
4 系统设计与实现
4.1 公共模块设计
系统公共模块包括系统数据库操作,系统通用工具类,树目录管理,系统通用页面设计。

4.1.1 数据库通用类设计
数据库通用类由类DbManagerSQL实现,它是应用程序通过ADO.NET访问数据库的基础类,也是应用程序实现上层业务逻辑的基础.该类主要封装了创建访问数据库的一些对象或方法,如数据库连接对象等.以及执行数据库操作的必需对象。该类通过构造函数读取config配置文件里的数据库连接,类方法有执行简单SQL语句,执行存储过程,事务处理,返回datareader和dataset等操作方法。

4.1.2 系统工具通用类设计
在本系统中,应用程序定义了几个工具通用类,它们在整个应用过程中被应用了很多次,因此才能把它们集中在一起作为系统工具通用类。系统工具类通用类由命名空间Njj.Common下的各种类提供。

ConfigHelper.cs提供了关于读取webconfig中字符串值的各种方法。
MessageBox.cs中封装了向浏览器写入javascript代码和弹出对话框窗口的各种操作.
PageValidate.cs中提供了各种数据验证函数和字符串过滤,html编码解码等各种操作。
Njj.PageControl里的各种类提供了一些通用的页面自定义控件的操作,分页的样式等。

4.1.3 系统日志和树目录设计
命名空间Njj.TreeAndLog下的TreeAndLogManage类封装了关于日志的相关操作和目录列表的树相关操作。

日志操作有添加,修改,删除日志类别的功能和添加,修改,删除日志的功能。

日志主要记录系统用户的各种可记录操作,以及系统异常发生时的堆栈信息,以方便管理员的管理。主要记录内容有用户,日志记录时间,日志错误信息,用户IP,日志类别等。日志错误信息包含堆栈错误或相关用户的操作记录。系统主要界面如图4,图5所示。
在这里插入图片描述

图4 日志详细信息
在这里插入图片描述

图5 日志管理
在这里插入图片描述

图6 树状菜单

目录树列表调用SysNode树子结点对象来对数据库S_Tree执行各种添加,删除,修改操作,根据用户角色调用其相关的权限列表,动态显示菜单。界面如图6所示。代码如下所示。

DataRow[] drs = dt.Select("ParentID= " + 0);// 选出所有子节点	

//菜单状态
string MenuExpanded = NJJ.Common.ConfigHelper.GetConfigString("MenuExpanded");
        bool menuExpand = bool.Parse(MenuExpanded);

        TreeView1.Nodes.Clear(); // 清空树
        

        foreach (DataRow r in drs)
        {
            string nodeid = r["NodeID"].ToString();
            string text = r["Text"].ToString();
            string parentid = r["ParentID"].ToString();
            string location = r["Location"].ToString();
            string url = r["Url"].ToString();
            string imageurl = r["ImageUrl"].ToString();
            int permissionid = int.Parse(r["PermissionID"].ToString().Trim());
            string framename = TargetFrame;

            //treevie 设置
            this.TreeView1.Font.Name = "宋体";
            this.TreeView1.Font.Size = FontUnit.Parse("9");

            //权限控制菜单		
            if ((permissionid == -1) || (user.HasPermissionID(permissionid)))//绑定用户有权限的和没设权限的(即公开的菜单)
            {
                TreeNode rootnode = new TreeNode();
                rootnode.Text = text;
                rootnode.Value = nodeid;
                rootnode.NavigateUrl = url;
                rootnode.Target = framename;
                rootnode.Expanded = menuExpand;
                rootnode.ImageUrl = imageurl;
                rootnode.SelectAction = TreeNodeSelectAction.Expand;//设置菜单状态       

                TreeView1.Nodes.Add(rootnode);

                int sonparentid = int.Parse(nodeid);//  子节点ID               CreateNode(framename, sonparentid, rootnode, dt);//递归显示菜单项
            }

4.1.4 系统异常处理
系统异常处理有类MyException实现,它继承于系统的异常类Exception,并重载基类的 异常处理函数MyException().该类中了定义了两个异常处理函数,其中一个函数为MyException(string source,string message,Exception inner),该函数在重载记录函数时添加了一个异常代码参数 source,它可以用来标识异常的代码;另外一个函数为MyException(string source,string message),它也是继承于基类异常函数MyException(),也在重载记录异常函数时添加了一个异常代码参数。并且在异常处理的代码内部调用日志类函数将异常信息持久化。

4.1.5 系统通用页面设计
当用户登陆系统之后,进入系统平台的主页面,它由Main.aspx、Spliter.aspx、Left.aspx和Top.aspx4个页面组成。并且可以根据自己的喜好,选择不同的页面风格,系统将自动加载用户设置的风格。如图7所示。
在这里插入图片描述

图7 主界面
4.2 权限系统模块的实现
系统主功能模块包括用户信息管理,角色管理,权限管理,资源与权限的绑定,用户与角色的绑定等。

4.2.1 用户信息管理和角色绑定
本系统中的起始页面为Login.aspx,如图8所示。
在这里插入图片描述

图8 系统登陆界面
用户点击【登录】时,系统初始化命名空间Njj.Accounts.bus下类User的一个user对象,将user赋予当前上下文user对象。根据用户当前的身份标识中的密码验证用户身份的有效性,若成功则设置用户系统登陆,添加日志,添加用户的用户信息到Session中,并且加载用户设置的界面风格,最后跳转到应用系统操作主界面。该程序代码如下所示。

AccountsPrincipal newUser = AccountsPrincipal.ValidateLogin(userName, Password); //根据用户名和密码初始化用户标识,实现iprincipal接口
        if (newUser == null)
        {
            this.lblMsg.Text = "登陆失败: " + userName;
        }
        else
        {
            User currentUser = new NJJ.Accounts.Bus.User(newUser);//根据用户标识初始化用户对象
            Context.User = newUser;   将当前上下文用户标识设为新用户
            if (((SiteIdentity)User.Identity).TestPassword(Password) == 0) //检测用户密码
            {
                this.lblMsg.Text = "你的密码无效!";
            }
            else
            {
                FormsAuthentication.SetAuthCookie(userName, false); //设置用户登陆
                NJJ.TreeAndLog.TreeAndLogManage log = new NJJ.TreeAndLog.TreeAndLogManage();                  log.AddLog(DateTime.Now.ToString(), "用户登陆", User.Identity.Name, "1");//添加日志

                Session["UserInfo"] = currentUser;  //session保存当前用户信息
                Session["Style"] = currentUser.Style; //session保存用户设置的界面风格
                if (Session["returnPage"] != null)  
                {
                    string returnpage = Session["returnPage"].ToString();
                    Session["returnPage"] = null;
                    Response.Redirect(returnpage);
                }
                else
                {
                    Response.Redirect("main.htm");
                }
            }

用户管理页面为:UserAdmin.aspx,界面如图9所示。
用户角色分配界面如图10所示。
在这里插入图片描述

图9 用户管理
在这里插入图片描述

图10 角色分配
页面初始化时调用函数user对象的GetAllUsers()方法获取所有用户数据并绑定到datagrid中。
点击图中的修改角色链接可进入用户与角色绑定界面。

4.2.2 角色管理和权限绑定
角色管理和权限绑定页面主要为RoleAdmin.aspx和EditRole.aspx,主要实现对增加新的角色、修改角色、删除角色,和角色对象权限的分配功能。如图11,图12所示。
在这里插入图片描述

图11 角色管理
在这里插入图片描述

图12 编辑角色信息
RoleAdmin.aspx页面调用了命名空间Njj.Accounts.bus下Role类对象的相关方法,GetRoleList()得到所有的角色列表,Create()建立新角色。

EditRole.aspx中,首先listbox中绑定某类别权限下的所有权限,点击增加权限按钮调用Role类对象的AddPermission()向角色分配对应的权限。

4.2.3 权限管理
权限管理主要实现权限类别及权限命名的管理,如图13所示。代码如下所示。

int CategoryId = int.Parse(this.ClassList.SelectedValue); 
        DataSet PermissionsList = AccountsTool.GetPermissionsByCategory(CategoryId);
        this.DataGrid1.DataSource = PermissionsList;
        this.DataGrid1.DataBind();

在这里插入图片描述

图13 权限管理
本模块包含权限类别的添加,修改,删除,以及类别下子权限的添加,修改,删除等功能,主要针对命名空间下Njj.Accounts.Bus下的PermissionCategories和Permissions类进行操作。

4.2.4 系统资源管理和权限绑定及菜单操作
系统资源管理主页面为:TreeList.aspx和add.aspx,如图14,15所示。

此模块负责添加系统可访问的URL资源和菜单模块的操作。添加菜单时可以和对应的权限相绑定,以动态显示用户菜单。对于对应的URL文件可执行过滤功能,权限不够的用户将拒绝进入。
在这里插入图片描述

图14 系统资源管理
在这里插入图片描述

图15 添加资源并绑定权限
主要代码如下所示。

NJJ.TreeAndLog.TreeAndLogManage sm = new NJJ.TreeAndLog.TreeAndLogManage();
        DataTable dt = sm.GetTreeList("").Tables[0];
        this.listTarget.Items.Clear();
        //加载菜单选项到下拉列表中
        this.listTarget.Items.Add(new ListItem("根目录", "0"));
        DataRow[] drs = dt.Select("ParentID= " + 0);

        /循环读取,添加.
        foreach (DataRow r in drs)
        {
            string nodeid = r["NodeID"].ToString();
            string text = r["Text"].ToString();
            //string parentid=r["ParentID"].ToString();
            //string permissionid=r["PermissionID"].ToString();
            text = "╋" + text;
            this.listTarget.Items.Add(new ListItem(text, nodeid));
            int sonparentid = int.Parse(nodeid);
            string blank = "├";

            BindNode(sonparentid, dt, blank);

        }
        this.listTarget.DataBind();  绑定父类菜单
  /读取所有权限
       DataTable tabcategory = NJJ.Accounts.Bus.AccountsTool.GetAllCategories().Tables[0];
        int rc = tabcategory.Rows.Count;
        for (int n = 0; n < rc; n++)
        {
            string CategoryID = tabcategory.Rows[n]["CategoryID"].ToString();
            string CategoryName = tabcategory.Rows[n]["Description"].ToString();
            CategoryName = "╋" + CategoryName;
            this.listPermission.Items.Add(new ListItem(CategoryName, CategoryID));
            ///将权限绑定到下拉列表
            DataTable tabforums = NJJ.Accounts.Bus.AccountsTool.GetPermissionsByCategory(int.Parse(CategoryID)).Tables[0];
            int fc = tabforums.Rows.Count;
            for (int m = 0; m < fc; m++)
            {
                string ForumID = tabforums.Rows[m]["PermissionID"].ToString();
                string ForumName = tabforums.Rows[m]["Description"].ToString();
                ForumName = "  ├『" + ForumName + "』";
                this.listPermission.Items.Add(new ListItem(ForumName, ForumID));
            }
        }
        this.listPermission.DataBind();
        this.listPermission.Items.Insert(0, "--请选择--"); ///绑定权限

4.2.5 url过滤
系统对于普通的页面可以判断用户是否有权限来访问,通过继承类System.Web.UI.Page,并自写其中的Page_Load事件,生成公用的Page基类,由于asp.net的代码后置功能,对于web页面来说,判断其所属权限可以通过其后置代码类继承公共的Page基类,来达到代码重用的效果。该程序代码如下所示。

//权限验证
 if (Context.User.Identity.IsAuthenticated)  ///当前用户是否授权
        {
            AccountsPrincipal user = new AccountsPrincipal(Context.User.Identity.Name); //生成此用户的身份标识
            if (Session["UserInfo"] == null)  //如果Session保存的用户信息为空,则调用用户信息保存到session,页面重新加载
            {
                NJJ.Accounts.Bus.User currentUser = new NJJ.Accounts.Bus.User(user);
                Session["UserInfo"] = currentUser; 
                Session["Style"] = currentUser.Style;
               Response.Write("<script defer>location.reload();</script>");
               
            }
           Permissions p = new Permissions();     ///session保存的用户信息不为空,调用权限表
           PermissionID=p.GetPermissionID(Request.FilePath.Substring(24).Trim()); ///  获取url请求
           
            if ((PermissionID != -1) && (!user.HasPermissionID(PermissionID))) 如果页面不为公共页面的话,则调用此页面的权限ID来判断用户是否有此权限
            {
                Response.Clear();
                Response.Write("<script defer>window.alert('您没有权限进入本页!\\n请重新登录或与管理员联系');history.back();</script>");  ///用户无权限,则重新登陆
                Response.End();
            }
            
          
        }
        else
        {
            FormsAuthentication.SignOut();   ///用户没有授权的话,将注销用户。
            Session.Clear();
            Session.Abandon();
            Response.Clear();
            Response.Write("<script defer>window.alert('您没有权限进入本页或当前登录用户已过期!\\n请重新登录或与管理员联系!');parent.location='" + virtualPath + "/Login.aspx';</script>");
            Response.End();
        }		

5 测试
测试是软件系统最重要的部分,鉴于个人能力和软件环境的有限性,在系统设计和开发的过程中,我只进行了较多的黑盒测试,以上图3-图15皆为测试时系统运行图。经测试,系统正常运行,符合系统设计要求和开发需要。

结 论
本文描述了一个教务管理平台中权限系统及公共模块的设计与开发,从测试结果看,基本达到了当初课题设计要求。此权限系统可用于一般性的MIS系统中,具有较强的适应性,可动态分配角色和进行权限管理,并附带日志管理,异常管理,及大量的公共基础模块设计,为完整的系统开发打下基础。

参考文献
[1] Simon Pobinson.Professional C#[M].北京:清华大学出版社,2002。
[2] Jeffrey Richter.Microsoft .NET框架程序设计[M].北京:机械工业出版社,2003。
[3] James W.Cooper.C# Design Patterns[M].北京:电子工业出版社,2004。
[4] Richard Blum.C# Network Programming[M].北京:电子工业出版社,2003。
[5] 刘晓华.精通.NET核心技术[M].北京:电子工业出版社,2002。
[6] 狄龙(Darin Dillon)…NET开发人员调试策略[M].北京:清华大学出版社,2004。
[7] 刘友话…Net环境下数据库应用系统开发技术[M].北京:科学出版社,2004。
[8] Ian Sommerville.Software Engeering[M].北京:机械工业出版社,2003。
[9] Erich Gamma.Design Patterns[M].北京:机械工业出版社,2002。

致 谢
省略


5、资源下载

本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号毕业设计全套资源(点击下载)
本项目源码基于C#+asp.net+sqlserver的教务管理平台设计与实现(源码+文档)C#_.net_BS架构_教务管理平台.zip
using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace 教务管理系统 { public class ClassInfo : 医院管理系统.ParentForm { private System.Data.SqlClient.SqlCommand sqlSelectCommand1; private System.Data.SqlClient.SqlCommand sqlInsertCommand1; private System.Data.SqlClient.SqlCommand sqlUpdateCommand1; private System.Data.SqlClient.SqlCommand sqlDeleteCommand1; private System.Data.SqlClient.SqlConnection sqlConnection1; private 教务管理系统.DataSet1 dataSet11; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label8; private System.Windows.Forms.Label label9; private System.Windows.Forms.TextBox txt4; private System.Windows.Forms.TextBox txt5; private System.Windows.Forms.TextBox txt6; private System.Windows.Forms.TextBox txt9; private System.Windows.Forms.TextBox txt8; private System.Windows.Forms.TextBox txt7; private System.ComponentModel.IContainer components = null; public ClassInfo() { // 该调用是 Windows 窗体设计器所必需的。 InitializeComponent(); // TODO: 在 InitializeComponent 调用后添加任何初始化 } /// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region 设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.sqlSelectCommand1 = new System.Data.SqlClient.SqlCommand(); this.sqlConnection1 = new System.Data.SqlClient.SqlConnection(); this.sqlInsertCommand1 = new System.Data.SqlClient.SqlCommand(); this.sqlUpdateCommand1 = new System.Data.SqlClient.SqlCommand(); this.sqlDeleteCommand1 = new System.Data.SqlClient.SqlCommand(); this.dataSet11 = new 教务管理系统.DataSet1(); this.label4 = new System.Windows.Forms.Label(); this.txt4 = new System.Windows.Forms.TextBox(); this.txt5 = new System.Windows.Forms.TextBox(); this.label5 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); this.txt6 = new System.Windows.Forms.TextBox(); this.txt9 = new System.Windows.Forms.TextBox(); this.label7 = new System.Windows.Forms.Label(); this.label8 = new System.Windows.Forms.Label(); this.txt8 = new System.Windows.Forms.TextBox(); this.txt7 = new System.Windows.Forms.TextBox(); this.label9 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit(); this.groupBox2.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.dataSet11)).BeginInit(); // // groupBox1 // this.groupBox1.Name = "groupBox1"; // // txt2 // this.txt2.Name = "txt2"; // // label1 // this.label1.Name = "label1"; this.label1.Text = "年级"; this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // btnSearch // this.btnSearch.Name = "btnSearch"; this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click); // // txt1 // this.txt1.Name = "txt1"; // // label2 // this.label2.Name = "label2"; this.label2.Text = "班级编号"; // // txt3 // this.txt3.Name = "txt3"; // // label3 // this.label3.Name = "label3"; this.label3.Text = "班级名称"; // // toolBar1 // this.toolBar1.Name = "toolBar1"; this.toolBar1.Size = new System.Drawing.Size(728, 41); // // dataGrid1 // this.dataGrid1.DataMember = "班级信息"; this.dataGrid1.DataSource = this.dataSet11; this.dataGrid1.Name = "dataGrid1"; // // groupBox2 // this.groupBox2.Controls.Add(this.txt4); this.groupBox2.Controls.Add(this.label4); this.groupBox2.Controls.Add(this.txt5); this.groupBox2.Controls.Add(this.label5); this.groupBox2.Controls.Add(this.label6); this.groupBox2.Controls.Add(this.txt6); this.groupBox2.Controls.Add(this.txt9); this.groupBox2.Controls.Add(this.label7); this.groupBox2.Controls.Add(this.label8); this.groupBox2.Controls.Add(this.txt8); this.groupBox2.Controls.Add(this.txt7); this.groupBox2.Controls.Add(this.label9); this.groupBox2.Name = "groupBox2"; // // da1 // this.da1.DeleteCommand = this.sqlDeleteCommand1; this.da1.InsertCommand = this.sqlInsertCommand1; this.da1.SelectCommand = this.sqlSelectCommand1; this.da1.TableMappings.AddRange(new System.Data.Common.DataTableMapping[] { new System.Data.Common.DataTableMapping("Table", "班级信息", new System.Data.Common.DataColumnMapping[] { new System.Data.Common.DataColumnMapping("班级编号", "班级编号"), new System.Data.Common.DataColumnMapping("年级", "年级"), new System.Data.Common.DataColumnMapping("班级名称", "班级名称"), new System.Data.Common.DataColumnMapping("班级简称", "班级简称"), new System.Data.Common.DataColumnMapping("人数", "人数"), new System.Data.Common.DataColumnMapping("班主任", "班主任")})}); this.da1.UpdateCommand = this.sqlUpdateCommand1; // // sqlSelectCommand1 // this.sqlSelectCommand1.CommandText = "SELECT 班级编号, 年级, 班级名称, 班级简称, 人数, 班主任 FROM 班级信息 WHERE (班级编号 LIKE @Param4) AND (年级 " + "LIKE @Param5) AND (班级名称 LIKE @Param6)"; this.sqlSelectCommand1.Connection = this.sqlConnection1; this.sqlSelectCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Param4", System.Data.SqlDbType.VarChar, 14, "班级编号")); this.sqlSelectCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Param5", System.Data.SqlDbType.VarChar, 4, "年级")); this.sqlSelectCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Param6", System.Data.SqlDbType.VarChar, 30, "班级名称")); // // sqlConnection1 // this.sqlConnection1.ConnectionString = "workstation id=localhost;packet size=4096;integrated security=SSPI;data source=\"." + "\";persist security info=False;initial catalog=eisbook"; // // sqlInsertCommand1 // this.sqlInsertCommand1.CommandText = "INSERT INTO 班级信息(班级编号, 年级, 班级名称, 班级简称, 人数, 班主任) VALUES (@班级编号, @年级, @班级名称, @班级简称," + " @人数, @班主任); SELECT 班级编号, 年级, 班级名称, 班级简称, 人数, 班主任 FROM 班级信息 WHERE (班级编号 = @班级编号)" + ""; this.sqlInsertCommand1.Connection = this.sqlConnection1; this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@班级编号", System.Data.SqlDbType.VarChar, 14, "班级编号")); this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@年级", System.Data.SqlDbType.VarChar, 4, "年级")); this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@班级名称", System.Data.SqlDbType.VarChar, 30, "班级名称")); this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@班级简称", System.Data.SqlDbType.VarChar, 16, "班级简称")); this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@人数", System.Data.SqlDbType.Decimal, 5, System.Data.ParameterDirection.Input, false, ((System.Byte)(3)), ((System.Byte)(0)), "人数", System.Data.DataRowVersion.Current, null)); this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@班主任", System.Data.SqlDbType.VarChar, 8, "班主任")); // // sqlUpdateCommand1 // this.sqlUpdateCommand1.CommandText = @"UPDATE 班级信息 SET 班级编号 = @班级编号, 年级 = @年级, 班级名称 = @班级名称, 班级简称 = @班级简称, 人数 = @人数, 班主任 = @班主任 WHERE (班级编号 = @Original_班级编号) AND (人数 = @Original_人数 OR @Original_人数 IS NULL AND 人数 IS NULL) AND (年级 = @Original_年级 OR @Original_年级 IS NULL AND 年级 IS NULL) AND (班主任 = @Original_班主任 OR @Original_班主任 IS NULL AND 班主任 IS NULL) AND (班级名称 = @Original_班级名称 OR @Original_班级名称 IS NULL AND 班级名称 IS NULL) AND (班级简称 = @Original_班级简称 OR @Original_班级简称 IS NULL AND 班级简称 IS NULL); SELECT 班级编号, 年级, 班级名称, 班级简称, 人数, 班主任 FROM 班级信息 WHERE (班级编号 = @班级编号)"; this.sqlUpdateCommand1.Connection = this.sqlConnection1; this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@班级编号", System.Data.SqlDbType.VarChar, 14, "班级编号")); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@年级", System.Data.SqlDbType.VarChar, 4, "年级")); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@班级名称", System.Data.SqlDbType.VarChar, 30, "班级名称")); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@班级简称", System.Data.SqlDbType.VarChar, 16, "班级简称")); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@人数", System.Data.SqlDbType.Decimal, 5, System.Data.ParameterDirection.Input, false, ((System.Byte)(3)), ((System.Byte)(0)), "人数", System.Data.DataRowVersion.Current, null)); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@班主任", System.Data.SqlDbType.VarChar, 8, "班主任")); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_班级编号", System.Data.SqlDbType.VarChar, 14, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "班级编号", System.Data.DataRowVersion.Original, null)); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_人数", System.Data.SqlDbType.Decimal, 5, System.Data.ParameterDirection.Input, false, ((System.Byte)(3)), ((System.Byte)(0)), "人数", System.Data.DataRowVersion.Original, null)); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_年级", System.Data.SqlDbType.VarChar, 4, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "年级", System.Data.DataRowVersion.Original, null)); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_班主任", System.Data.SqlDbType.VarChar, 8, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "班主任", System.Data.DataRowVersion.Original, null)); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_班级名称", System.Data.SqlDbType.VarChar, 30, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "班级名称", System.Data.DataRowVersion.Original, null)); this.sqlUpdateCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_班级简称", System.Data.SqlDbType.VarChar, 16, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "班级简称", System.Data.DataRowVersion.Original, null)); // // sqlDeleteCommand1 // this.sqlDeleteCommand1.CommandText = @"DELETE FROM 班级信息 WHERE (班级编号 = @Original_班级编号) AND (人数 = @Original_人数 OR @Original_人数 IS NULL AND 人数 IS NULL) AND (年级 = @Original_年级 OR @Original_年级 IS NULL AND 年级 IS NULL) AND (班主任 = @Original_班主任 OR @Original_班主任 IS NULL AND 班主任 IS NULL) AND (班级名称 = @Original_班级名称 OR @Original_班级名称 IS NULL AND 班级名称 IS NULL) AND (班级简称 = @Original_班级简称 OR @Original_班级简称 IS NULL AND 班级简称 IS NULL)"; this.sqlDeleteCommand1.Connection = this.sqlConnection1; this.sqlDeleteCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_班级编号", System.Data.SqlDbType.VarChar, 14, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "班级编号", System.Data.DataRowVersion.Original, null)); this.sqlDeleteCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_人数", System.Data.SqlDbType.Decimal, 5, System.Data.ParameterDirection.Input, false, ((System.Byte)(3)), ((System.Byte)(0)), "人数", System.Data.DataRowVersion.Original, null)); this.sqlDeleteCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_年级", System.Data.SqlDbType.VarChar, 4, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "年级", System.Data.DataRowVersion.Original, null)); this.sqlDeleteCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_班主任", System.Data.SqlDbType.VarChar, 8, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "班主任", System.Data.DataRowVersion.Original, null)); this.sqlDeleteCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_班级名称", System.Data.SqlDbType.VarChar, 30, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "班级名称", System.Data.DataRowVersion.Original, null)); this.sqlDeleteCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Original_班级简称", System.Data.SqlDbType.VarChar, 16, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "班级简称", System.Data.DataRowVersion.Original, null)); // // dataSet11 // this.dataSet11.DataSetName = "DataSet1"; this.dataSet11.Locale = new System.Globalization.CultureInfo("zh-CN"); // // label4 // this.label4.Location = new System.Drawing.Point(64, 32); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(100, 16); this.label4.TabIndex = 0; this.label4.Text = "班级编号"; // // txt4 // this.txt4.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.dataSet11, "班级信息.班级编号")); this.txt4.Location = new System.Drawing.Point(64, 48); this.txt4.Name = "txt4"; this.txt4.ReadOnly = true; this.txt4.Size = new System.Drawing.Size(136, 21); this.txt4.TabIndex = 1; this.txt4.Text = ""; // // txt5 // this.txt5.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.dataSet11, "班级信息.年级")); this.txt5.Location = new System.Drawing.Point(232, 48); this.txt5.Name = "txt5"; this.txt5.ReadOnly = true; this.txt5.Size = new System.Drawing.Size(136, 21); this.txt5.TabIndex = 1; this.txt5.Text = ""; // // label5 // this.label5.Location = new System.Drawing.Point(232, 32); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(100, 16); this.label5.TabIndex = 0; this.label5.Text = "年级"; // // label6 // this.label6.Location = new System.Drawing.Point(408, 32); this.label6.Name = "label6"; this.label6.Size = new System.Drawing.Size(100, 16); this.label6.TabIndex = 0; this.label6.Text = "班级名称"; // // txt6 // this.txt6.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.dataSet11, "班级信息.班级名称")); this.txt6.Location = new System.Drawing.Point(408, 48); this.txt6.Name = "txt6"; this.txt6.ReadOnly = true; this.txt6.Size = new System.Drawing.Size(136, 21); this.txt6.TabIndex = 1; this.txt6.Text = ""; // // txt9 // this.txt9.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.dataSet11, "班级信息.班主任")); this.txt9.Location = new System.Drawing.Point(408, 96); this.txt9.Name = "txt9"; this.txt9.ReadOnly = true; this.txt9.Size = new System.Drawing.Size(136, 21); this.txt9.TabIndex = 1; this.txt9.Text = ""; // // label7 // this.label7.Location = new System.Drawing.Point(408, 80); this.label7.Name = "label7"; this.label7.Size = new System.Drawing.Size(100, 16); this.label7.TabIndex = 0; this.label7.Text = "班主任"; // // label8 // this.label8.Location = new System.Drawing.Point(232, 80); this.label8.Name = "label8"; this.label8.Size = new System.Drawing.Size(100, 16); this.label8.TabIndex = 0; this.label8.Text = "人数"; // // txt8 // this.txt8.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.dataSet11, "班级信息.班级简称")); this.txt8.Location = new System.Drawing.Point(232, 96); this.txt8.Name = "txt8"; this.txt8.ReadOnly = true; this.txt8.Size = new System.Drawing.Size(136, 21); this.txt8.TabIndex = 1; this.txt8.Text = ""; // // txt7 // this.txt7.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.dataSet11, "班级信息.班级简称")); this.txt7.Location = new System.Drawing.Point(64, 96); this.txt7.Name = "txt7"; this.txt7.ReadOnly = true; this.txt7.Size = new System.Drawing.Size(136, 21); this.txt7.TabIndex = 1; this.txt7.Text = ""; // // label9 // this.label9.Location = new System.Drawing.Point(64, 80); this.label9.Name = "label9"; this.label9.Size = new System.Drawing.Size(100, 16); this.label9.TabIndex = 0; this.label9.Text = "班级简称"; // // ClassInfo // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(728, 502); this.Name = "ClassInfo"; this.Text = "【班级信息维护】"; this.Load += new System.EventHandler(this.ClassInfo_Load); ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit(); this.groupBox2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.dataSet11)).EndInit(); } #endregion //--------创建窗体时,读入数据------- private void ClassInfo_Load(object sender, System.EventArgs e) { da1.SelectCommand.Parameters[0].Value="%"; da1.SelectCommand.Parameters[1].Size=8;//4位年份输入 da1.SelectCommand.Parameters[1].Value="%"; da1.SelectCommand.Parameters[2].Value="%"; da1.Fill(dataSet11); //设置数据导航控件 this.cmOrders=(CurrencyManager) BindingContext[dataSet11,"班级信息"]; //将基类中的数据集与派生类中的数据集连接 base.dataSet11=this.dataSet11; } //-----------根据输入,检索信息---------- private void btnSearch_Click(object sender, System.EventArgs e) { da1.SelectCommand.Parameters[0].Value="%"; da1.SelectCommand.Parameters[1].Value="%"; da1.SelectCommand.Parameters[2].Value="%"; if(txt1.Text.Trim()!="") { da1.SelectCommand.Parameters[0].Value="%"+txt1.Text.Trim()+"%"; } if(txt2.Text.Trim()!="") { da1.SelectCommand.Parameters[1].Value="%"+txt2.Text.Trim()+"%"; } if(txt3.Text.Trim()!="") { da1.SelectCommand.Parameters[2].Value="%"+txt3.Text.Trim()+"%"; } dataSet11.Clear();//刷新数据集 da1.Fill(dataSet11); } //----------重写设置控件只读属性函数---------- protected override void SetModifyMode(bool blnEdit) { base.SetModifyMode (blnEdit); txt4.ReadOnly=!blnEdit; txt5.ReadOnly=!blnEdit; txt6.ReadOnly=!blnEdit; txt7.ReadOnly=!blnEdit; txt8.ReadOnly=!blnEdit; txt9.ReadOnly=!blnEdit; } //-------重写新增记录时设置默认值函数-------- protected override void SetDefaultValue() { base.SetDefaultValue (); } //-------重写检查非空字段函数-------- protected override bool CheckNotNull() { if(txt4.Text.Trim()=="")// 班级编号不能为空 { MessageBox.Show("班级编号不能为空","提示",MessageBoxButtons.OK,MessageBoxIcon.Stop); return(false); } return base.CheckNotNull (); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕业设计方案专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值