/* 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
}
}