/* 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.Diagnostics; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace StuMgmLib.MyNameSpace { public class SystemCtrl { #region 流 /// /// 序列化 /// static byte[] Serialize(T c) { MemoryStream ms = new MemoryStream(); BinaryFormatter iFormatter = new BinaryFormatter(); iFormatter.Serialize(ms, c); byte[] buf = ms.GetBuffer(); return buf; } /// /// 反序列化 /// static T Deserialize(byte[] buf) { MemoryStream ms = new MemoryStream(buf); BinaryFormatter iFormatter = new BinaryFormatter(); var obj = (T)iFormatter.Deserialize(ms); return obj; } #endregion /// /// 获取返回数据 /// public static byte[] CreateServerResponse(byte[] clientRequset) { try { var cr = Deserialize(clientRequset); ServerResponse sr = new ServerResponse(null); switch (cr.Func) { case ClientFunc.VerifyLogin: #region 登陆验证 LoginResponse lr = new LoginResponse(); sr = new ServerResponse(lr); UserInfoLogin login = (UserInfoLogin)cr.Object; getPerFromDB(login, out sr.Final, out sr.ErrMessage, out lr.Level); if (sr.Final) lr.Token = addToken(login.Account, lr.Level, ref QT.quickTable); break; #endregion case ClientFunc.GetCourseInfo: #region 获取课程表 sr.Object = getCosInfo(out sr.Final, out sr.ErrMessage); break; #endregion case ClientFunc.GetSelfUserCourseInfo: #region 学员获取个人进度详情 UserCourseInfoReq ucir = (UserCourseInfoReq)cr.Object; UserCourseInfo uc = new UserCourseInfo(); sr = new ServerResponse(uc); vrTokenFrT(ucir.Job_Id, ucir.Token, out sr.Final, out sr.ErrMessage); if (!sr.Final) break; getUsrCosStatus(ucir.Job_Id, out sr.Final, out sr.ErrMessage, out uc.Status, out uc.Details); break; #endregion case ClientFunc.GetSomeoneUserCInfo: #region 教师获取某人进度详情 UserCourseInfoOper uciO = (UserCourseInfoOper)cr.Object; vrTokenFrT(uciO.Job_Id, uciO.Token, out sr.Final, out sr.ErrMessage); if (!sr.Final) break; 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; #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: #region 教师修改课程详情 UserCourseInfoOper tucio = (UserCourseInfoOper)cr.Object; vrTokenFrT(tucio.Job_Id, tucio.Token, out sr.Final, out sr.ErrMessage); if (!sr.Final) break; Lvl lv = getPerFrT(tucio.Job_Id); vrPer(lv, out sr.Final, out sr.ErrMessage); if (!sr.Final) break; tUpUsrCosInfo(tucio.Status, out sr.Final, out sr.ErrMessage); break; #endregion } return Serialize(sr); } catch { return null; // 非客户端连接:用调试助手连接服务器 } } const string conStr = "data source=localhost; initial catalog=xinje; user id=root; pwd=980505;charset = utf8"; #region Token、Permission 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 = "; qStu += o.Account + " and password = '" + o.Password + "'"; MySqlConnection con = new MySqlConnection(conStr); try { con.Open(); MySqlCommand mCmd = new MySqlCommand(qStu, con); MySqlDataReader mReader = mCmd.ExecuteReader(); if (mReader.HasRows) { mReader.Read(); level = (Lvl)mReader.GetInt16("level"); final = true; } else { level = Lvl.NotFound; final = false; } } catch (MySqlException e) { errMessage = e.Message; final = false; Debug.Print(DateTime.Now + " : " + e.Message); } finally { con.Close(); } } static int addToken(short job_id, Lvl level, ref Dictionary myToken) { if (myToken != null) { if (myToken.Count > QT.tokenMaxCount) // 清除缓存 myToken.Clear(); if (myToken.ContainsKey(job_id)) { myToken.Remove(job_id); } } Random r = new Random(); // 伪随机 int token = r.Next(); QTInfo u = new QTInfo(token, level); myToken.Add(job_id, u); return 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 (!(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 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); try { con.Open(); MySqlCommand mCmd = new MySqlCommand(str, con); MySqlDataReader mReader = mCmd.ExecuteReader(); while (mReader.Read()) { CourseInfo ci = new CourseInfo(); ci.Id = mReader.GetInt16("id"); ci.Pid = mReader.GetInt16("pid"); ci.Time = mReader.GetInt16("time"); ci.Name = (mReader.IsDBNull(nameColumn)) ? "无" : mReader.GetString("name"); 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; } finally { con.Close(); } } #endregion #region UserCourseInfo const int statusColumn = 3; const int detailsColumn = 4; /// /// 员工获取课程详情 /// 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; MySqlConnection con = new MySqlConnection(conStr); try { con.Open(); MySqlCommand mCmd = new MySqlCommand(qStu, con); MySqlDataReader mReader = mCmd.ExecuteReader(); mReader.Read(); status = (mReader.IsDBNull(statusColumn)) ? " " : mReader.GetString("status"); details = (mReader.IsDBNull(detailsColumn)) ? " " : mReader.GetString("details"); 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 MySqlE) { errMessage = MySqlE.Message; Debug.Print(DateTime.Now + " : " + MySqlE.Message); return null; } finally { con.Close(); } } #endregion #endregion #region Update #region Student /// /// 学员更改个人课程状态 /// static void sUpUsrCosInfo(short job_id, string sqlStr, out bool final, out string eMessage) { final = false; eMessage = null; string str = "UPDATE usercouse_info " + " set status = '" + sqlStr + "' where job_id = " + job_id; MySqlConnection con = new MySqlConnection(conStr); try { con.Open(); MySqlCommand cmd = new MySqlCommand(str, con); if (cmd.ExecuteNonQuery() > 0) final = true; } catch (MySqlException MySqlE) { eMessage = MySqlE.Message; Debug.Print(DateTime.Now + " : " + MySqlE.Message); } finally { con.Close(); } } #endregion #region Teacher 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 { MySqlCommand cmd = new MySqlCommand(str, conn); if (cmd.ExecuteNonQuery() > 0) final = true; } catch (MySqlException MySqlE) { eMessage = MySqlE.Message; Debug.Print(DateTime.Now + " : " + MySqlE.Message); } finally { conn.Close(); } } #endregion #endregion } }