You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
6.9 KiB

  1. using MySql.Data.MySqlClient;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Reflection;
  8. using System.Runtime.Serialization;
  9. using System.Runtime.Serialization.Formatters.Binary;
  10. using System.Text;
  11. namespace StuMgmLib.MyNameSpace
  12. {
  13. class SystemCtrl
  14. {
  15. /// <summary>
  16. /// 序列化
  17. /// </summary>
  18. static byte[] Serialize<T>(T c)
  19. {
  20. MemoryStream ms = new MemoryStream();
  21. BinaryFormatter iFormatter = new BinaryFormatter();
  22. iFormatter.Serialize(ms, c);
  23. byte[] buf = ms.GetBuffer();
  24. return buf;
  25. }
  26. /// <summary>
  27. /// 反序列化
  28. /// </summary>
  29. static T Deserialize<T>(byte[] buf)
  30. {
  31. MemoryStream ms = new MemoryStream(buf);
  32. BinaryFormatter iFormatter = new BinaryFormatter();
  33. var obj = (T)iFormatter.Deserialize(ms);
  34. return obj;
  35. }
  36. /// <summary>
  37. /// 获取返回数据
  38. /// </summary>
  39. public static byte[] CreateServerResponse(byte[] clientRequset)
  40. {
  41. try
  42. {
  43. var cs = Deserialize<ClientRequest>(clientRequset);
  44. ServerResponse sr = new ServerResponse();
  45. switch (cs.Func)
  46. {
  47. case ClientFunc.VerifyLogin:
  48. UserInfo ui = (UserInfo)cs.Object;
  49. if (verifyLogin(ui, out sr.Lev))
  50. sr.Token = addToken(ui.Account, ref Info.myToken);
  51. break;
  52. case ClientFunc.GetCourseInfo:
  53. sr.Object = getCourseInfo();
  54. Debug.Print(sr.Object.GetType().ToString());
  55. break;
  56. case ClientFunc.GetUserCourseInfo:
  57. short job_id;
  58. UserCourseInfo uc = new UserCourseInfo();
  59. if (verifyToken((Dictionary<short, int>)cs.Object, out job_id))
  60. if (getUserCourseStatus(job_id, out uc.Status, out uc.Details))
  61. sr.Object = uc;
  62. break;
  63. }
  64. return Serialize<ServerResponse>(sr);
  65. }
  66. catch
  67. {
  68. return null;
  69. }
  70. }
  71. const string conStr = "data source=localhost; initial catalog=xinje; user id=root; pwd=980505;charset = utf8";
  72. static bool verifyLogin(UserInfo userInfo, out LvErr level)
  73. {
  74. level = LvErr.Error;
  75. string qStu = "select * from user where account = " + userInfo.Account + " and password = '" + userInfo.Password + "'";
  76. MySqlConnection con = new MySqlConnection(conStr);
  77. try
  78. {
  79. con.Open();
  80. MySqlCommand mCmd = new MySqlCommand(qStu, con);
  81. MySqlDataReader mReader = mCmd.ExecuteReader();
  82. if (mReader.HasRows)
  83. {
  84. mReader.Read();
  85. level = (LvErr)mReader.GetInt16("level");
  86. return true;
  87. }
  88. else
  89. {
  90. level = LvErr.NotFound;
  91. return false;
  92. }
  93. }
  94. catch (MySqlException)
  95. {
  96. level = LvErr.Error;
  97. return false;
  98. }
  99. finally
  100. {
  101. con.Close();
  102. }
  103. }
  104. static int addToken(short job_id, ref Dictionary<short, int> myToken)
  105. {
  106. if (myToken != null)
  107. {
  108. if (myToken.Count > Info.tokenMaxCount) // 清除缓存
  109. myToken.Clear();
  110. if (myToken.ContainsKey(job_id))
  111. {
  112. myToken.Remove(job_id);
  113. }
  114. }
  115. Random r = new Random(); // 伪随机
  116. int token = r.Next();
  117. myToken.Add(job_id, token);
  118. return token;
  119. }
  120. static bool verifyToken(Dictionary<short, int> dic, out short account)
  121. {
  122. account = 0;
  123. if (dic.Count != 1)
  124. return false;
  125. foreach (var item in dic)
  126. {
  127. if (!Info.myToken.ContainsKey(item.Key))
  128. return false;
  129. if (Info.myToken[item.Key] == item.Value)
  130. {
  131. account = item.Key;
  132. return true;
  133. }
  134. }
  135. return false;
  136. }
  137. const int nameColumn = 1;
  138. const int contentColumn = 3;
  139. static List<CourseInfo> getCourseInfo()
  140. {
  141. List<CourseInfo> listCI = new List<CourseInfo>();
  142. string str = "select * from course_info";
  143. MySqlConnection con = new MySqlConnection(conStr);
  144. try
  145. {
  146. con.Open();
  147. MySqlCommand mCmd = new MySqlCommand(str, con);
  148. MySqlDataReader mReader = mCmd.ExecuteReader();
  149. while (mReader.Read())
  150. {
  151. CourseInfo ci = new CourseInfo();
  152. ci.Id = mReader.GetInt16("id");
  153. ci.Pid = mReader.GetInt16("pid");
  154. ci.Time = mReader.GetInt16("time");
  155. ci.Name = (mReader.IsDBNull(nameColumn)) ? "无" : mReader.GetString("name");
  156. ci.Content = (mReader.IsDBNull(contentColumn)) ? "无" : mReader.GetString("content");
  157. listCI.Add(ci);
  158. }
  159. return listCI;
  160. }
  161. catch (MySqlException mySqlEx)
  162. {
  163. Debug.Print(DateTime.Now + " : " + mySqlEx.Message);
  164. return null;
  165. }
  166. finally
  167. {
  168. con.Close();
  169. }
  170. }
  171. const int statusColumn = 3;
  172. const int detailsColumn = 4;
  173. static bool getUserCourseStatus(short jobId, out string status, out string details)
  174. {
  175. status = "";
  176. details = "";
  177. string qStu = "select * from usercouse_info where job_id = " + jobId;
  178. MySqlConnection con = new MySqlConnection(conStr);
  179. try
  180. {
  181. con.Open();
  182. MySqlCommand mCmd = new MySqlCommand(qStu, con);
  183. MySqlDataReader mReader = mCmd.ExecuteReader();
  184. mReader.Read();
  185. status = (mReader.IsDBNull(statusColumn)) ? " " : mReader.GetString("status");
  186. details = (mReader.IsDBNull(detailsColumn)) ? " " : mReader.GetString("details");
  187. return true;
  188. }
  189. catch (MySqlException)
  190. {
  191. return false;
  192. }
  193. finally
  194. {
  195. con.Close();
  196. }
  197. }
  198. }
  199. }