Files
ClientServerProject/CommonLibrary/AccountSupport/ServerAccount.cs

311 lines
9.9 KiB
C#
Raw Normal View History

2017-05-02 21:28:38 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Newtonsoft.Json.Linq;
namespace CommonLibrary
{
/// <summary>
/// 服务器的账户管理类,如果你采用这种方式存储,请参照本项目事例
2017-05-02 21:28:38 +08:00
/// </summary>
/// <typeparam name="T">账户类该类必须派生自UserAccount类</typeparam>
public class ServerAccounts<T> : HslCommunication.BasicFramework.SoftFileSaveBase where T : UserAccount, new()
2017-05-02 21:28:38 +08:00
{
#region Constructor
2017-05-02 21:28:38 +08:00
/// <summary>
/// 初始化构造方法
2017-05-02 21:28:38 +08:00
/// </summary>
public ServerAccounts()
{
}
/// <summary>
/// 初始化构造方法,将添加几个初始化账户
2017-05-02 21:28:38 +08:00
/// </summary>
public ServerAccounts(IEnumerable<T> accounts)
{
all_list_accounts.AddRange(accounts);
}
#endregion
#region Private Member
2017-05-02 21:28:38 +08:00
private List<T> all_list_accounts = new List<T>();
/// <summary>
/// 一个简单的混合锁相比Lock速度更快
/// </summary>
private HslCommunication.SimpleHybirdLock hybirdLock = new HslCommunication.SimpleHybirdLock();
2017-05-02 21:28:38 +08:00
#endregion
#region Public Method
2017-05-02 21:28:38 +08:00
/// <summary>
/// 更新指定账户的密码
/// </summary>
/// <param name="name"></param>
/// <param name="password"></param>
public void UpdatePassword(string name, string password)
{
hybirdLock.Enter();
for (int i = 0; i < all_list_accounts.Count; i++)
2017-05-02 21:28:38 +08:00
{
if (name == all_list_accounts[i].UserName)
2017-05-02 21:28:38 +08:00
{
all_list_accounts[i].Password = password;
ILogNet?.WriteInfo(SoftResources.StringResouce.AccountModifyPassword + name);
break;
2017-05-02 21:28:38 +08:00
}
}
hybirdLock.Leave();
2017-05-02 21:28:38 +08:00
}
/// <summary>
/// 更新指定账户的大小尺寸的头像MD5码
/// </summary>
/// <param name="name"></param>
/// <param name="largePortraitMD5">大尺寸头像的MD5</param>
/// <param name="smallPortraitMD5">小尺寸头像的MD5</param>
public void UpdatePortraitMD5(string name, string smallPortraitMD5, string largePortraitMD5)
{
hybirdLock.Enter();
for (int i = 0; i < all_list_accounts.Count; i++)
{
if (name == all_list_accounts[i].UserName)
{
all_list_accounts[i].SmallPortraitMD5 = smallPortraitMD5;
all_list_accounts[i].LargePortraitMD5 = largePortraitMD5;
ILogNet?.WriteInfo(SoftResources.StringResouce.AccountUploadPortrait + name);
break;
}
}
hybirdLock.Leave();
}
2017-05-02 21:28:38 +08:00
/// <summary>
/// 筛选特定的账户信息
/// </summary>
/// <param name="selector"></param>
/// <returns></returns>
public List<T> WhereAccounts(Func<T, bool> selector)
{
return all_list_accounts.Where(selector).ToList();
}
/// <summary>
/// 将所有账户信息转换成另一种元素,并返回列表
/// </summary>
/// <typeparam name="TResult">目标类型</typeparam>
/// <param name="converter">转换方法</param>
/// <returns>转换后的结果列表</returns>
public List<TResult> ConvertAll<TResult>(Converter<T, TResult> converter)
{
return all_list_accounts.ConvertAll(converter);
}
/// <summary>
/// 检查账户信息,并返回账户对象
/// </summary>
/// <param name="name">需要验证的用户名</param>
/// <param name="code">需要验证的密码</param>
/// <param name="ipAddress">登录的ip地址</param>
/// <returns>验证的结果对象</returns>
public T CheckAccount(string name, string code, string ipAddress, string way)
2017-05-02 21:28:38 +08:00
{
T result = new T()
{
UserName = name,
Password = code,
ForbidMessage = "用户名不存在!",
};
hybirdLock.Enter();
for (int i = 0; i < all_list_accounts.Count; i++)
2017-05-02 21:28:38 +08:00
{
T item = all_list_accounts[i];
if (item.UserName == name)
2017-05-02 21:28:38 +08:00
{
if (item.Password != code)
{
item.LoginFailedCount++;
result.ForbidMessage = "密码错误!";
break;
}
else
2017-05-02 21:28:38 +08:00
{
// 说明已经登录成功,需要进行进一步操作
item.LoginFrequency++;
result = item.DeepCopy<T>();
// 下面两个数据应该是旧的数据
item.LastLoginIpAddress = ipAddress;
item.LastLoginTime = DateTime.Now;
item.LastLoginWay = way;
break;
2017-05-02 21:28:38 +08:00
}
}
}
hybirdLock.Leave();
2017-05-02 21:28:38 +08:00
return result;
}
/// <summary>
/// 新增一个账户如果账户名称已经存在则返回False注册成功返回True
/// </summary>
/// <param name="json_account">账户对象的JSON表示方式</param>
/// <returns>成功True失败False</returns>
public bool AddNewAccount(string json_account)
{
T account = JObject.Parse(json_account).ToObject<T>();
return AddNewAccount(account);
2017-05-02 21:28:38 +08:00
}
/// <summary>
/// 新增一个账户如果账户名称已经存在则返回False注册成功返回True
/// </summary>
/// <param name="account">账户对象</param>
/// <returns>成功<c>True</c>,失败<c>False</c></returns>
2017-05-02 21:28:38 +08:00
public bool AddNewAccount(T account)
{
bool result = true;
hybirdLock.Enter();
// 账户名重复的时候不允许添加
for (int i = 0; i < all_list_accounts.Count; i++)
2017-05-02 21:28:38 +08:00
{
if (all_list_accounts[i].UserName == account.UserName)
2017-05-02 21:28:38 +08:00
{
result = false;
break;
2017-05-02 21:28:38 +08:00
}
}
// 账户名为空的时候不允许添加
if(string.IsNullOrEmpty(account.UserName))
{
result = false;
}
// 检测通过后进行添加账户名
if (result)
{
all_list_accounts.Add(account);
ILogNet?.WriteInfo(SoftResources.StringResouce.AccountAddSuccess + account.UserName);
}
hybirdLock.Leave();
return result;
2017-05-02 21:28:38 +08:00
}
/// <summary>
/// 删除一个账户信息,
/// </summary>
/// <param name="name">需要删除的账户的名称</param>
public void DeleteAccount(string name)
{
hybirdLock.Enter();
for (int i = 0; i < all_list_accounts.Count; i++)
2017-05-02 21:28:38 +08:00
{
if (name == all_list_accounts[i].UserName)
2017-05-02 21:28:38 +08:00
{
all_list_accounts.RemoveAt(i);
ILogNet?.WriteInfo(SoftResources.StringResouce.AccountDeleteSuccess + name);
break;
2017-05-02 21:28:38 +08:00
}
}
hybirdLock.Leave();
2017-05-02 21:28:38 +08:00
}
/// <summary>
/// 检查账户对象并返回账户的JSON字符串
/// </summary>
/// <param name="name">登录的用户名</param>
/// <param name="code">登录的密码</param>
/// <param name="ipAddress">检查的客户端的登录的ip地址</param>
/// <returns></returns>
public string CheckAccountJson(string name, string code, string ipAddress, string way)
2017-05-02 21:28:38 +08:00
{
T result = CheckAccount(name, code, ipAddress, way);
2017-05-02 21:28:38 +08:00
return JObject.FromObject(result).ToString();
}
/// <summary>
/// 获取所有的账户的JSON字符串
/// </summary>
/// <returns></returns>
public string GetAllAccountsJson()
{
string result = string.Empty;
hybirdLock.Enter();
result = JArray.FromObject(all_list_accounts).ToString();
hybirdLock.Leave();
2017-05-02 21:28:38 +08:00
return result;
}
/// <summary>
/// 从所有的账户的json数据加载账户
/// </summary>
/// <param name="json"></param>
public void LoadAllAccountsJson(string json)
{
hybirdLock.Enter();
try
2017-05-02 21:28:38 +08:00
{
all_list_accounts = JArray.Parse(json).ToObject<List<T>>();
}
catch (Exception ex)
{
ILogNet?.WriteException(SoftResources.StringResouce.AccountLoadFailed, ex);
2017-05-02 21:28:38 +08:00
}
hybirdLock.Leave();
2017-05-02 21:28:38 +08:00
}
#endregion
#region Override Method
2017-05-02 21:28:38 +08:00
/// <summary>
/// 从字符串加载数据内容
2017-05-02 21:28:38 +08:00
/// </summary>
/// <param name="content"></param>
public override void LoadByString(string content)
2017-05-02 21:28:38 +08:00
{
LoadAllAccountsJson(content);
2017-05-02 21:28:38 +08:00
}
/// <summary>
/// 获取需要保存的数据内容
2017-05-02 21:28:38 +08:00
/// </summary>
/// <returns></returns>
public override string ToSaveString()
2017-05-02 21:28:38 +08:00
{
return GetAllAccountsJson();
2017-05-02 21:28:38 +08:00
}
/// <summary>
/// 使用加密规则从文件加载
2017-05-02 21:28:38 +08:00
/// </summary>
public override void LoadByFile()
2017-05-02 21:28:38 +08:00
{
LoadByFile(m => m);
2017-05-02 21:28:38 +08:00
}
/// <summary>
/// 使用加密规则保存到文件
2017-05-02 21:28:38 +08:00
/// </summary>
public override void SaveToFile()
2017-05-02 21:28:38 +08:00
{
SaveToFile(m => m);
2017-05-02 21:28:38 +08:00
}
#endregion
2017-05-02 21:28:38 +08:00
}
}