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; }
}
}