using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
namespace StuMgmLib.MyNameSpace
{
class SystemCtrl
{
///
/// 序列化
///
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;
}
///
/// 获取返回数据
///
public static byte[] CreateServerResponse(byte[] clientRequset)
{
try
{
var cs = Deserialize(clientRequset);
ServerResponse sr = new ServerResponse();
switch (cs.Func)
{
case ClientFunc.VerifyLogin:
UserInfo ui = (UserInfo)cs.Object;
if (verifyLogin(ui, out sr.Lev))
sr.Token = addToken(ui.Account, ref Info.myToken);
break;
case ClientFunc.GetCourseInfo:
sr.Object = getCourseInfo();
Debug.Print(sr.Object.GetType().ToString());
break;
case ClientFunc.GetUserCourseInfo:
short job_id;
UserCourseInfo uc = new UserCourseInfo();
if (verifyToken((Dictionary)cs.Object, out job_id))
if (getUserCourseStatus(job_id, out uc.Status, out uc.Details))
sr.Object = uc;
break;
}
return Serialize(sr);
}
catch
{
return null;
}
}
const string conStr = "data source=localhost; initial catalog=xinje; user id=root; pwd=980505;charset = utf8";
static bool verifyLogin(UserInfo userInfo, out LvErr level)
{
level = LvErr.Error;
string qStu = "select * from user where account = " + userInfo.Account + " and password = '" + userInfo.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 = (LvErr)mReader.GetInt16("level");
return true;
}
else
{
level = LvErr.NotFound;
return false;
}
}
catch (MySqlException)
{
level = LvErr.Error;
return false;
}
finally
{
con.Close();
}
}
static int addToken(short job_id, ref Dictionary myToken)
{
if (myToken != null)
{
if (myToken.Count > Info.tokenMaxCount) // 清除缓存
myToken.Clear();
if (myToken.ContainsKey(job_id))
{
myToken.Remove(job_id);
}
}
Random r = new Random(); // 伪随机
int token = r.Next();
myToken.Add(job_id, token);
return token;
}
static bool verifyToken(Dictionary dic, out short account)
{
account = 0;
if (dic.Count != 1)
return false;
foreach (var item in dic)
{
if (!Info.myToken.ContainsKey(item.Key))
return false;
if (Info.myToken[item.Key] == item.Value)
{
account = item.Key;
return true;
}
}
return false;
}
const int nameColumn = 1;
const int contentColumn = 3;
static List getCourseInfo()
{
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);
}
return listCI;
}
catch (MySqlException mySqlEx)
{
Debug.Print(DateTime.Now + " : " + mySqlEx.Message);
return null;
}
finally
{
con.Close();
}
}
const int statusColumn = 3;
const int detailsColumn = 4;
static bool getUserCourseStatus(short jobId, out string status, out string details)
{
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");
return true;
}
catch (MySqlException)
{
return false;
}
finally
{
con.Close();
}
}
}
}