using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json.Linq; using System.IO; using HslCommunication.BasicFramework; /************************************************************************************* * * 时间:2017年9月3日 09:18:21 * 说明:本文档主要包含一个主要内容,关于客户端和服务器的一些本地参数存储解析 * * 服务器:此处存储了系统版本号,公告,是否允许用户登录,分厂信息等等共享 * 客户端:此处存储了用户名,密码,上次登录时间,机器码等等,用于客户端自我校验 * * 格式:存储采用json字符串存储,客户端还进行了双向加密,防止用户直接打开更改 * *************************************************************************************/ namespace CommonLibrary { /// /// 服务器的常用参数保存,包含了版本号,公告,是否允许登录,不能登录说明 /// public sealed class ServerSettings : SoftFileSaveBase { #region Public Property /// /// 系统的版本号,可以用来验证版本更新的依据 /// 初始化1.0.0 /// public SystemVersion SystemVersion { get; set; } = new SystemVersion("1.0.0"); /// /// 系统的公告信息,默认为测试公告 /// public string Announcement { get; set; } = "测试公告"; /// /// 是否允许账户登录,超级管理员账户除外 /// public bool Can_Account_Login { get; set; } = true; /// /// 是否允许一个用户名重复登录系统 /// public bool AllowUserMultiOnline { get; set; } = false; /// /// 不允许登录系统的原因 /// public string Account_Forbidden_Reason { get; set; } = "系统处于维护中,请稍后登录。"; /// /// 系统的所有分厂信息 /// public List SystemFactories { get; set; } = new List() { "分厂示例1","分厂示例2" }; #endregion #region TrustedClientAuthentication /// /// 是否开启仅信任客户端验证 /// public bool WhetherToEnableTrustedClientAuthentication { get; set; } = false; /// /// 信任的客户端列表 /// public List TrustedClientList { get; set; } = new List(); /// /// 列表锁 /// private HslCommunication.SimpleHybirdLock hybirdLock = new HslCommunication.SimpleHybirdLock(); /// /// 判断一个客户端的ID能否登录到系统 /// /// /// public bool CanClientLogin(string machineId) { bool result = false; hybirdLock.Enter(); result = TrustedClientList.Contains(machineId); hybirdLock.Leave(); return result; } /// /// 新增一个客户端ID到信任列表中,新增成功True,原来已经存在False /// /// /// public bool AddTrustedClient(string machineId) { bool result = false; hybirdLock.Enter(); if(!TrustedClientList.Contains(machineId)) { TrustedClientList.Add(machineId); result = true; } hybirdLock.Leave(); return result; } /// /// 从信任的列表中删除一个存在的客户端ID /// /// public bool DeleteTrustedClient(string machineId) { bool result = false; hybirdLock.Enter(); if (TrustedClientList.Contains(machineId)) { TrustedClientList.Remove(machineId); result = true; } hybirdLock.Leave(); return result; } #endregion #region Override Method /// /// 获取需要存储的数据 /// /// public override string ToSaveString() { JObject json = new JObject { { nameof(SystemVersion), new JValue(SystemVersion.ToString()) }, { nameof(Announcement), new JValue(Announcement) }, { nameof(Can_Account_Login), new JValue(Can_Account_Login) }, { nameof(AllowUserMultiOnline),new JValue(AllowUserMultiOnline) }, { nameof(Account_Forbidden_Reason), new JValue(Account_Forbidden_Reason) }, { nameof(SystemFactories), new JArray(SystemFactories) }, { nameof(WhetherToEnableTrustedClientAuthentication),new JValue(WhetherToEnableTrustedClientAuthentication) }, { nameof(TrustedClientList),new JArray(TrustedClientList) }, }; return json.ToString(); } /// /// 从字符串数据加载配置 /// /// public override void LoadByString(string content) { JObject json = JObject.Parse(content); SystemVersion = new SystemVersion(SoftBasic.GetValueFromJsonObject(json, nameof(SystemVersion), "1.0.0")); Announcement = SoftBasic.GetValueFromJsonObject(json, nameof(Announcement), Announcement); Can_Account_Login = SoftBasic.GetValueFromJsonObject(json, nameof(Can_Account_Login), Can_Account_Login); AllowUserMultiOnline = SoftBasic.GetValueFromJsonObject(json, nameof(AllowUserMultiOnline), AllowUserMultiOnline); Account_Forbidden_Reason = SoftBasic.GetValueFromJsonObject(json, nameof(Account_Forbidden_Reason), Account_Forbidden_Reason); if (json[nameof(SystemFactories)] != null) { SystemFactories = json[nameof(SystemFactories)].ToObject>(); } WhetherToEnableTrustedClientAuthentication = SoftBasic.GetValueFromJsonObject(json, nameof(WhetherToEnableTrustedClientAuthentication), false); if (json[nameof(TrustedClientList)] != null) { TrustedClientList = json[nameof(TrustedClientList)].ToObject>(); } ; } #endregion } /// /// 用户客户端存储本地JSON数据的类,包含了所有需要存储的信息 /// public sealed class JsonSettings : SoftFileSaveBase { #region Constructor /// /// 实例化一个设置的对象 /// public JsonSettings() { SystemInfo = SoftAuthorize.GetInfo(); } #endregion #region 客户端本地保存的数据 /// /// 指示系统是否是更新后第一次运行 /// public bool IsNewVersionRunning { get; set; } = true; /// /// 上次系统登录的用户名 /// public string LoginName { get; set; } = ""; /// /// 上次系统登录的密码 /// public string Password { get; set; } = ""; /// /// 上次系统登录的时间 /// public DateTime LoginTime { get; set; } = DateTime.Now; /// /// 指示系统的主题色是否是深色,目前只适合于wpf /// public bool IsThemeDark { get; set; } = false; /// /// 本地保存的密码过期天数 /// public int PasswordOverdueDays { get; set; } = 7; /// /// 当前计算机的机器码,用来判定参数是否是正确的 /// public string SystemInfo { get; private set; } #endregion #region Override Method public override string ToSaveString() { JObject json = new JObject(); json.Add(nameof(LoginName), new JValue(LoginName)); json.Add(nameof(Password), new JValue(Password)); json.Add(nameof(IsNewVersionRunning), new JValue(IsNewVersionRunning)); json.Add(nameof(SystemInfo), new JValue(SystemInfo)); json.Add(nameof(LoginTime), new JValue(LoginTime)); json.Add(nameof(IsThemeDark), new JValue(IsThemeDark)); json.Add(nameof(PasswordOverdueDays), new JValue(PasswordOverdueDays)); return json.ToString(); } public override void LoadByString(string content) { JObject json = JObject.Parse(content); string systemInfo = SoftBasic.GetValueFromJsonObject(json, nameof(SystemInfo), ""); // 用户名不会因此更改 LoginName = SoftBasic.GetValueFromJsonObject(json, nameof(LoginName), LoginName); if (systemInfo == SystemInfo) { //确认账户名及密码是本机的记录,而不是从其他电脑端拷贝过来的 IsNewVersionRunning = SoftBasic.GetValueFromJsonObject(json, nameof(IsNewVersionRunning), IsNewVersionRunning); Password = SoftBasic.GetValueFromJsonObject(json, nameof(Password), Password); LoginTime = SoftBasic.GetValueFromJsonObject(json, nameof(LoginTime), LoginTime); IsThemeDark = SoftBasic.GetValueFromJsonObject(json, nameof(IsThemeDark), IsThemeDark); PasswordOverdueDays = SoftBasic.GetValueFromJsonObject(json, nameof(PasswordOverdueDays), PasswordOverdueDays); } } /// /// 使用指定的解密实现数据解密 /// public override void LoadByFile() { LoadByFile(m => SoftSecurity.MD5Decrypt(m, CommonProtocol.Security)); } /// /// 使用指定的加密实现数据加密 /// public override void SaveToFile() { SaveToFile(m => SoftSecurity.MD5Encrypt(m, CommonProtocol.Security)); } #endregion } }