Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

352 rader
11 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. #region 流
  16. /// <summary>
  17. /// 序列化
  18. /// </summary>
  19. static byte[] Serialize<T>(T c)
  20. {
  21. MemoryStream ms = new MemoryStream();
  22. BinaryFormatter iFormatter = new BinaryFormatter();
  23. iFormatter.Serialize(ms, c);
  24. byte[] buf = ms.GetBuffer();
  25. return buf;
  26. }
  27. /// <summary>
  28. /// 反序列化
  29. /// </summary>
  30. static T Deserialize<T>(byte[] buf)
  31. {
  32. MemoryStream ms = new MemoryStream(buf);
  33. BinaryFormatter iFormatter = new BinaryFormatter();
  34. var obj = (T)iFormatter.Deserialize(ms);
  35. return obj;
  36. }
  37. #endregion
  38. /// <summary>
  39. /// 获取返回数据
  40. /// </summary>
  41. public static byte[] CreateServerResponse(byte[] clientRequset)
  42. {
  43. try
  44. {
  45. var cr = Deserialize<ClientRequest>(clientRequset);
  46. ServerResponse sr = null;
  47. switch (cr.Func)
  48. {
  49. case ClientFunc.VerifyLogin:
  50. UserInfoLogin uil = (UserInfoLogin)cr.Object;
  51. LoginResponse lr = new LoginResponse();
  52. if (getPermission(uil, out lr.Level))
  53. lr.Token = addToken(uil.Account, ref Info.myToken);
  54. sr = new ServerResponse(lr);
  55. break;
  56. case ClientFunc.GetCourseInfo:
  57. sr = new ServerResponse(getCourseInfo());
  58. Debug.Print(sr.Object.GetType().ToString());
  59. break;
  60. case ClientFunc.GetUserCourseInfo: // 获取学员个人课程信息,详情
  61. UserCourseInfoReq ucir = (UserCourseInfoReq)cr.Object;
  62. UserCourseInfo uc = new UserCourseInfo();
  63. if (!verifyToken(ucir.Job_Id, ucir.Token))
  64. break;
  65. if (getUserCourseStatus(ucir.Job_Id, out uc.Status, out uc.Details))
  66. sr = new ServerResponse(uc);
  67. break;
  68. case ClientFunc.SUpdateCourse: // 学生修改课程信息,仅有权修改自己的个别类型状态
  69. /* Todo
  70. verify (jobid token)
  71. update */
  72. UserCourseInfoOper suico = (UserCourseInfoOper)cr.Object;
  73. UpdateRp urs = new UpdateRp();
  74. if (!verifyToken(suico.Job_Id, suico.Token))
  75. break;
  76. sUpdateInfo(suico.Job_Id, suico.sqlStr, out urs.Final, out urs.ErrMessge);
  77. sr = new ServerResponse(urs);
  78. break;
  79. case ClientFunc.TUpdateCourse:
  80. /*Todo
  81. 教师修改课程信息,有权更改学生课程状态
  82. verify (jobid,token)
  83. verify(permission)
  84. update*/
  85. UserCourseInfoOper tucio = (UserCourseInfoOper)cr.Object;
  86. UpdateRp urt = new UpdateRp();
  87. if (!verifyToken(tucio.Job_Id, tucio.Token))
  88. break;
  89. Lvl l = Lvl.Error;
  90. if (!getPermission(tucio.Job_Id, out l))
  91. break;
  92. if (!(l == Lvl.Teacher || l == Lvl.Teacher))
  93. {
  94. urt.Final = false;
  95. urt.ErrMessge = "permission err";
  96. break;
  97. }
  98. tUpdateInfo(tucio.sqlStr, out urt.Final, out urt.ErrMessge);
  99. sr = new ServerResponse(urt);
  100. break;
  101. }
  102. if (null == sr)
  103. return null;
  104. return Serialize<ServerResponse>(sr);
  105. }
  106. catch
  107. {
  108. return null; // 非客户端连接:用调试助手连接服务器
  109. }
  110. }
  111. const string conStr = "data source=localhost; initial catalog=xinje; user id=root; pwd=980505;charset = utf8";
  112. #region Verify
  113. static bool getPermission(object o, out Lvl level)
  114. {
  115. level = Lvl.Error;
  116. string qStu = "select * from user where account = ";
  117. if (o is UserInfoLogin)
  118. {
  119. UserInfoLogin uil = (UserInfoLogin)o;
  120. qStu += uil.Account + " and password = '" + uil.Password + "'";
  121. } // 首次登陆验证
  122. else if (o is UserCourseInfoOper)
  123. {
  124. UserCourseInfoOper ucio = (UserCourseInfoOper)o;
  125. qStu += ucio.Job_Id + ucio.sqlStr;
  126. } // 数据库操作验证权限
  127. MySqlConnection con = new MySqlConnection(conStr);
  128. try
  129. {
  130. con.Open();
  131. MySqlCommand mCmd = new MySqlCommand(qStu, con);
  132. MySqlDataReader mReader = mCmd.ExecuteReader();
  133. if (mReader.HasRows)
  134. {
  135. mReader.Read();
  136. level = (Lvl)mReader.GetInt16("level");
  137. return true;
  138. }
  139. else
  140. {
  141. level = Lvl.NotFound;
  142. return false;
  143. }
  144. }
  145. catch (MySqlException)
  146. {
  147. return false;
  148. }
  149. finally
  150. {
  151. con.Close();
  152. }
  153. }
  154. static int addToken(short job_id, ref Dictionary<short, int> myToken)
  155. {
  156. if (myToken != null)
  157. {
  158. if (myToken.Count > Info.tokenMaxCount) // 清除缓存
  159. myToken.Clear();
  160. if (myToken.ContainsKey(job_id))
  161. {
  162. myToken.Remove(job_id);
  163. }
  164. }
  165. Random r = new Random(); // 伪随机
  166. int token = r.Next();
  167. myToken.Add(job_id, token);
  168. return token;
  169. }
  170. static bool verifyToken(short job_id, int token)
  171. {
  172. if (Info.myToken[job_id] == token)
  173. return true;
  174. return false;
  175. }
  176. #endregion
  177. #region CourseInfo
  178. const int nameColumn = 1;
  179. const int contentColumn = 3;
  180. static List<CourseInfo> getCourseInfo()
  181. {
  182. List<CourseInfo> listCI = new List<CourseInfo>();
  183. string str = "select * from course_info";
  184. MySqlConnection con = new MySqlConnection(conStr);
  185. try
  186. {
  187. con.Open();
  188. MySqlCommand mCmd = new MySqlCommand(str, con);
  189. MySqlDataReader mReader = mCmd.ExecuteReader();
  190. while (mReader.Read())
  191. {
  192. CourseInfo ci = new CourseInfo();
  193. ci.Id = mReader.GetInt16("id");
  194. ci.Pid = mReader.GetInt16("pid");
  195. ci.Time = mReader.GetInt16("time");
  196. ci.Name = (mReader.IsDBNull(nameColumn)) ? "无" : mReader.GetString("name");
  197. ci.Content = (mReader.IsDBNull(contentColumn)) ? "无" : mReader.GetString("content");
  198. listCI.Add(ci);
  199. }
  200. return listCI;
  201. }
  202. catch (MySqlException mySqlEx)
  203. {
  204. Debug.Print(DateTime.Now + " : " + mySqlEx.Message);
  205. return null;
  206. }
  207. finally
  208. {
  209. con.Close();
  210. }
  211. }
  212. #endregion
  213. #region UserCourseInfo
  214. const int statusColumn = 3;
  215. const int detailsColumn = 4;
  216. /// <summary>
  217. /// 员工获取课程信息
  218. /// </summary>
  219. static bool getUserCourseStatus(short jobId, out string status, out string details)
  220. {
  221. status = "";
  222. details = "";
  223. string qStu = "select * from usercouse_info where job_id = " + jobId;
  224. MySqlConnection con = new MySqlConnection(conStr);
  225. try
  226. {
  227. con.Open();
  228. MySqlCommand mCmd = new MySqlCommand(qStu, con);
  229. MySqlDataReader mReader = mCmd.ExecuteReader();
  230. mReader.Read();
  231. status = (mReader.IsDBNull(statusColumn)) ? " " : mReader.GetString("status");
  232. details = (mReader.IsDBNull(detailsColumn)) ? " " : mReader.GetString("details");
  233. return true;
  234. }
  235. catch (MySqlException)
  236. {
  237. return false;
  238. }
  239. finally
  240. {
  241. con.Close();
  242. }
  243. }
  244. #endregion
  245. #region Update
  246. #region Student
  247. /// <summary>
  248. /// 学员更改个人课程状态
  249. /// </summary>
  250. static void sUpdateInfo(short job_id, string sqlStr, out bool final, out string eMessage)
  251. {
  252. final = false;
  253. eMessage = null;
  254. string str = "select * from usercourse_info where account = " + job_id + sqlStr;
  255. MySqlConnection conn = new MySqlConnection();
  256. try
  257. {
  258. MySqlCommand cmd = new MySqlCommand(str, conn);
  259. if (cmd.ExecuteNonQuery() > 0)
  260. final = true;
  261. }
  262. catch (MySqlException e)
  263. {
  264. eMessage = e.Message;
  265. Debug.Print(e.Message); // 可以去掉
  266. }
  267. finally
  268. {
  269. conn.Close();
  270. }
  271. }
  272. #endregion
  273. #region Teacher
  274. static void tUpdateInfo(string sqlStr, out bool final, out string eMessage)
  275. {
  276. final = false;
  277. eMessage = null;
  278. string str = "select * from usercourse_info where " + sqlStr;
  279. MySqlConnection conn = new MySqlConnection();
  280. try
  281. {
  282. MySqlCommand cmd = new MySqlCommand(str, conn);
  283. if (cmd.ExecuteNonQuery() > 0)
  284. final = true;
  285. }
  286. catch (MySqlException e)
  287. {
  288. eMessage = e.Message;
  289. Debug.Print(e.Message); // 可以去掉
  290. }
  291. finally
  292. {
  293. conn.Close();
  294. }
  295. }
  296. #endregion
  297. #endregion
  298. }
  299. }