您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

429 行
14 KiB

  1. /* Describtion : Class for Data Operation
  2. * Company : Wuxi Xinje
  3. * Author : Somuns
  4. * DateTime : 2021/1/28
  5. */
  6. using MySql.Data.MySqlClient;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Diagnostics;
  10. using System.IO;
  11. using System.Runtime.Serialization.Formatters.Binary;
  12. namespace StuMgmLib.MyNameSpace
  13. {
  14. public class SystemCtrl
  15. {
  16. #region 流
  17. /// <summary>
  18. /// 序列化
  19. /// </summary>
  20. static byte[] Serialize<T>(T c)
  21. {
  22. MemoryStream ms = new MemoryStream();
  23. BinaryFormatter iFormatter = new BinaryFormatter();
  24. iFormatter.Serialize(ms, c);
  25. byte[] buf = ms.GetBuffer();
  26. return buf;
  27. }
  28. /// <summary>
  29. /// 反序列化
  30. /// </summary>
  31. static T Deserialize<T>(byte[] buf)
  32. {
  33. MemoryStream ms = new MemoryStream(buf);
  34. BinaryFormatter iFormatter = new BinaryFormatter();
  35. var obj = (T)iFormatter.Deserialize(ms);
  36. return obj;
  37. }
  38. #endregion
  39. /// <summary>
  40. /// 获取返回数据
  41. /// </summary>
  42. public static byte[] CreateServerResponse(byte[] clientRequset)
  43. {
  44. try
  45. {
  46. var cr = Deserialize<ClientRequest>(clientRequset);
  47. ServerResponse sr = new ServerResponse(null);
  48. switch (cr.Func)
  49. {
  50. case ClientFunc.VerifyLogin:
  51. #region 登陆验证
  52. LoginResponse lr = new LoginResponse();
  53. sr = new ServerResponse(lr);
  54. UserInfoLogin login = (UserInfoLogin)cr.Object;
  55. getPerFromDB(login, out sr.Final, out sr.ErrMessage, out lr.Level);
  56. if (sr.Final)
  57. lr.Token = addToken(login.Account, lr.Level, ref QT.quickTable);
  58. break;
  59. #endregion
  60. case ClientFunc.GetCourseInfo:
  61. #region 获取课程表
  62. sr.Object = getCosInfo(out sr.Final, out sr.ErrMessage);
  63. break;
  64. #endregion
  65. case ClientFunc.GetSelfUserCourseInfo:
  66. #region 学员获取个人进度详情
  67. UserCourseInfoReq ucir = (UserCourseInfoReq)cr.Object;
  68. UserCourseInfo uc = new UserCourseInfo();
  69. sr = new ServerResponse(uc);
  70. vrTokenFrT(ucir.Job_Id, ucir.Token, out sr.Final, out sr.ErrMessage);
  71. if (!sr.Final)
  72. break;
  73. getUsrCosStatus(ucir.Job_Id, out sr.Final, out sr.ErrMessage, out uc.Status, out uc.Details);
  74. break;
  75. #endregion
  76. case ClientFunc.GetSomeoneUserCInfo:
  77. #region 教师获取某人进度详情
  78. UserCourseInfoOper uciO = (UserCourseInfoOper)cr.Object;
  79. vrTokenFrT(uciO.Job_Id, uciO.Token, out sr.Final, out sr.ErrMessage);
  80. if (!sr.Final)
  81. break;
  82. Lvl l = getPerFrT(uciO.Job_Id);
  83. vrPer(l, out sr.Final, out sr.ErrMessage);
  84. if (!sr.Final)
  85. break;
  86. sr.Object = getUsrCosStatus(uciO.Status, out sr.Final, out sr.ErrMessage);
  87. break;
  88. #endregion
  89. case ClientFunc.SUpdateCourse:
  90. #region 学生修改课程状态
  91. UserCourseInfoOper suico = (UserCourseInfoOper)cr.Object;
  92. vrTokenFrT(suico.Job_Id, suico.Token, out sr.Final, out sr.ErrMessage);
  93. if (!sr.Final)
  94. break;
  95. sUpUsrCosInfo(suico.Job_Id, suico.Status, out sr.Final, out sr.ErrMessage);
  96. break;
  97. #endregion
  98. case ClientFunc.TUpdateCourse:
  99. #region 教师修改课程详情
  100. UserCourseInfoOper tucio = (UserCourseInfoOper)cr.Object;
  101. vrTokenFrT(tucio.Job_Id, tucio.Token, out sr.Final, out sr.ErrMessage);
  102. if (!sr.Final)
  103. break;
  104. Lvl lv = getPerFrT(tucio.Job_Id);
  105. vrPer(lv, out sr.Final, out sr.ErrMessage);
  106. if (!sr.Final)
  107. break;
  108. tUpUsrCosInfo(tucio.Status, out sr.Final, out sr.ErrMessage);
  109. break;
  110. #endregion
  111. }
  112. return Serialize<ServerResponse>(sr);
  113. }
  114. catch
  115. {
  116. return null; // 非客户端连接:用调试助手连接服务器
  117. }
  118. }
  119. const string conStr = "data source=localhost; initial catalog=xinje; user id=root; pwd=980505;charset = utf8";
  120. #region Token、Permission
  121. static void getPerFromDB(UserInfoLogin o, out bool final, out string errMessage, out Lvl level)
  122. {
  123. final = false;
  124. level = Lvl.Error;
  125. errMessage = null;
  126. string qStu = "select * from user where account = ";
  127. qStu += o.Account + " and password = '" + o.Password + "'";
  128. MySqlConnection con = new MySqlConnection(conStr);
  129. try
  130. {
  131. con.Open();
  132. MySqlCommand mCmd = new MySqlCommand(qStu, con);
  133. MySqlDataReader mReader = mCmd.ExecuteReader();
  134. if (mReader.HasRows)
  135. {
  136. mReader.Read();
  137. level = (Lvl)mReader.GetInt16("level");
  138. final = true;
  139. }
  140. else
  141. {
  142. level = Lvl.NotFound;
  143. final = false;
  144. }
  145. }
  146. catch (MySqlException e)
  147. {
  148. errMessage = e.Message;
  149. final = false;
  150. Debug.Print(DateTime.Now + " : " + e.Message);
  151. }
  152. finally
  153. {
  154. con.Close();
  155. }
  156. }
  157. static int addToken(short job_id, Lvl level, ref Dictionary<short, QTInfo> myToken)
  158. {
  159. if (myToken != null)
  160. {
  161. if (myToken.Count > QT.tokenMaxCount) // 清除缓存
  162. myToken.Clear();
  163. if (myToken.ContainsKey(job_id))
  164. {
  165. myToken.Remove(job_id);
  166. }
  167. }
  168. Random r = new Random(); // 伪随机
  169. int token = r.Next();
  170. QTInfo u = new QTInfo(token, level);
  171. myToken.Add(job_id, u);
  172. return token;
  173. }
  174. static void vrTokenFrT(short job_id, int token, out bool final, out string errMessage)
  175. {
  176. final = false;
  177. errMessage = null;
  178. if (QT.quickTable[job_id].Token != token)
  179. {
  180. errMessage = "Token Err";
  181. return;
  182. }
  183. final = true;
  184. }
  185. static Lvl getPerFrT(short job_id)
  186. {
  187. return QT.quickTable[job_id].Level;
  188. }
  189. static void vrPer(Lvl lv, out bool final, out string errMessage)
  190. {
  191. if (!(lv == Lvl.Teacher || lv == Lvl.Admin))
  192. {
  193. final = false;
  194. errMessage = "Permission denied";
  195. }
  196. final = true;
  197. errMessage = null;
  198. }
  199. #endregion
  200. #region GetInfo
  201. // Common
  202. #region CourseInfo
  203. const int nameColumn = 1;
  204. const int contentColumn = 3;
  205. static List<CourseInfo> getCosInfo(out bool final, out string errMessage)
  206. {
  207. final = false;
  208. errMessage = null;
  209. List<CourseInfo> listCI = new List<CourseInfo>();
  210. string str = "select * from course_info";
  211. MySqlConnection con = new MySqlConnection(conStr);
  212. try
  213. {
  214. con.Open();
  215. MySqlCommand mCmd = new MySqlCommand(str, con);
  216. MySqlDataReader mReader = mCmd.ExecuteReader();
  217. while (mReader.Read())
  218. {
  219. CourseInfo ci = new CourseInfo();
  220. ci.Id = mReader.GetInt16("id");
  221. ci.Pid = mReader.GetInt16("pid");
  222. ci.Time = mReader.GetInt16("time");
  223. ci.Name = (mReader.IsDBNull(nameColumn)) ? "无" : mReader.GetString("name");
  224. ci.Content = (mReader.IsDBNull(contentColumn)) ? "无" : mReader.GetString("content");
  225. listCI.Add(ci);
  226. }
  227. final = true;
  228. return listCI;
  229. }
  230. catch (MySqlException mySqlEx)
  231. {
  232. errMessage = mySqlEx.Message;
  233. Debug.Print(DateTime.Now + " : " + mySqlEx.Message);
  234. return null;
  235. }
  236. finally
  237. {
  238. con.Close();
  239. }
  240. }
  241. #endregion
  242. #region UserCourseInfo
  243. const int statusColumn = 3;
  244. const int detailsColumn = 4;
  245. /// <summary>
  246. /// 员工获取课程详情
  247. /// </summary>
  248. static void getUsrCosStatus(short jobId, out bool final, out string errMessage, out string status, out string details)
  249. {
  250. final = false;
  251. errMessage = null;
  252. status = "";
  253. details = "";
  254. string qStu = "select * from usercouse_info where job_id = " + jobId;
  255. MySqlConnection con = new MySqlConnection(conStr);
  256. try
  257. {
  258. con.Open();
  259. MySqlCommand mCmd = new MySqlCommand(qStu, con);
  260. MySqlDataReader mReader = mCmd.ExecuteReader();
  261. mReader.Read();
  262. status = (mReader.IsDBNull(statusColumn)) ? " " : mReader.GetString("status");
  263. details = (mReader.IsDBNull(detailsColumn)) ? " " : mReader.GetString("details");
  264. final = true;
  265. }
  266. catch (MySqlException MySqlE)
  267. {
  268. errMessage = MySqlE.Message;
  269. Debug.Print(DateTime.Now + " : " + MySqlE.Message);
  270. }
  271. finally
  272. {
  273. con.Close();
  274. }
  275. }
  276. /// <summary>
  277. /// 教师获取课程详情
  278. /// </summary>
  279. static List<UserCourseInfo> getUsrCosStatus(string sqlStr, out bool final, out string errMessage)
  280. {
  281. List<UserCourseInfo> list = new List<UserCourseInfo>();
  282. final = false;
  283. errMessage = null;
  284. string qStu = "select * from usercouse_info where";
  285. qStu += sqlStr;
  286. MySqlConnection con = new MySqlConnection(conStr);
  287. try
  288. {
  289. con.Open();
  290. MySqlCommand mCmd = new MySqlCommand(qStu, con);
  291. MySqlDataReader mReader = mCmd.ExecuteReader();
  292. UserCourseInfo u = new UserCourseInfo();
  293. while (mReader.Read())
  294. {
  295. u.JobId = mReader.GetInt16("job_id");
  296. u.Name = mReader.GetString("name");
  297. u.Status = (mReader.IsDBNull(statusColumn)) ? " " : mReader.GetString("status");
  298. u.Details = (mReader.IsDBNull(detailsColumn)) ? " " : mReader.GetString("details");
  299. list.Add(u);
  300. }
  301. final = true;
  302. return list;
  303. }
  304. catch (MySqlException MySqlE)
  305. {
  306. errMessage = MySqlE.Message;
  307. Debug.Print(DateTime.Now + " : " + MySqlE.Message);
  308. return null;
  309. }
  310. finally
  311. {
  312. con.Close();
  313. }
  314. }
  315. #endregion
  316. #endregion
  317. #region Update
  318. #region Student
  319. /// <summary>
  320. /// 学员更改个人课程状态
  321. /// </summary>
  322. static void sUpUsrCosInfo(short job_id, string sqlStr, out bool final, out string eMessage)
  323. {
  324. final = false;
  325. eMessage = null;
  326. string str = "UPDATE usercouse_info " + " set status = '" + sqlStr + "' where job_id = " + job_id;
  327. MySqlConnection con = new MySqlConnection(conStr);
  328. try
  329. {
  330. con.Open();
  331. MySqlCommand cmd = new MySqlCommand(str, con);
  332. if (cmd.ExecuteNonQuery() > 0)
  333. final = true;
  334. }
  335. catch (MySqlException MySqlE)
  336. {
  337. eMessage = MySqlE.Message;
  338. Debug.Print(DateTime.Now + " : " + MySqlE.Message);
  339. }
  340. finally
  341. {
  342. con.Close();
  343. }
  344. }
  345. #endregion
  346. #region Teacher
  347. static void tUpUsrCosInfo(string sqlStr, out bool final, out string eMessage)
  348. {
  349. final = false;
  350. eMessage = null;
  351. string str = "select * from usercourse_info where " + sqlStr;
  352. MySqlConnection conn = new MySqlConnection();
  353. try
  354. {
  355. MySqlCommand cmd = new MySqlCommand(str, conn);
  356. if (cmd.ExecuteNonQuery() > 0)
  357. final = true;
  358. }
  359. catch (MySqlException MySqlE)
  360. {
  361. eMessage = MySqlE.Message;
  362. Debug.Print(DateTime.Now + " : " + MySqlE.Message);
  363. }
  364. finally
  365. {
  366. conn.Close();
  367. }
  368. }
  369. #endregion
  370. #endregion
  371. }
  372. }