【Web开发技术】德优教育管理系统

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205

 

德优教育管理系统


德优,德优~永远战斗力顽强的 阿德 ,始终彻底管理自我的 小鹿 ,踏实谦逊的 帅哥 ,和最挫的 ,一起完成的。
虽然都称不上完整的项目,却毫无疑问是值得怀念的和骄傲的。
与有肝胆人共事,从无字句处读书。
这次项目让我认识到,软件人学习之源不仅仅是书和代码,更有战友!

软件需求


【项目开发目的】

通过本实验,能够应用和熟悉web开发及数据库相关技术进行B/S模式应用系统开发。
本小组将基于德优教育管理系统的基本需求做详细开发。

【需求要求】

本系统主要包括四大功能模块,分述如下:
一、报名管理模块
  1. 咨询 记录咨询人电话、手机、QQ、邮箱、性别、出生日期、籍贯、地址、最高学历(高中、中专、大专、。本科)、是否有学位、层次(高升专、专升本、高升本、研究生)、专业(第一志愿、第二志愿)、学校(第一志愿、第二志愿) 学习意愿分类:A、B、C 、推荐人 咨询内容梗概
  2. 预报名 报名人电话、性别、身份证、QQ、邮箱、推荐人及已推荐的个数、交费否、已交费多少、已提交资料(相片、毕业证、职业资格证)、报考学校、报考专业、报考层次(专科、本科、研究生)、学习形式(函授、业余、脱产)、学习类型:成教、网教、自考 研究生
  3. 报名 报名人信息、联系方式、所属地区、入学时间、工作单位、职称、职务、家庭情况 可以分类统计(单位、地区、行业、类别、来源、生日)(借鉴学校需求设计)
二、学生管理模块(借鉴学校需求设计)
学生交费情况(可分期5年交付)、发送生日祝福邮件或短信、上了什么课、短信群发通知(目前用彩翼短信群发)、邮件群发通知、学生情况统计分析
三、课程管理模块(借鉴学校需求设计)
什么时候有什么课程
四、权限管理模块(借鉴学校需求设计)
权限管理模块包括登录系统用户角色管理、用户管理、登录用户权限管理等,学生可进行公开资料的查看,只有管理员才能拷贝数据资料

【开发计划】

【Web开发技术】德优教育管理系统_第1张图片

【人力资源】

阿德 系统总体构架设计,进度安排,教师模块,通用模块
小鹿 详细设计,管理员模块
小魏 详细设计,前台模块,咨询报名预报名模块
帅哥 详细设计,学生模块

软件设计

【概要设计】

【Web开发技术】德优教育管理系统_第2张图片

模块一:报名模块
【Web开发技术】德优教育管理系统_第3张图片
用户角色:系统管理员、普通用户、已预报名用户
系统管理员:
1、 可以进入统计模块分类查看、导出所有咨询人信息
2、 可以进入统计模块分类查看、导出所有预报名人信息
3、 可以进入统计模块分类查看、导出所有报名人信息
4、 可以进入咨询模块修改学校基本信息简介
5、 可以进入咨询模块回复邮件咨询
6、 可以进入咨询模块回复在线咨询
普通用户
1、 可以进入咨询模块查看学校基本信息
2、 可以进入咨询模块填写咨询信息,提交邮件咨询申请
3、 可以进入咨询模块在线咨询
4、 可以进入预报名模块填写相应信息预报名
已预报名用户
1、 可以进入咨询模块查看学校基本信息
2、 可以进入咨询模块填写咨询信息,提交邮件咨询申请
3、 可以进入咨询模块在线咨询
4、 可以进入预报名模块修改预报名信息
5、 可以进入报名模块填写相应信息报名
6、 可以进入报名模块查看个人信息,提交修改申请

模块二:学生信息模块
【Web开发技术】德优教育管理系统_第4张图片
用户角色:系统管理员、教师用户、学生用户
系统管理员:
1、 可以进入统计模块分类查看、导出所有学生信息
2、 可以进入统计模块分类查看、导出所有学生学习进度,成绩
3、 可以进入统计模块分类查看学生信息分析(包括生成报表,各种图表,排序等)
4、 可以进入统计模块分类查看、导出所有班级信息
5、 可以进入班级模块搜索查看学校所有班级信息
6、 可以进入班级模块管理班级(包括添加、删除班级、修改班级信息)
7、 可以进入班级模块给所有班级教师、学生群发邮件,短信
8、 可以进入班级模块发布全校通知
9、 可以进入个人模块搜索查看任意教师、学生信息
10、 可以进入个人模块修改教师基本信息、学生基本信息、学籍信息
教师用户
1、 可以进入班级模块查看全校班级信息
2、 可以进入班级模块查看自己班学生信息
3、 可以进入班级模块发布自己班内通知
4、 可以进入班级模块给自己班学生群发邮件,短信
5、 可以进入个人模块管理查看、修改教师个人基本信息
6、 可以进入个人模块搜索查看学校任意学生信息
学生用户
1、 可以进入班级模块查看通知,查看班级信息
2、 可以进入班级给班内教师发邮件,短信
3、 可以进入个人模块查看个人基本信息,提交修改信息申请

模块三:课程管理模块
【Web开发技术】德优教育管理系统_第5张图片
用户角色:系统管理员、教师用户、学生用户
系统管理员:
1、 可以进入学校模块分类查看、导出全校所有课程课表
2、 可以进入学校模块修改全校课表
3、 可以进入学校模块查看、导出任意课程、任意班级成绩
4、 可以进入班级模块分类查看、导出任意班级课表
5、 可以进入班级模块修改任意班级课表(包括课程的添加、删除、调整)
6、 可以进入个人模块分类查看导出任意教师、学生个人课表
教师用户:
1、 可以进入学校模块搜索查看学校课表
2、 可以进入班级模块搜索查看任意班级的课表
3、 可以进入班级模块学习自己班级学生学习进度
4、 可以进入班级模块登记自己班级课程的成绩
5、 可以进入班级模块上传教学课件
6、 可以进入个人模块查看自己的课表
7、 可以进入个人模块提交调课申请
学生用户:
1、 可以进入学校模块查看全校课表
2、 可以进入班级模块查看所在班级的课表
3、 可以进入个人模块查看个人课表
4、 可以进入个人模块查看个人所修课程学习进度
5、 可以进入个人模块查看下载任意课程教师共享的课件
6、 可以进入个人模块查看任意课程成绩,提交查卷申请
7、 可以进入个人模块进行选课
8、 可以进入个人模块提交退课、改选申请

模块四:课程管理模块
【Web开发技术】德优教育管理系统_第6张图片
用户角色:系统管理员
系统管理员:
1、 可以授予任意角色、个人权限
2、 可以管理任意角色、个人权限(包括权限的修改、收回)

因为我主要负责前台登陆,学校简介及咨询报名模块,需要对咨询报名部分用户的角色变化很清楚,为了便于记录信息,我们要求咨询或者预报名必须先注册。报名必须先预报名。
用户角色变化图:
【Web开发技术】德优教育管理系统_第7张图片

软硬件开发环境

【Web开发技术】德优教育管理系统_第8张图片

实现的过程

【系统架构和整体设计】

我们项目中的资源列表(红色的为我负责的部分)
【Web开发技术】德优教育管理系统_第9张图片

【数据库设计】

1. 管理员表
【Web开发技术】德优教育管理系统_第10张图片

2. 注册者表
【Web开发技术】德优教育管理系统_第11张图片

3. 咨询者表
【Web开发技术】德优教育管理系统_第12张图片

4. 预报名者列表
【Web开发技术】德优教育管理系统_第13张图片

5. 报名者的表
【Web开发技术】德优教育管理系统_第14张图片

6. 学生表
【Web开发技术】德优教育管理系统_第15张图片

7. 教师表
【Web开发技术】德优教育管理系统_第16张图片

8. 推荐人表


9. 学校表

10. 德优
【Web开发技术】德优教育管理系统_第17张图片

11. 新闻表

12. 课程的表
【Web开发技术】德优教育管理系统_第18张图片

13. 专业表

14. 班级表

15. 课程_班级

16. 学生_课程表
【Web开发技术】德优教育管理系统_第19张图片

17. 学生_班级表

18. 咨询内容表
【Web开发技术】德优教育管理系统_第20张图片

【系统逻辑功能编写】

这部分主要是与页面无关的一些逻辑处理‘包含多个类文件
【Web开发技术】德优教育管理系统_第21张图片

实体类:分别用来存储对应数据表里的信息。
【Web开发技术】德优教育管理系统_第22张图片

逻辑类:(DBConnectionStore、DBAccess、DBCommandStore)
执行一定的逻辑操作;数据库的链接;增、删、改、查语句的执行;执行事务、存储过程
【Web开发技术】德优教育管理系统_第23张图片

RoleManage、StuManage、TeacManage
以及咨询报名者角色转换等、对学生老师到等信息的修改等。
【Web开发技术】德优教育管理系统_第24张图片

【具体代码】

1. DBA中用于执行事务操作
///<summary>
        ///modify
        ///使用事务,输入一组必须作为一个单元操作的语句,执行成功返回true,失败则滚回返回false
        ///</summary>
        public static bool modifyTrans(string[] sqls)
        {
            bool flag = false;
            SqlConnection sqlConnection = null;
            SqlTransaction sqlTransaction = null;
            try
            {
                sqlConnection = new SqlConnection(strCon);
                sqlConnection.Open();
                sqlTransaction = sqlConnection.BeginTransaction();
                for (int i = 0; i < sqls.Length; i++)
                {
                    SqlCommand sqlCommand = sqlConnection.CreateCommand();
                    sqlCommand.CommandText = sqls[i];
                    sqlCommand.Transaction = sqlTransaction;
                    sqlCommand.ExecuteNonQuery();
                }
                sqlTransaction.Commit();
                flag = true;
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                sqlTransaction.Rollback();
                flag = false;
                Console.Write("Transaction rolled back\n" + ex.Message);
            }
            catch (System.Exception ex)
            {
                flag = false;
                Console.Write("System Error\n" + ex.Message);
            }
            finally
            {
                if (sqlConnection != null)
                {
                    if (sqlConnection.State == ConnectionState.Open)
                        sqlConnection.Close();
                }
            }
            return flag;
        }

2. 登陆部分业务处理
public string getRole(string logName, string logPwd)
        {
            string role = "no";
            try
            {
                if (logName.IndexOf("@") > 0)
                {
                    string[] sqls1 = new string[] 
                {   
                    "select * from Zhuce where LogName=",
                    "select * from Register where rLogName=",
                    "select * from PreRegister where preLogName=",
                    "select * from Consultant where conLoginName="
                };
                    string[] sqls2 = new string[]
                {   
                    " and Pwd=",
                    " and rPwd=",
                    " and prePwd=",
                    " and conPwd="
                };
                    string[] roles = new string[] { "Zhuce", "Register", "PreRegister", "Consultant" };
                    string[] keys = new string[] { "LogName", "rLogName", "preLogName", "conLoginName" };
                    int i = 0;
                    while (i < 4)// 分别查询是否是注册者,咨询者,报名者,预报名者
                    {
                        string table = roles[i];
                        DataSet ds = new DataSet();
                        sql = sqls1[i] + "\'" + logName + "\'" + sqls2[i] + "\'" + logPwd + "\'";
                        ds = DBAccess.searchData(sql, table);
                        string key = keys[i];
                        ds.Tables[table].PrimaryKey = new DataColumn[] { ds.Tables[table].Columns[key] };
                        if (ds.Tables[table].Rows.Find(logName) != null)
                        {
                            role = table;
                            return role;
                        }
                        else
                            i = i + 1;
                    }
                }
                else
                {
                    string[] sqls1 = new string[] 
                { 
                    "select * from Admin where adminID=",
                    "select * from Teacher where teacherID=",
                    "select * from Student where stuNbr="
                };
                    string[] sqls2 = new string[]
                { 
                    " and adminPwd=",
                    " and teaPwd=",
                    " and stuPwd="
                };
                    string[] roles = new string[] { "Admin", "Teacher", "Student" };
                    string[] keys = new string[] { "adminID", "teacherID", "stuNbr" };
                    int i = 0;

                    while (i < 3)// 分别查询是否是管理员,老师,学生
                    {
                        string table = roles[i];
                        DataSet ds = new DataSet();
                        sql = sqls1[i] + "\'" + logName + "\'" + sqls2[i] + "\'" + logPwd + "\'";
                        ds = DBAccess.searchData(sql, table);
                        string key = keys[i];
                        ds.Tables[table].PrimaryKey = new DataColumn[] { ds.Tables[table].Columns[key] };
                        if (ds.Tables[table].Rows.Find(logName) != null)
                        {
                            role = table;
                            return role;
                        }
                        else
                            i = i + 1;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
            }
            return role;
        }


        public Object getObject(string role, string logName)
        {
            RoleManage rm = new RoleManage();
            switch (role)
            {
                case "Zhuce":
                    Zhuce zc = rm.getZhuce(logName);
                    return zc;
                case "Consultant":
                    Consultant consultant = rm.getConsultant(role);
                    return consultant;
                case "PreRegister":
                    PreRegister pregegister = rm.getPreRegister(role);
                    return pregegister;
                case "Register":
                    Register register = rm.getRegister(role);
                    return register;
                 case "Student":
                    StuManager sm = new StuManager();
                    Student student = sm.getBaseInfo(logName);
                    return student;
                 case "Teacher":
                     break;
                 case "Admin":
                     break;
            }
            return rm;
        }

前台直接判断并得到对象存放在session之中
protected void imbLogin_Click(object sender, ImageClickEventArgs e)
        {
            LogIn log = new LogIn();
            string logName = Request.Form["logName"].ToString();
            string pwd = Request.Form["logPwd"].ToString();
            string role = log.getRole(logName, pwd);
            if (role != "no")
            {
                switch (role)
                {
                    case "Zhuce":
                        Zhuce zhuce = (Zhuce)log.getObject(role, logName);
                        Session["role"] = role;
                        Session["Zhuce"] = zhuce;
                        Response.Redirect("Member/RegisterPage.aspx");
                        break;
                    case "Register":
                        Register register = (Register)log.getObject(role, logName);
                        Session["role"] = role;
                        Session["Register"] = register;
                        Response.Redirect("Member/RegisterPage.aspx");
                        break;
                    case "PreRegister":
                        PreRegister preregister = (PreRegister)log.getObject(role, logName);
                        Session["role"] = role;
                        Session["PreRegister"] = preregister;
                        Response.Redirect("Member/RegisterPage.aspx");
                        break;
                    case "Consultant":
                        Consultant consultant = (Consultant)log.getObject(role, logName);
                        Session["role"] = role;
                        Session["Consultant"] = consultant;
                        Response.Redirect("Member/RegisterPage.aspx");
                        break;
                    case "Admin":
                        Adminis admin = (Adminis)log.getObject(role, logName);
Session["role"] = role;
                        Session["Admin"] = admin;
                        Response.Redirect("Admin/Adminhome.aspx");

                        break;
                    case "Teacher":
                        Teacher teacher = (Teacher)log.getObject(role, logName);
Session["role"] = role;
                        Session["Teacher"] = teacher;
                        Response.Redirect("Teachers/Teacherhome.aspx");

                        break;
                    case "Student":
                        Student student = (Student)log.getObject(role, logName);
Session["role"] = role;
                        Session["Student"] = student;
                        Response.Redirect("Students/Studenthome.aspx");
                        break;
                    default:
                        break;
                }
                Response.Write("<script>alert('" + role + "欢迎您!')</script>");
            }

            else
                Response.Write("<script>alert('用户名或密码错误!')</script>");
        }

3. 主界面中滚动的站内公告
<marquee scrollAmount=2 width=300 height=160 direction=up>欢迎来到德优:<br>请先注册<br>您可以通过邮箱咨询<p><a href="http://www.gdpxedu.com/">点这里进入德优/a></marquee>

4. 验证码动态生成
需要加引用:
using System.Drawing;
using System.Drawing.Text;
using System.Text;
using System.IO;
using System.Workflow.ComponentModel.Design;
using System.Drawing.Imaging;
增加引用集:
C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\ System.Workflow.ComponentModel.dll

private void ValidateCode(string VNum)
        {
            int gheight = VNum.Length * 12;
            using (System.Drawing.Bitmap Img=new System.Drawing.Bitmap(gheight,25)){
                using (System.Drawing.Graphics g=System.Drawing.Graphics.FromImage(Img)){
                    g.Clear(Color.White);
                    Font f = new Font("Arial Black", 10);
                    SolidBrush s = new SolidBrush(Color.Black);
                    g.DrawString(VNum, f, s, 3, 3);
                    MemoryStream ms = new MemoryStream();
                    Img.Save(ms, ImageFormat.Jpeg);
                    Response.ClearContent();
                    Response.BinaryWrite(ms.ToArray());
                }
            }
            Response.End();
            
        }

        private string RndNum(int VcodeNum)
        {
            string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
            string[] VcArray = Vchar.Split(new Char[] { ',' });
            string VNum = "";
            int temp = -1;
            Random rand = new Random();
            for(int i=1;i<VcodeNum+1;i++)
            {
                if(temp!=-1)
                {
                    rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));
                }
                int t = rand.Next(35);
                if(temp!=-1&&temp==t)
                {
                    return RndNum(VcodeNum);
                }
                temp=t;
                VNum += VcArray[t];
            }
            return VNum;
        }

页面展示

由于我们功能完善,页面极多,无法一一列出,这里只给出部分页面截图 。

主页整体效果:
【Web开发技术】德优教育管理系统_第25张图片

学校简介页面:
【Web开发技术】德优教育管理系统_第26张图片

咨询及报名模块:
【Web开发技术】德优教育管理系统_第27张图片

咨询模块查看个人信息:
【Web开发技术】德优教育管理系统_第28张图片

咨询模块预报名页面:
【Web开发技术】德优教育管理系统_第29张图片

咨询模块报名页面:
【Web开发技术】德优教育管理系统_第30张图片

管理员模块部分截图:
【Web开发技术】德优教育管理系统_第31张图片

学生模块部分截图:
【Web开发技术】德优教育管理系统_第32张图片

教师模块部分截图:
【Web开发技术】德优教育管理系统_第33张图片

结果分析

  1. 此次课程设计是自己第一次比较完整的参与WEB项目的开发,而且自己所在的队伍很和谐很强大,虽然开始计划的任务庞大了些,最后结尾的有些匆忙,但真的感觉学到很多东西。
  2. 感觉我们前期分析还是很到位的,因为每个人都非常想做好。几次需求分析并先开发出原型与客户交流,使我们一再改进最初的设计,到需求分析结束时,已经将项目原型分析的比较详细。
  3. 然后就是我们沟通也很好,虽然一方面把这次课设当成真实的项目来做,另一方面更抱着一种学习的心态。实现功能的同时尽可能的考虑效率,并多多尝试新鲜的自己之前没有用过的控件,技术,努力去实现一些有趣的功能。
  4. 比较大的遗憾是,后期没有严格按照开始的进度安排执行,最后还有些功能没有完善,急于收尾。事情多并不是借口,多到一再搁置原本的计划只能说明自己并没有很好的掌控生活。真正要做到优秀,一定是长期不懈的实践和不遗余力的博览群书。如何践行这句话,如何平衡每天的每件事,平衡实践和学习仍是自己要不断思考和努力的。

转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7774843



你可能感兴趣的:(web开发)