using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using Newtonsoft.Json.Linq; namespace CommonLibrary { /// /// 服务器的账户管理类,如果你采用这种方式存储,必须仔细阅读说明手册 /// /// 账户类,该类必须派生自UserAccount类 public class ServerAccounts where T : UserAccount, new() { /// /// 初始化構造方法 /// public ServerAccounts() { } /// /// 初始化構造方法,将添加几个初始化账户 /// public ServerAccounts(IEnumerable accounts) { all_list_accounts.AddRange(accounts); } /// /// 所有的帳戶信息存儲的位置,只有設置了才進行保存 /// public string FileSavePath { get; set; } = ""; private List all_list_accounts = new List(); private object lock_list_accounts = new object(); /// /// 更新指定账户的密码 /// /// /// public void UpdatePassword(string name, string password) { lock (lock_list_accounts) { for (int i = 0; i < all_list_accounts.Count; i++) { if (name == all_list_accounts[i].UserName) { all_list_accounts[i].Password = password; break; } } } } /// /// 筛选特定的账户信息 /// /// /// public List WhereAccounts(Func selector) { return all_list_accounts.Where(selector).ToList(); } /// /// 将所有账户信息转换成另一种元素,并返回列表 /// /// 目标类型 /// 转换方法 /// 转换后的结果列表 public List ConvertAll(Converter converter) { return all_list_accounts.ConvertAll(converter); } /// /// 检查账户信息,并返回账户对象 /// /// 需要验证的用户名 /// 需要验证的密码 /// 登录的ip地址 /// 验证的结果对象 public T CheckAccount(string name, string code, string ipAddress) { T result = new T() { UserName = name, Password = code, ForbidMessage = "用户名不存在!", }; lock (lock_list_accounts) { for (int i = 0; i < all_list_accounts.Count; i++) { T item = all_list_accounts[i]; if (item.UserName == name) { if (item.Password != code) { result.ForbidMessage = "密码错误!"; break; } else { //说明已经登录成功,需要进行进一步操作 item.LoginFrequency++; result = item.DeepCopy(); //下面两个数据应该是旧的数据 item.LastLoginIpAddress = ipAddress; item.LastLoginTime = DateTime.Now; break; } } } } return result; } /// /// 新增一个账户,如果账户名称已经存在,则返回False,注册成功返回True /// /// 账户对象的JSON表示方式 /// 成功True,失败False public bool AddNewAccount(string json_account) { try { T account = JObject.Parse(json_account).ToObject(); return AddNewAccount(account); } catch { return false; } } /// /// 新增一个账户,如果账户名称已经存在,则返回False,注册成功返回True /// /// 账户对象 /// 成功True,失败False public bool AddNewAccount(T account) { lock (lock_list_accounts) { for (int i = 0; i < all_list_accounts.Count; i++) { if (all_list_accounts[i].UserName == account.UserName) { return false; } } all_list_accounts.Add(account); } return true; } /// /// 删除一个账户信息, /// /// 需要删除的账户的名称 public void DeleteAccount(string name) { lock (lock_list_accounts) { for (int i = 0; i < all_list_accounts.Count; i++) { if (name == all_list_accounts[i].UserName) { all_list_accounts.RemoveAt(i); break; } } } } /// /// 检查账户对象并返回账户的JSON字符串 /// /// 登录的用户名 /// 登录的密码 /// 检查的客户端的登录的ip地址 /// public string CheckAccountJson(string name, string code, string ipAddress) { T result = CheckAccount(name, code, ipAddress); return JObject.FromObject(result).ToString(); } /// /// 获取所有的账户的JSON字符串 /// /// public string GetAllAccountsJson() { string result = string.Empty; lock (lock_list_accounts) { result = JArray.FromObject(all_list_accounts).ToString(); } return result; } /// /// 从所有的账户的json数据加载账户 /// /// public void LoadAllAccountsJson(string json) { lock (lock_list_accounts) { try { all_list_accounts = JArray.Parse(json).ToObject>(); } catch { } } } /// /// 使用Base64编码將所有的帳戶信息保存到文件 /// public void SaveFile() { SaveFile(m => Convert.ToBase64String(Encoding.Unicode.GetBytes(m))); } /// /// 使用自定义的加密方法将所有账户信息保存到文件 /// public void SaveFile(Converter encrypt) { if (FileSavePath != "") { string result = GetAllAccountsJson(); StreamWriter sw = new StreamWriter(FileSavePath, false, Encoding.Default); sw.Write(encrypt(result)); sw.Flush(); sw.Dispose(); } } /// /// 使用Base64编码从文件加载所有的账户 /// public void LoadByFile() { LoadByFile(m => Encoding.Unicode.GetString(Convert.FromBase64String(m))); } /// /// 使用自定义的解密方法加载所有的账户 /// public void LoadByFile(Converter decrypt) { if (FileSavePath != "") { if (File.Exists(FileSavePath)) { StreamReader sr = new StreamReader(FileSavePath, Encoding.Default); string result = sr.ReadToEnd(); sr.Close(); sr.Dispose(); result = decrypt(result); LoadAllAccountsJson(result); } } } /************************************************************** * * 日志记录块,保存运行中的所有的异常信息,方便追踪系统异常 * *************************************************************/ /// /// 日志记录对象 /// public HslCommunication.Enthernet.HslLogHelper LogHelper { get; set; } } }