一、項目背景
學生選課及成績查詢系統是一個學校不可缺少的部分,傳統的人工管理檔案的方式存在著很多的缺點,如:效率低、保密性差等,所以開發(fā)一套綜合教務系統管理軟件很有必要,它應該具有傳統的手工管理所無法比擬的優(yōu)點,如:檢索迅速、查找方便、可靠性高、存儲量大、保密性好、壽命長、成本低等。這些優(yōu)點能夠極大的提高學校的管理效率,有助于推進學校的信息化建設。
二、技術選型
C#的窗體程序開發(fā)
本系統未采用C#實現MDI——多文檔窗口,因為考慮到C#的該技術與java類似,而暑期java實訓時,曾用過類似的方法做過停車場管理系統,所以想為這次的系統注入一點新鮮的血液,所以本系統設計的主題采用了了C#的C#TreeView 實現。
Sql server數據庫
三、需求分析
本系統包括兩類用戶:學生、管理員。管理員可以通過系統來添加管理員信息、修改管理員信息、添加學生信息、修改學生信息;開設課程、查詢課程、錄入成績、統計成績、修改成績、修改個人密碼等,而學生則可以通過系統來選擇課程、查詢課程、顯示自己的課表、查詢自己的成績單、修改個人密碼等等。
3.1系統實現的功能流程
具體的功能概述如下:
3.2管理員角色擁有的功能
管理員信息管理
添加管理員信息;
管理員可以添加其他的管理員信息。
修改管理員信息;
管理員可以刪除其他的管理員信息。
學生信息管理
添加學生信息;
管理員可以添加學生信息,這些信息包括學生的學號,密碼,年級,專業(yè),出生日期等等。
修改學生信息;
管理員可以修改學生的信息;
課程管理
開設課程;
管理員可以錄入課程信息,學生就可以瀏覽到這些課程信息,從而選課。
查詢課程;
可以通過學期查詢課程,或通過學期和課程結合的方式查詢課程。
成績管理
錄入成績;
管理員可以錄入學生的成績。
統計成績;
管理員可以通過學期和課程信息來統計某門課的學生成績,平均分、最高分、最低分以及可以通過成績區(qū)間來查詢某個學期某門課的學生的成績信息。并且可以實現排序功能。
修改成績;
管理員可以對成績出錯的學生的成績進行修改。
修改個人密碼;
管理員可以修改自己的密碼。
3.3學生角色擁有的功能
課程管理
選擇課程;
學生可以根據本學期管理員發(fā)布的課程來選課。
查詢課程;
可以通過學期查詢課程,或通過學期和課程結合的方式查詢課程。
顯示課表;
學生可以根據自己的選課情況來查詢自己的課表。
成績管理
我的成績單;
學生可以根據學期來查詢自己某個學期所有選修課程的成績信息。
修改個人密碼;
學生可以修改自己的密碼。
四、數據庫設計
4.1數據庫關系圖
4.2完成系統中數據表的結構設計
學生信息表
用戶表:student
字段名稱 數據類型 可空 默認值 說明
stuid int 不可 主鍵,學生id,無實際意思,每次自增1
stuname Nvarchar(30) 不可 學生姓名
stuxuehao Nvarchar(30) 不可 學生學號,不能重復,登陸時的用戶名默認是學號。
stupasswd Nvarchar(30) 不可 學生密碼
stugrade Nvarchar(30) 學生年級
stumajor Nvarchar(30) 學生專業(yè)
stusex varchar(2) 學生性別
stuborn Nvarchar(30) 學生出生日期
role Nvarchar(30) 學生 角色,學生
stuhometown Nvarchar(30) 學生籍貫
管理員信息表
管理員信息表:manager
字段名稱 數據類型 可空 默認值 說明
manid int 不可 主鍵,管理員id,無實際意思,每次自增1
manname Nvarchar(30) 不可 管理員用戶名
role Nvarchar(30) 不可 管理員 角色,管理員
manpasswd Nvarchar(30) 不可 管理員密碼
課程表
課程表:class
字段名稱 數據類型 可空 默認值 說明
claid int 不可 主鍵,課程id,無實際意思,每次自增1
claname Nvarchar(30) 不可 課程名
term Nvarchar(30) 不可 開課的學期
teacher Nvarchar(30) 不可 開課的教師
課程細節(jié)表
課程細節(jié)表:sctime
字段名稱 數據類型 可空 默認值 說明
sctimeid int 不可 主鍵,課程細節(jié)id,無實際意思,每次自增1
claid int 不可 外鍵,課程號
sctime Nvarchar(30) 不可 課程上課的時間
location Nvarchar(30) 不可 課程上課的地點
選課表
選課表:sc
字段名稱 數據類型 可空 默認值 說明
scid int 不可 主鍵,選課id,無實際意思,每次自增1
stuid int 不可 外鍵,學生id
claid int 不可 外鍵,課程id
grades int 不可 學生成績
五、界面設計
登錄界面:
5.1管理員角色
管理員主界面:
管理員-------添加管理員界面:
管理員——修改管理員界面:
管理員——開設課程界面:
管理員——查詢課程界面:
管理員——錄入成績界面:
管理員——統計成績頁面:
管理員——修改成績界面:
管理員——添加學生信息界面:
管理員——修改學生信息界面:
管理員——修改密碼界面:
5.2學生界面
學生登錄主界面:
學生——選擇課程界面:
學生——查詢課程界面:
學生——顯示課表界面:
學生——我的成績單:
學生——密碼修改界面:
六、關鍵技術的介紹
6.1使用treeview實現點擊不同的選項,在右側面板中顯示不同的界面。
具體代碼如下:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
switch (this.treeView1.SelectedNode.Text)
{
case"錄入成績":
Form2 f = new Form2();
f.TopLevel = false;
f.FormBorderStyle = FormBorderStyle.None;
f.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f);
f.Show();
break;
case"我的成績單":
searchgradeForm f1 = new searchgradeForm();
f1.TopLevel = false;
f1.FormBorderStyle = FormBorderStyle.None;
f1.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f1);
f1.Show();
break;
case"統計成績":
countForm f2 = new countForm();
f2.TopLevel = false;
f2.FormBorderStyle = FormBorderStyle.None;
f2.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f2);
f2.Show();
break;
case"開設課程":
kaisheForm f3 = new kaisheForm();
f3.TopLevel = false;
f3.FormBorderStyle = FormBorderStyle.None;
f3.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f3);
f3.Show();
break;
case"選擇課程":
chooseForm f4 = new chooseForm();
f4.TopLevel = false;
f4.FormBorderStyle = FormBorderStyle.None;
f4.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f4);
f4.Show();
break;
case"查詢課程":
searchclassForm f5 = new searchclassForm();
f5.TopLevel = false;
f5.FormBorderStyle = FormBorderStyle.None;
f5.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f5);
f5.Show();
break;
case"添加管理員信息":
addmanForm f6 = new addmanForm();
f6.TopLevel = false;
f6.FormBorderStyle = FormBorderStyle.None;
f6.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f6);
f6.Show();
break;
case"修改管理員信息":
modifymanForm f7 = new modifymanForm();
f7.TopLevel = false;
f7.FormBorderStyle = FormBorderStyle.None;
f7.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f7);
f7.Show();
break;
case"添加教師信息":
addteacForm f8 = new addteacForm();
f8.TopLevel = false;
f8.FormBorderStyle = FormBorderStyle.None;
f8.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f8);
f8.Show();
break;
case"修改教師信息":
modifyteacForm f9 = new modifyteacForm();
f9.TopLevel = false;
f9.FormBorderStyle = FormBorderStyle.None;
f9.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f9);
f9.Show();
break;
case"添加學生信息":
addstuForm f10 = new addstuForm();
f10.TopLevel = false;
f10.FormBorderStyle = FormBorderStyle.None;
f10.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f10);
f10.Show();
break;
case"修改學生信息":
modifystuForm f11 = new modifystuForm();
f11.TopLevel = false;
f11.FormBorderStyle = FormBorderStyle.None;
f11.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f11);
f11.Show();
break;
case"關于":
aboutForm f12 = new aboutForm();
f12.TopLevel = false;
f12.FormBorderStyle = FormBorderStyle.None;
f12.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f12);
f12.Show();
break;
case "退出系統":
Application.Exit();
break;
case "顯示課表":
showkebiaoForm f13 = new showkebiaoForm();
f13.TopLevel = false;
f13.FormBorderStyle = FormBorderStyle.None;
f13.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f13);
f13.Show();
break;
case "修改密碼":
modifymimaForm f14 = new modifymimaForm();
f14.TopLevel = false;
f14.FormBorderStyle = FormBorderStyle.None;
f14.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f14);
f14.Show();
break;
case "修改成績":
modifygradeFram f15 = new modifygradeFram();
f15.TopLevel = false;
f15.FormBorderStyle = FormBorderStyle.None;
f15.WindowState = FormWindowState.Maximized;
panel2.Controls.Add(f15);
f15.Show();
break;
}
}
6.2在其他的窗口得到在登錄窗口輸入的信息
實現方法:在loginFram中設置兩個方法,在其他類中只需要引用loginFram的這些方法即可。具體實現如下:
public static String getStudent()
{
String stuxuehao = "";
stuxuehao = loginForm.name;
return stuxuehao;
}
public static String getRole()
{
String role1 = "";
role1 = role;
return role1;
}
6.3管理員開設課程時,對于同一時間該教室有課的情況怎么做出異常處理。集體實現如下:
private void button1_Click(object sender, EventArgs e)
{
string teacher = textBoxteacher.Text;
string classes = textBoxclass.Text;
string term = comboBoxterm.SelectedItem.ToString();
string flags = "1";
SqlConnection conn = new SqlConnection(loginForm.connectionString);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
//將開課信息插入到開課表里
//MessageBox.Show("開設課程成功!");
string sql = "";
//得到上課的地點
string didian = comboBoxdidian.SelectedItem.ToString();
//checkedListBoxtime
for (int i = 0; i < checkedListBoxtime.Items.Count; i++)
{
if (checkedListBoxtime.GetItemChecked(i))
{
String time = checkedListBoxtime.GetItemText(checkedListBoxtime.Items[i]);
sql = "select * from sctime where sctime = '" + time + "'and location = '" + didian + "'";
SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
adp.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
flags = "2";
MessageBox.Show("該時間該教室已經有課!");
break;
}
else
{
flags = "1";
break;
}
}
}
if (flags == "1")
{
sql = "insert into class (claname,term,teacher) values ('" + classes + "','" + term + "','" + teacher + "')";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
for (int i = 0; i < checkedListBoxtime.Items.Count; i++)
{
if (checkedListBoxtime.GetItemChecked(i))
{
string time = checkedListBoxtime.GetItemText(checkedListBoxtime.Items[i]);
//將開課表的id得到
sql = "select claid from class where claname = '" + classes + "' and term = '" + term + "' and teacher = '" + teacher + "'";
cmd.CommandText = sql;
String id1 = cmd.ExecuteScalar().ToString();
int id = 0;
int.TryParse(id1, out id);
sql = "insert into sctime values(" + id + ",'" + time + "','" + didian + "')";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
}
MessageBox.Show("開設課程成功!");
}
conn.Close();
}
6.4學生選擇課程時,對選擇一門課程與已選擇的課程出現上課時間沖突的情況的異常處理。集體實現如下:
private void button1_Click(object sender, EventArgs e)
{
string flags = "1";
//得到stuid
string stuxuehao = textBox1.Text;
SqlConnection conn = new SqlConnection(loginForm.connectionString);
conn.Open();
string sql = "select stuid from student where stuxuehao = '" + stuxuehao + "'";
SqlCommand cmd = new SqlCommand(sql, conn);
String id1 = cmd.ExecuteScalar().ToString();
int.TryParse(id1, out stuid);
//得到課程的id
int claid = 0;
int.TryParse(textBoxid.Text, out claid);
//查詢你在該時間是否有課
sql = "select sctime from sctime where claid =" + claid;
SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
adp.Fill(ds);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow dr = ds.Tables[0].Rows[i];
string time = dr[0].ToString();//第一列
sql = "select * from sc,sctime,class where class.claid = sc.claid and class.claid = sctime.claid and sctime = '" + time + "' and sc.stuid =" + stuid;
SqlDataAdapter adp1 = new SqlDataAdapter(sql, conn);
DataSet ds1 = new DataSet();
adp1.Fill(ds1);
if (ds1.Tables[0].Rows.Count > 0)
{
flags = "2";
MessageBox.Show("課程上課時間沖突!");
break;
}
}
if (flags == "1")
{
sql = "insert into sc(claid,stuid) values(" + claid + "," + stuid + ")";
cmd.CommandText = sql;
if (cmd.ExecuteNonQuery() > 0)
{
MessageBox.Show("選課成功!");
}
}
if (listBox1.Items.Count > 0)
{//清空所有項
listBox1.Items.Clear();
}
sql = "select class.claname from sc,class where sc.claid = class.claid and stuid=" + stuid;
SqlDataAdapter adp2 = new SqlDataAdapter(sql, conn);
DataSet ds2 = new DataSet();
adp2.Fill(ds2);
foreach (DataRow row in ds2.Tables[0].Rows)
{
listBox1.Items.Add(row[0].ToString());
}
conn.Close();
}
七、系統測試
7.1怎么提高訪問數據庫的速度
改進方法:引入視圖、觸發(fā)器、函數、存儲過程,優(yōu)化表結構,建立索引。文章來源:http://www.zghlxwxcb.cn/news/detail-727882.html
八、完成情況總結
通過幾周的努力,從前期的需求分析與架構設計到實際的編碼階段,我完成了學生選課及成績管理系統的開發(fā)與設計。已經大致完成了主要的功能,不過還有一些亟待完善的方面,例如對數據的存儲采用加密的措施,UI設計并不是很出色等等,這些問題都需要我再以后的時間里去慢慢彌補,還有剛開始,我對treeview并不熟悉,所以先建立了幾個原型來測試,領會了treeview的使用方法后才切入正題進行開發(fā)。
在這開發(fā)的過程中,我收獲很大,相比前幾次的開發(fā),我真正重視起測試在軟件開發(fā)中的作用,在軟件開發(fā)的后期,我專門建立一個bug列表,將出現的bug詳細記錄在列表中,并在軟件調試的后期對照列表認真改進軟件,考慮以后使用軟件來做相關方面的管理。當然,我也遇到不少代碼編寫的問題,有時要花較長的時間來解決問題,這也是自己平時編寫代碼較少的原因。通過這次軟件的開發(fā),在編寫代碼上有了一定的提高,同時也知道了軟件開發(fā)過程中需要注意的問題。比如,開發(fā)邏輯思維要清晰,不然可能會把問題想的復雜化。平時多和項目成員交流,這樣你才能知道自己的想法有那些出入,利于軟件的開發(fā)。
通過這次實驗,使我對軟件開發(fā)有了更深一步的了解。在軟件開發(fā)中應注意的問題和考慮的問題都能較好的做到。文章來源地址http://www.zghlxwxcb.cn/news/detail-727882.html
九、交流與聯系
q:969060742 文檔、完整代碼
到了這里,關于C#學生選課及成績查詢系統的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!