diff --git a/CommonLibrary/AccountSupport/ServerAccount.cs b/CommonLibrary/AccountSupport/ServerAccount.cs new file mode 100644 index 0000000..3c6928e --- /dev/null +++ b/CommonLibrary/AccountSupport/ServerAccount.cs @@ -0,0 +1,288 @@ +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; } + } +} diff --git a/CommonLibrary/AccountSupport/UserAccount.cs b/CommonLibrary/AccountSupport/UserAccount.cs new file mode 100644 index 0000000..8a0cd93 --- /dev/null +++ b/CommonLibrary/AccountSupport/UserAccount.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Newtonsoft.Json.Linq; + +namespace CommonLibrary +{ + /// + /// 本系統的用账户类,包含了一些常用的数据信息,如果你想添加额外属性,请继承此类 + /// + public class UserAccount + { + /// + /// 用户名称,该名称唯一 + /// + public string UserName { get; set; } = ""; + /// + /// 用户名称的别名,也不可以不使用 + /// + public string NameAlias { get; set; } = ""; + /// + /// 用户登录的密码 + /// + public string Password { get; set; } = ""; + /// + /// 账户所属的工厂名称或类别名称 + /// + public string Factory { get; set; } = ""; + /// + /// 用户的权限等级,目前配置了4个等级 + /// + public int Grade { get; set; } = 0; + /// + /// 该用户的注册日期,一旦注册,应该固定 + /// + public DateTime RegisterTime { get; set; } = DateTime.Now; + /// + /// 该用户是否允许登录 + /// + public bool LoginEnable { get; set; } = false; + /// + /// 该用户不允许被登录的原因 + /// + public string ForbidMessage { get; set; } = "该账户被管理员禁止登录!"; + /// + /// 该用户自注册以来登录的次数 + /// + public int LoginFrequency { get; set; } = 0; + /// + /// 该用户上次登录的时间 + /// + public DateTime LastLoginTime { get; set; } = DateTime.Now; + /// + /// 该用户上次登录的IP地址 + /// + public string LastLoginIpAddress { get; set; } = ""; + /// + /// 该用户连续登录失败的计数,可以用来连续五次失败禁止账户登录 + /// + public int LoginFailedCount { get; set; } = 0; + /// + /// 用于存储和传送的名称 + /// + public static string UserNameText { get { return "UserName"; } } + /// + /// 用于存储和传送的名称 + /// + public static string PasswordText { get { return "Password"; } } + /// + /// 深度拷贝当前的账户信息 + /// + /// 返回的类型,应该为继承后的类型 + /// 新的对象 + public T DeepCopy() where T : UserAccount + { + return JObject.FromObject(this).ToObject(); + } + /// + /// 获取账号的用户名 + /// + /// + public override string ToString() + { + return UserName; + } + /// + /// 获取本账号的JSON字符串,用于在网络中数据传输 + /// + /// + public string ToJsonString() + { + return JObject.FromObject(this).ToString(); + } + } + + + + /// + /// 账户的等级 + /// + public class AccountGrade + { + /// + /// 超级管理员 + /// + public static int SuperAdministrator { get; private set; } = 10000; + /// + /// 管理员 + /// + public static int Admin { get; private set; } = 1000; + /// + /// 技术员 + /// + public static int Technology { get; private set; } = 100; + /// + /// 一般 + /// + public static int General { get; private set; } = 10; + + /// + /// 获取对应等级的文本描述 + /// + /// 等级数据 + /// 等级描述 + public static string GetDescription(int grade) + { + if (grade >= SuperAdministrator) + { + return "超级管理员"; + } + else if (grade >= Admin) + { + return "管理员"; + } + else if (grade >= Technology) + { + return "技术员"; + } + else + { + return "普通"; + } + } + /// + /// 获取权限的数组 + /// + /// + public static string[] GetDescription() + { + return new string[] + { + GetDescription(SuperAdministrator), + GetDescription(Admin), + GetDescription(Technology), + GetDescription(General), + }; + } + + } + + +} diff --git a/CommonLibrary/CommonLibrary.csproj b/CommonLibrary/CommonLibrary.csproj index 14fd9d7..3e2b024 100644 --- a/CommonLibrary/CommonLibrary.csproj +++ b/CommonLibrary/CommonLibrary.csproj @@ -30,6 +30,12 @@ 4 + + ..\Public\HslCommunication.dll + + + ..\packages\Newtonsoft.Json.10.0.2\lib\net35\Newtonsoft.Json.dll + @@ -38,6 +44,8 @@ + + @@ -45,6 +53,9 @@ + + +