diff --git a/StuMgmServer/StuMgmLib/MyNameSpace/CommonData.cs b/StuMgmServer/StuMgmLib/MyNameSpace/CommonData.cs index 9267894..b151974 100644 --- a/StuMgmServer/StuMgmLib/MyNameSpace/CommonData.cs +++ b/StuMgmServer/StuMgmLib/MyNameSpace/CommonData.cs @@ -5,25 +5,40 @@ */ using System; using System.Collections.Generic; -using System.Data; namespace StuMgmLib.MyNameSpace { - public class Info + #region QuickTable + + internal class QTInfo + { + public int Token; + public Lvl Level; + public QTInfo(int token, Lvl lv) + { + Token = token; + Level = lv; + } + } + public class QT // quickTable { internal const Int16 tokenMaxCount = 32767; - internal static Dictionary myToken = new Dictionary(); + internal static Dictionary quickTable = new Dictionary(); } + #endregion + #region ClientClass public enum ClientFunc { VerifyLogin = 1, GetCourseInfo = 2, - GetUserCourseInfo = 3, + GetSelfUserCourseInfo = 3, + GetSomeoneUserCInfo = 6, SUpdateCourse = 4, TUpdateCourse = 5, + } public enum Lvl { @@ -65,19 +80,11 @@ namespace StuMgmLib.MyNameSpace } [Serializable] - public class UserCourseInfoOper // T represents teacher, S ->student + public class UserCourseInfoOper { public short Job_Id; public int Token; - public string sqlStr; - } - - - [Serializable] - public enum CourseStatusEnum - { - //lll, - //...// + public string Status; } @@ -87,6 +94,8 @@ namespace StuMgmLib.MyNameSpace [Serializable] public class ServerResponse { + public bool Final; + public string ErrMessage; public object Object; public ServerResponse(object obj) { @@ -100,7 +109,6 @@ namespace StuMgmLib.MyNameSpace { public int Token; public Lvl Level; - public bool Final; } [Serializable] @@ -123,14 +131,8 @@ namespace StuMgmLib.MyNameSpace public string Details;//信息描述 } - [Serializable] - public class UpdateRp // 数据库操作反馈信息 - { - public bool Final; - public string ErrMessge; - #endregion - } + #endregion } diff --git a/StuMgmServer/StuMgmLib/MyNameSpace/SystemCtrl.cs b/StuMgmServer/StuMgmLib/MyNameSpace/SystemCtrl.cs index 56cdf13..ae679ae 100644 --- a/StuMgmServer/StuMgmLib/MyNameSpace/SystemCtrl.cs +++ b/StuMgmServer/StuMgmLib/MyNameSpace/SystemCtrl.cs @@ -1,17 +1,18 @@ -using MySql.Data.MySqlClient; +/* Describtion : Class for Data Operation + * Company : Wuxi Xinje + * Author : Somuns + * DateTime : 2021/1/28 + */ +using MySql.Data.MySqlClient; using System; using System.Collections.Generic; -using System.Data; using System.Diagnostics; using System.IO; -using System.Reflection; -using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; -using System.Text; namespace StuMgmLib.MyNameSpace { - class SystemCtrl + public class SystemCtrl { #region 流 /// @@ -38,7 +39,6 @@ namespace StuMgmLib.MyNameSpace } #endregion - /// /// 获取返回数据 /// @@ -48,83 +48,93 @@ namespace StuMgmLib.MyNameSpace { var cr = Deserialize(clientRequset); - ServerResponse sr = null; + ServerResponse sr = new ServerResponse(null); switch (cr.Func) { case ClientFunc.VerifyLogin: - UserInfoLogin uil = (UserInfoLogin)cr.Object; + #region 登陆验证 LoginResponse lr = new LoginResponse(); + sr = new ServerResponse(lr); + UserInfoLogin login = (UserInfoLogin)cr.Object; - if (getPermission(uil, out lr.Level)) - lr.Token = addToken(uil.Account, ref Info.myToken); + getPerFromDB(login, out sr.Final, out sr.ErrMessage, out lr.Level); + if (sr.Final) + lr.Token = addToken(login.Account, lr.Level, ref QT.quickTable); - sr = new ServerResponse(lr); break; - + #endregion case ClientFunc.GetCourseInfo: - - sr = new ServerResponse(getCourseInfo()); - Debug.Print(sr.Object.GetType().ToString()); + #region 获取课程表 + sr.Object = getCosInfo(out sr.Final, out sr.ErrMessage); break; - - case ClientFunc.GetUserCourseInfo: // 获取学员个人课程信息,详情 + #endregion + case ClientFunc.GetSelfUserCourseInfo: + #region 学员获取个人进度详情 UserCourseInfoReq ucir = (UserCourseInfoReq)cr.Object; UserCourseInfo uc = new UserCourseInfo(); + sr = new ServerResponse(uc); - if (!verifyToken(ucir.Job_Id, ucir.Token)) + vrTokenFrT(ucir.Job_Id, ucir.Token, out sr.Final, out sr.ErrMessage); + if (!sr.Final) break; - if (getUserCourseStatus(ucir.Job_Id, out uc.Status, out uc.Details)) - sr = new ServerResponse(uc); + getUsrCosStatus(ucir.Job_Id, out sr.Final, out sr.ErrMessage, out uc.Status, out uc.Details); break; - case ClientFunc.SUpdateCourse: // 学生修改课程信息,仅有权修改自己的个别类型状态 - /* Todo - verify (jobid token) - update */ - UserCourseInfoOper suico = (UserCourseInfoOper)cr.Object; - UpdateRp urs = new UpdateRp(); + #endregion + case ClientFunc.GetSomeoneUserCInfo: + #region 教师获取某人进度详情 + + UserCourseInfoOper uciO = (UserCourseInfoOper)cr.Object; - if (!verifyToken(suico.Job_Id, suico.Token)) + vrTokenFrT(uciO.Job_Id, uciO.Token, out sr.Final, out sr.ErrMessage); + if (!sr.Final) break; - sUpdateInfo(suico.Job_Id, suico.sqlStr, out urs.Final, out urs.ErrMessge); + Lvl l = getPerFrT(uciO.Job_Id); + vrPer(l, out sr.Final, out sr.ErrMessage); + if (!sr.Final) + break; + + sr.Object = getUsrCosStatus(uciO.Status, out sr.Final, out sr.ErrMessage); + break; - sr = new ServerResponse(urs); + #endregion + case ClientFunc.SUpdateCourse: + #region 学生修改课程状态 + UserCourseInfoOper suico = (UserCourseInfoOper)cr.Object; + + vrTokenFrT(suico.Job_Id, suico.Token, out sr.Final, out sr.ErrMessage); + if (!sr.Final) + break; + + sUpUsrCosInfo(suico.Job_Id, suico.Status, out sr.Final, out sr.ErrMessage); break; + + #endregion case ClientFunc.TUpdateCourse: - /*Todo - 教师修改课程信息,有权更改学生课程状态 - verify (jobid,token) - verify(permission) - update*/ - UserCourseInfoOper tucio = (UserCourseInfoOper)cr.Object; - UpdateRp urt = new UpdateRp(); + #region 教师修改课程详情 - if (!verifyToken(tucio.Job_Id, tucio.Token)) - break; + UserCourseInfoOper tucio = (UserCourseInfoOper)cr.Object; - Lvl l = Lvl.Error; - if (!getPermission(tucio.Job_Id, out l)) + vrTokenFrT(tucio.Job_Id, tucio.Token, out sr.Final, out sr.ErrMessage); + if (!sr.Final) break; - if (!(l == Lvl.Teacher || l == Lvl.Teacher)) - { - urt.Final = false; - urt.ErrMessge = "permission err"; + Lvl lv = getPerFrT(tucio.Job_Id); + vrPer(lv, out sr.Final, out sr.ErrMessage); + if (!sr.Final) break; - } - tUpdateInfo(tucio.sqlStr, out urt.Final, out urt.ErrMessge); - sr = new ServerResponse(urt); + tUpUsrCosInfo(tucio.Status, out sr.Final, out sr.ErrMessage); break; + #endregion } - if (null == sr) - return null; + return Serialize(sr); } catch @@ -135,24 +145,16 @@ namespace StuMgmLib.MyNameSpace const string conStr = "data source=localhost; initial catalog=xinje; user id=root; pwd=980505;charset = utf8"; - #region Verify + #region Token、Permission - static bool getPermission(object o, out Lvl level) + static void getPerFromDB(UserInfoLogin o, out bool final, out string errMessage, out Lvl level) { + final = false; level = Lvl.Error; + errMessage = null; string qStu = "select * from user where account = "; - - if (o is UserInfoLogin) - { - UserInfoLogin uil = (UserInfoLogin)o; - qStu += uil.Account + " and password = '" + uil.Password + "'"; - } // 首次登陆验证 - else if (o is UserCourseInfoOper) - { - UserCourseInfoOper ucio = (UserCourseInfoOper)o; - qStu += ucio.Job_Id + ucio.sqlStr; - } // 数据库操作验证权限 + qStu += o.Account + " and password = '" + o.Password + "'"; MySqlConnection con = new MySqlConnection(conStr); try @@ -164,17 +166,19 @@ namespace StuMgmLib.MyNameSpace { mReader.Read(); level = (Lvl)mReader.GetInt16("level"); - return true; + final = true; } else { level = Lvl.NotFound; - return false; + final = false; } } - catch (MySqlException) + catch (MySqlException e) { - return false; + errMessage = e.Message; + final = false; + Debug.Print(DateTime.Now + " : " + e.Message); } finally { @@ -182,11 +186,11 @@ namespace StuMgmLib.MyNameSpace } } - static int addToken(short job_id, ref Dictionary myToken) + static int addToken(short job_id, Lvl level, ref Dictionary myToken) { if (myToken != null) { - if (myToken.Count > Info.tokenMaxCount) // 清除缓存 + if (myToken.Count > QT.tokenMaxCount) // 清除缓存 myToken.Clear(); if (myToken.ContainsKey(job_id)) { @@ -195,24 +199,54 @@ namespace StuMgmLib.MyNameSpace } Random r = new Random(); // 伪随机 int token = r.Next(); - myToken.Add(job_id, token); + + QTInfo u = new QTInfo(token, level); + + myToken.Add(job_id, u); return token; } - static bool verifyToken(short job_id, int token) + static void vrTokenFrT(short job_id, int token, out bool final, out string errMessage) + { + final = false; + errMessage = null; + if (QT.quickTable[job_id].Token != token) + { + errMessage = "Token Err"; + return; + } + final = true; + } + + static Lvl getPerFrT(short job_id) + { + return QT.quickTable[job_id].Level; + } + + static void vrPer(Lvl lv, out bool final, out string errMessage) { - if (Info.myToken[job_id] == token) - return true; - return false; + if (!(lv == Lvl.Teacher || lv == Lvl.Admin)) + { + final = false; + errMessage = "Permission denied"; + } + final = true; + errMessage = null; } #endregion + #region GetInfo + + // Common #region CourseInfo const int nameColumn = 1; const int contentColumn = 3; - static List getCourseInfo() + static List getCosInfo(out bool final, out string errMessage) { + final = false; + errMessage = null; + List listCI = new List(); string str = "select * from course_info"; MySqlConnection con = new MySqlConnection(conStr); @@ -231,10 +265,12 @@ namespace StuMgmLib.MyNameSpace ci.Content = (mReader.IsDBNull(contentColumn)) ? "无" : mReader.GetString("content"); listCI.Add(ci); } + final = true; return listCI; } catch (MySqlException mySqlEx) { + errMessage = mySqlEx.Message; Debug.Print(DateTime.Now + " : " + mySqlEx.Message); return null; } @@ -248,12 +284,13 @@ namespace StuMgmLib.MyNameSpace #region UserCourseInfo const int statusColumn = 3; const int detailsColumn = 4; - /// - /// 员工获取课程信息 + /// 员工获取课程详情 /// - static bool getUserCourseStatus(short jobId, out string status, out string details) + static void getUsrCosStatus(short jobId, out bool final, out string errMessage, out string status, out string details) { + final = false; + errMessage = null; status = ""; details = ""; string qStu = "select * from usercouse_info where job_id = " + jobId; @@ -266,17 +303,59 @@ namespace StuMgmLib.MyNameSpace mReader.Read(); status = (mReader.IsDBNull(statusColumn)) ? " " : mReader.GetString("status"); details = (mReader.IsDBNull(detailsColumn)) ? " " : mReader.GetString("details"); - return true; + final = true; + } + catch (MySqlException MySqlE) + { + errMessage = MySqlE.Message; + Debug.Print(DateTime.Now + " : " + MySqlE.Message); + } + finally + { + con.Close(); + } + } + /// + /// 教师获取课程详情 + /// + static List getUsrCosStatus(string sqlStr, out bool final, out string errMessage) + { + List list = new List(); + final = false; + errMessage = null; + + string qStu = "select * from usercouse_info where"; + qStu += sqlStr; + MySqlConnection con = new MySqlConnection(conStr); + try + { + con.Open(); + MySqlCommand mCmd = new MySqlCommand(qStu, con); + MySqlDataReader mReader = mCmd.ExecuteReader(); + UserCourseInfo u = new UserCourseInfo(); + while (mReader.Read()) + { + u.JobId = mReader.GetInt16("job_id"); + u.Name = mReader.GetString("name"); + u.Status = (mReader.IsDBNull(statusColumn)) ? " " : mReader.GetString("status"); + u.Details = (mReader.IsDBNull(detailsColumn)) ? " " : mReader.GetString("details"); + list.Add(u); + } + final = true; + return list; } - catch (MySqlException) + catch (MySqlException MySqlE) { - return false; + errMessage = MySqlE.Message; + Debug.Print(DateTime.Now + " : " + MySqlE.Message); + return null; } finally { con.Close(); } } + #endregion #endregion @@ -287,26 +366,27 @@ namespace StuMgmLib.MyNameSpace /// /// 学员更改个人课程状态 /// - static void sUpdateInfo(short job_id, string sqlStr, out bool final, out string eMessage) + static void sUpUsrCosInfo(short job_id, string sqlStr, out bool final, out string eMessage) { final = false; eMessage = null; - string str = "select * from usercourse_info where account = " + job_id + sqlStr; - MySqlConnection conn = new MySqlConnection(); + string str = "UPDATE usercouse_info " + " set status = '" + sqlStr + "' where job_id = " + job_id; + MySqlConnection con = new MySqlConnection(conStr); try { - MySqlCommand cmd = new MySqlCommand(str, conn); + con.Open(); + MySqlCommand cmd = new MySqlCommand(str, con); if (cmd.ExecuteNonQuery() > 0) final = true; } - catch (MySqlException e) + catch (MySqlException MySqlE) { - eMessage = e.Message; - Debug.Print(e.Message); // 可以去掉 + eMessage = MySqlE.Message; + Debug.Print(DateTime.Now + " : " + MySqlE.Message); } finally { - conn.Close(); + con.Close(); } } @@ -314,10 +394,11 @@ namespace StuMgmLib.MyNameSpace #region Teacher - static void tUpdateInfo(string sqlStr, out bool final, out string eMessage) + static void tUpUsrCosInfo(string sqlStr, out bool final, out string eMessage) { final = false; eMessage = null; + string str = "select * from usercourse_info where " + sqlStr; MySqlConnection conn = new MySqlConnection(); try @@ -326,10 +407,10 @@ namespace StuMgmLib.MyNameSpace if (cmd.ExecuteNonQuery() > 0) final = true; } - catch (MySqlException e) + catch (MySqlException MySqlE) { - eMessage = e.Message; - Debug.Print(e.Message); // 可以去掉 + eMessage = MySqlE.Message; + Debug.Print(DateTime.Now + " : " + MySqlE.Message); } finally { @@ -343,9 +424,5 @@ namespace StuMgmLib.MyNameSpace #endregion - - } - - } diff --git a/StuMgmServer/StuMgmLib/MyNameSpace/TcpConn.cs b/StuMgmServer/StuMgmLib/MyNameSpace/TcpConn.cs index 2f77c11..705bbe6 100644 --- a/StuMgmServer/StuMgmLib/MyNameSpace/TcpConn.cs +++ b/StuMgmServer/StuMgmLib/MyNameSpace/TcpConn.cs @@ -11,13 +11,13 @@ using System.Windows.Forms; namespace StuMgmLib.MyNameSpace { - // 还有一种验证连接方式: Token public class TcpConn { public EndPoint Ep; - private IPEndPoint ipp = null; - private Socket socket = null; - private Socket socketClient = null; + public Socket socketClient; + + private IPEndPoint ipp; + private Socket socket; private bool my_SocketExist = false; /// @@ -43,7 +43,9 @@ namespace StuMgmLib.MyNameSpace cb.Items.Add("127.0.0.1"); } - #region 开启服务器 + /// + /// 开服务器 + /// public void OpenServer(string ipAddr, int port) { ipp = new IPEndPoint(IPAddress.Parse(ipAddr), port); @@ -52,20 +54,19 @@ namespace StuMgmLib.MyNameSpace socket.Listen(0); SocketExist = true; } - #endregion - #region 关闭服务器 + /// + /// 关服务器 + /// public void CloseServer() { + SocketExist = false; if (socketClient != null) socketClient.Close(); if (socket != null) socket.Close(); - SocketExist = false; } - #endregion - #region 接收客户端连接 /// /// 接收客户端连接 /// @@ -78,43 +79,37 @@ namespace StuMgmLib.MyNameSpace } catch (SocketException se) { - Debug.Print(se.Message); + Debug.Print(DateTime.Now + " : " + se.Message); } } - #endregion - const int recvTimeOut = -1; // 设置接收超时时间 + private int recvTimeOut = 2000; + public int RecvTimeOut // 设置接收超时时间 + { + get { return recvTimeOut; } + set { recvTimeOut = value; } + } const int recvLength = 65535; - #region 接收数据 /// /// 接收数据 /// - public void AcpMsg() + public byte[] AcceptMsg() { - byte[] clientSend = new byte[recvLength]; // 定义接收数组 + byte[] clientSend = new byte[recvLength]; try { - - socketClient.ReceiveTimeout = recvTimeOut; + socketClient.ReceiveTimeout = RecvTimeOut; socketClient.Receive(clientSend); - - byte[] serverSend = SystemCtrl.CreateServerResponse(clientSend); - - if (serverSend != null) - socketClient.Send(serverSend); - - } - catch (SocketException se) // 客户端断开连接 - { - Debug.Print(se.Message); + return clientSend; } - finally + catch (Exception e) // 客户端断开连接 { + Debug.Print(DateTime.Now + " : " + e.Message); if (socketClient != null) socketClient.Close(); + return null; } } - #endregion } } diff --git a/StuMgmServer/StuMgmServer/Program.cs b/StuMgmServer/StuMgmServer/Program.cs index e30760c..53f9ffb 100644 --- a/StuMgmServer/StuMgmServer/Program.cs +++ b/StuMgmServer/StuMgmServer/Program.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Windows.Forms; namespace StuMgmServer diff --git a/StuMgmServer/StuMgmServer/Server.cs b/StuMgmServer/StuMgmServer/Server.cs index 7048cde..be50de7 100644 --- a/StuMgmServer/StuMgmServer/Server.cs +++ b/StuMgmServer/StuMgmServer/Server.cs @@ -2,6 +2,7 @@ using System.Threading; using System.Windows.Forms; using StuMgmLib.MyNameSpace; +using System.Diagnostics; namespace StuMgmServer { @@ -19,9 +20,8 @@ namespace StuMgmServer { tcpConn.GetIPAddress(cbxIPAddr); } - /// - /// 委托:更新界面方法 - /// + + // 委托:更新界面 private void setText(string text) { if (rtxHistory.InvokeRequired) @@ -35,9 +35,7 @@ namespace StuMgmServer } } - /// - /// btn开关点击事件:开启、关闭服务器 - /// + // 开启、关闭服务器 private void btnSerSwitch_Click(object sender, EventArgs e) { bool sFlag = tcpConn.SocketExist; @@ -63,21 +61,28 @@ namespace StuMgmServer } } - /// - /// 线程:接收客户端连接,接收数据,数据处理;更新历史界面 - /// + // 线程:接收客户端连接,接收数据,数据处理;更新历史界面 private void updateHistory() { while (tcpConn.SocketExist) { - tcpConn.AcceptConn(); - setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 建立连接 \n"); - tcpConn.AcpMsg(); - setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 断开连接 \n"); + try + { + tcpConn.AcceptConn(); + setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 建立连接 \n"); + byte[] serverSend = SystemCtrl.CreateServerResponse(tcpConn.AcceptMsg()); + if (serverSend != null) + tcpConn.socketClient.Send(serverSend); + tcpConn.socketClient.Close(); + setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 断开连接 \n"); + } + catch (Exception e) + { + Debug.Print(DateTime.Now + " : " + e.Message); + } } } - private void Server_Load(object sender, EventArgs e) { tcpConn.GetIPAddress(cbxIPAddr); @@ -85,15 +90,15 @@ namespace StuMgmServer private void Server_FormClosing(object sender, FormClosingEventArgs e) { - //DialogResult dr = MessageBox.Show("确认退出程序?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); - //if (dr != DialogResult.Yes) - System.Environment.Exit(0); - + DialogResult dr = MessageBox.Show("确认退出程序?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (dr != DialogResult.Yes) + e.Cancel = true; + else + { + if (tUpdateUi != null) + tUpdateUi.Abort(); + } } - - - - } }