【Web開發技術】德優教育管理系統

xiaowei_cqu發表於2020-04-07

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年交付)、傳送生日祝福郵件或簡訊、上了什麼課、簡訊群發通知(目前用彩翼簡訊群發)、郵件群發通知、學生情況統計分析
三、課程管理模組(借鑑學校需求設計)
什麼時候有什麼課程 
四、許可權管理模組(借鑑學校需求設計)
許可權管理模組包括登入系統使用者角色管理、使用者管理、登入使用者許可權管理等,學生可進行公開資料的檢視,只有管理員才能拷貝資料資料

【開發計劃】



【人力資源】

阿德 系統總體構架設計,進度安排,教師模組,通用模組
小鹿 詳細設計,管理員模組
小魏 詳細設計,前臺模組,諮詢報名預報名模組
帥哥 詳細設計,學生模組

軟體設計

【概要設計】



模組一:報名模組

使用者角色:系統管理員、普通使用者、已預報名使用者
系統管理員:
1、 可以進入統計模組分類檢視、匯出所有諮詢人資訊
2、 可以進入統計模組分類檢視、匯出所有預報名人資訊
3、 可以進入統計模組分類檢視、匯出所有報名人資訊
4、 可以進入諮詢模組修改學校基本資訊簡介
5、 可以進入諮詢模組回覆郵件諮詢
6、 可以進入諮詢模組回覆線上諮詢
普通使用者
1、 可以進入諮詢模組檢視學校基本資訊
2、 可以進入諮詢模組填寫諮詢資訊,提交郵件諮詢申請
3、 可以進入諮詢模組線上諮詢
4、 可以進入預報名模組填寫相應資訊預報名
已預報名使用者
1、 可以進入諮詢模組檢視學校基本資訊
2、 可以進入諮詢模組填寫諮詢資訊,提交郵件諮詢申請
3、 可以進入諮詢模組線上諮詢
4、 可以進入預報名模組修改預報名資訊
5、 可以進入報名模組填寫相應資訊報名
6、 可以進入報名模組檢視個人資訊,提交修改申請

模組二:學生資訊模組

使用者角色:系統管理員、教師使用者、學生使用者
系統管理員:
1、 可以進入統計模組分類檢視、匯出所有學生資訊
2、 可以進入統計模組分類檢視、匯出所有學生學習進度,成績
3、 可以進入統計模組分類檢視學生資訊分析(包括生成報表,各種圖表,排序等)
4、 可以進入統計模組分類檢視、匯出所有班級資訊
5、 可以進入班級模組搜尋檢視學校所有班級資訊
6、 可以進入班級模組管理班級(包括新增、刪除班級、修改班級資訊)
7、 可以進入班級模組給所有班級教師、學生群發郵件,簡訊
8、 可以進入班級模組釋出全校通知
9、 可以進入個人模組搜尋檢視任意教師、學生資訊
10、 可以進入個人模組修改教師基本資訊、學生基本資訊、學籍資訊
教師使用者
1、 可以進入班級模組檢視全校班級資訊
2、 可以進入班級模組檢視自己班學生資訊
3、 可以進入班級模組釋出自己班內通知
4、 可以進入班級模組給自己班學生群發郵件,簡訊
5、 可以進入個人模組管理檢視、修改教師個人基本資訊
6、 可以進入個人模組搜尋檢視學校任意學生資訊
學生使用者
1、 可以進入班級模組檢視通知,檢視班級資訊
2、 可以進入班級給班內教師發郵件,簡訊
3、 可以進入個人模組檢視個人基本資訊,提交修改資訊申請

模組三:課程管理模組

使用者角色:系統管理員、教師使用者、學生使用者
系統管理員:
1、 可以進入學校模組分類檢視、匯出全校所有課程課表
2、 可以進入學校模組修改全校課表
3、 可以進入學校模組檢視、匯出任意課程、任意班級成績
4、 可以進入班級模組分類檢視、匯出任意班級課表
5、 可以進入班級模組修改任意班級課表(包括課程的新增、刪除、調整)
6、 可以進入個人模組分類檢視匯出任意教師、學生個人課表
教師使用者:
1、 可以進入學校模組搜尋檢視學校課表
2、 可以進入班級模組搜尋檢視任意班級的課表
3、 可以進入班級模組學習自己班級學生學習進度
4、 可以進入班級模組登記自己班級課程的成績
5、 可以進入班級模組上傳教學課件
6、 可以進入個人模組檢視自己的課表
7、 可以進入個人模組提交調課申請
學生使用者:
1、 可以進入學校模組檢視全校課表
2、 可以進入班級模組檢視所在班級的課表
3、 可以進入個人模組檢視個人課表
4、 可以進入個人模組檢視個人所修課程學習進度
5、 可以進入個人模組檢視下載任意課程教師共享的課件
6、 可以進入個人模組檢視任意課程成績,提交查卷申請
7、 可以進入個人模組進行選課
8、 可以進入個人模組提交退課、改選申請

模組四:課程管理模組
使用者角色:系統管理員
系統管理員:
1、 可以授予任意角色、個人許可權
2、 可以管理任意角色、個人許可權(包括許可權的修改、收回)

因為我主要負責前臺登陸,學校簡介及諮詢報名模組,需要對諮詢報名部分使用者的角色變化很清楚,為了便於記錄資訊,我們要求諮詢或者預報名必須先註冊。報名必須先預報名。
使用者角色變化圖:


軟硬體開發環境



實現的過程

【系統架構和整體設計】

我們專案中的資源列表(紅色的為我負責的部分)


【資料庫設計】

1. 管理員表


2. 註冊者表


3. 諮詢者表


4. 預報名者列表


5. 報名者的表


6. 學生表


7. 教師表


8. 推薦人表


9. 學校表

10. 德優

11. 新聞表

12. 課程的表

13. 專業表

14. 班級表

15. 課程_班級

16. 學生_課程表

17. 學生_班級表

18. 諮詢內容表


【系統邏輯功能編寫】

   這部分主要是與頁面無關的一些邏輯處理‘包含多個類檔案


實體類:分別用來儲存對應資料表裡的資訊。


邏輯類:(DBConnectionStore、DBAccess、DBCommandStore)
執行一定的邏輯操作;資料庫的連結;增、刪、改、查語句的執行;執行事務、儲存過程


RoleManage、StuManage、TeacManage
以及諮詢報名者角色轉換等、對學生老師到等資訊的修改等。


【具體程式碼】

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;
        }

頁面展示

由於我們功能完善,頁面極多,無法一一列出,這裡只給出部分頁面截圖 。

主頁整體效果:

學校簡介頁面:

諮詢及報名模組:

諮詢模組檢視個人資訊:

諮詢模組預報名頁面:

諮詢模組報名頁面:

管理員模組部分截圖:

學生模組部分截圖:

教師模組部分截圖:


結果分析

  1. 此次課程設計是自己第一次比較完整的參與WEB專案的開發,而且自己所在的隊伍很和諧很強大,雖然開始計劃的任務龐大了些,最後結尾的有些匆忙,但真的感覺學到很多東西。
  2. 感覺我們前期分析還是很到位的,因為每個人都非常想做好。幾次需求分析並先開發出原型與客戶交流,使我們一再改進最初的設計,到需求分析結束時,已經將專案原型分析的比較詳細。
  3. 然後就是我們溝通也很好,雖然一方面把這次課設當成真實的專案來做,另一方面更抱著一種學習的心態。實現功能的同時儘可能的考慮效率,並多多嘗試新鮮的自己之前沒有用過的控制元件,技術,努力去實現一些有趣的功能。
  4. 比較大的遺憾是,後期沒有嚴格按照開始的進度安排執行,最後還有些功能沒有完善,急於收尾。事情多並不是藉口,多到一再擱置原本的計劃只能說明自己並沒有很好的掌控生活。真正要做到優秀,一定是長期不懈的實踐和不遺餘力的博覽群書。如何踐行這句話,如何平衡每天的每件事,平衡實踐和學習仍是自己要不斷思考和努力的。

轉載請註明出處:http://blog.csdn.net/xiaowei_cqu/article/details/7774843



相關文章