You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

540 lines
23 KiB

  1. using Learun.Application.Base.AuthorizeModule;
  2. using Learun.Application.Base.SystemModule;
  3. using Learun.Application.Organization;
  4. using Learun.Cache.Base;
  5. using Learun.Cache.Factory;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Web;
  9. namespace Learun.Util.Operat
  10. {
  11. /// <summary>
  12. /// 版 本 Learun-ADMS V7.0.3 力软敏捷开发框架
  13. /// Copyright (c) 2013-2018 上海力软信息技术有限公司
  14. /// 创建人:力软-框架开发组
  15. /// 日 期:2017.03.08
  16. /// 描 述:当前连接用户信息处理类
  17. /// </summary>
  18. public class OperatorHelper
  19. {
  20. #region 基础数据类
  21. private UserIBLL userIBLL = new UserBLL();
  22. private UserRelationIBLL userRelationIBLL = new UserRelationBLL();
  23. private CompanyIBLL companyIBLL = new CompanyBLL();
  24. private DepartmentIBLL departmentIBLL = new DepartmentBLL();
  25. #endregion
  26. /// <summary>
  27. /// 缓存操作类
  28. /// </summary>
  29. private ICache redisCache = CacheFactory.CaChe();
  30. private string cacheKeyOperator = "learun_adms_operator_";// +登录者token
  31. private string cacheKeyToken = "learun_adms_token_";// +登录者token
  32. private string cacheKeyError = "learun_adms_error_";// + Mark
  33. private string cacheKeyInfo = "learun_adms_info_";// + Mark
  34. /// <summary>
  35. /// 秘钥
  36. /// </summary>
  37. private string LoginUserToken = "Learun_ADMS_V7_Token";
  38. /// <summary>
  39. /// 标记登录的浏览器
  40. /// </summary>
  41. private string LoginUserMarkKey = "Learun_ADMS_V7_Mark";
  42. /// <summary>
  43. /// 获取实例
  44. /// </summary>
  45. public static OperatorHelper Instance
  46. {
  47. get { return new OperatorHelper(); }
  48. }
  49. /// <summary>
  50. /// 获取浏览器设配号
  51. /// </summary>
  52. /// <returns></returns>
  53. public string GetMark()
  54. {
  55. string cookieMark = WebHelper.GetCookie(LoginUserMarkKey).ToString();
  56. if (string.IsNullOrEmpty(cookieMark))
  57. {
  58. cookieMark = Guid.NewGuid().ToString();
  59. WebHelper.WriteCookie(LoginUserMarkKey, cookieMark);
  60. }
  61. return cookieMark;
  62. }
  63. /// <summary>
  64. /// 登录者信息添加到缓存中
  65. /// </summary>
  66. /// <param name="account">账号</param>
  67. /// <param name="appId">应用id</param>
  68. /// <param name="loginMark">设备标识</param>
  69. /// <param name="cookie">是否保存cookie,默认是</param>
  70. /// <returns></returns>
  71. public string AddLoginUser(string account, string mobileCode, string appId, string loginMark, bool cookie = true)
  72. {
  73. string token = Guid.NewGuid().ToString();
  74. try
  75. {
  76. // 填写登录信息
  77. Operator operatorInfo = new Operator();
  78. operatorInfo.appId = appId;
  79. operatorInfo.account = account;
  80. operatorInfo.logTime = DateTime.Now;
  81. operatorInfo.iPAddress = Net.Ip;
  82. operatorInfo.browser = Net.Browser;
  83. operatorInfo.token = token;
  84. if (cookie)
  85. {
  86. string cookieMark = WebHelper.GetCookie(LoginUserMarkKey).ToString();
  87. if (string.IsNullOrEmpty(cookieMark))
  88. {
  89. operatorInfo.loginMark = Guid.NewGuid().ToString();
  90. WebHelper.WriteCookie(LoginUserMarkKey, operatorInfo.loginMark);
  91. }
  92. else
  93. {
  94. operatorInfo.loginMark = cookieMark;
  95. }
  96. WebHelper.WriteCookie(LoginUserToken, token);
  97. }
  98. else
  99. {
  100. operatorInfo.loginMark = loginMark;
  101. }
  102. Dictionary<string, string> tokenMarkList = redisCache.Read<Dictionary<string, string>>(cacheKeyToken + account, CacheId.loginInfo);
  103. if (tokenMarkList == null)// 此账号第一次登录
  104. {
  105. tokenMarkList = new Dictionary<string, string>();
  106. tokenMarkList.Add(operatorInfo.loginMark, token);
  107. }
  108. else
  109. {
  110. if (tokenMarkList.ContainsKey(operatorInfo.loginMark))
  111. {
  112. tokenMarkList[operatorInfo.loginMark] = token;
  113. }
  114. else
  115. {
  116. tokenMarkList.Add(operatorInfo.loginMark, token);
  117. }
  118. }
  119. redisCache.Write<Dictionary<string, string>>(cacheKeyToken + account, tokenMarkList, CacheId.loginInfo);
  120. redisCache.Write<Operator>(cacheKeyOperator + operatorInfo.loginMark, operatorInfo, CacheId.loginInfo);
  121. return token;
  122. }
  123. catch (Exception)
  124. {
  125. throw;
  126. }
  127. }
  128. /// <summary>
  129. /// 登录者信息添加到缓存中
  130. /// </summary>
  131. /// <param name="account">账号</param>
  132. /// <param name="appId">应用id</param>
  133. /// <param name="loginMark">设备标识</param>
  134. /// <param name="cookie">是否保存cookie,默认是</param>
  135. /// <returns></returns>
  136. public string AddLoginUser(string account, string appId, string loginMark, bool cookie = true)
  137. {
  138. string token = Guid.NewGuid().ToString();
  139. try
  140. {
  141. // 填写登录信息
  142. Operator operatorInfo = new Operator();
  143. operatorInfo.appId = appId;
  144. operatorInfo.account = account;
  145. operatorInfo.logTime = DateTime.Now;
  146. operatorInfo.iPAddress = Net.Ip;
  147. operatorInfo.browser = Net.Browser;
  148. operatorInfo.token = token;
  149. //登录时间记录
  150. redisCache.Write<string>("logintime" + account, operatorInfo.logTime.ToDateTimeString(), CacheId.loginInfo);
  151. if (cookie)
  152. {
  153. string cookieMark = WebHelper.GetCookie(LoginUserMarkKey).ToString();
  154. if (string.IsNullOrEmpty(cookieMark))
  155. {
  156. operatorInfo.loginMark = Guid.NewGuid().ToString();
  157. WebHelper.WriteCookie(LoginUserMarkKey, operatorInfo.loginMark);
  158. }
  159. else
  160. {
  161. operatorInfo.loginMark = cookieMark;
  162. }
  163. WebHelper.WriteCookie(LoginUserToken, token);
  164. //登录时间记录
  165. WebHelper.WriteCookie("logintime" + account, operatorInfo.logTime.ToDateTimeString());
  166. }
  167. else
  168. {
  169. operatorInfo.loginMark = loginMark;
  170. }
  171. Dictionary<string, string> tokenMarkList = redisCache.Read<Dictionary<string, string>>(cacheKeyToken + account, CacheId.loginInfo);
  172. if (tokenMarkList == null)// 此账号第一次登录
  173. {
  174. tokenMarkList = new Dictionary<string, string>();
  175. tokenMarkList.Add(operatorInfo.loginMark, token);
  176. }
  177. else
  178. {
  179. if (tokenMarkList.ContainsKey(operatorInfo.loginMark))
  180. {
  181. tokenMarkList[operatorInfo.loginMark] = token;
  182. }
  183. else
  184. {
  185. tokenMarkList.Add(operatorInfo.loginMark, token);
  186. }
  187. }
  188. redisCache.Write<Dictionary<string, string>>(cacheKeyToken + account, tokenMarkList, CacheId.loginInfo);
  189. redisCache.Write<Operator>(cacheKeyOperator + operatorInfo.loginMark, operatorInfo, CacheId.loginInfo);
  190. return token;
  191. }
  192. catch (Exception)
  193. {
  194. throw;
  195. }
  196. }
  197. /// <summary>
  198. /// 清空当前登录信息
  199. /// </summary>
  200. public void EmptyCurrent()
  201. {
  202. try
  203. {
  204. string token = WebHelper.GetCookie(LoginUserToken).ToString();
  205. string loginMark = WebHelper.GetCookie(LoginUserMarkKey).ToString();
  206. EmptyCurrent(token, loginMark);
  207. }
  208. catch (Exception)
  209. {
  210. }
  211. }
  212. /// <summary>
  213. /// 清空当前登录信息
  214. /// </summary>
  215. /// <param name="token">登录票据</param>
  216. /// <param name="loginMark">登录设备标识</param>
  217. public void EmptyCurrent(string token, string loginMark)
  218. {
  219. try
  220. {
  221. Operator operatorInfo = redisCache.Read<Operator>(cacheKeyOperator + loginMark, CacheId.loginInfo);
  222. if (operatorInfo != null && operatorInfo.token == token)
  223. {
  224. Dictionary<string, string> tokenMarkList = redisCache.Read<Dictionary<string, string>>(cacheKeyToken + operatorInfo.account, CacheId.loginInfo);
  225. tokenMarkList.Remove(loginMark);
  226. redisCache.Remove(cacheKeyOperator + loginMark, CacheId.loginInfo);
  227. //登录时间清除
  228. redisCache.Remove("logintime" + operatorInfo.account, CacheId.loginInfo);
  229. WebHelper.RemoveCookie("logintime" + operatorInfo.account);
  230. redisCache.Write<Dictionary<string, string>>(cacheKeyToken + operatorInfo.account, tokenMarkList, CacheId.loginInfo);
  231. }
  232. }
  233. catch (Exception)
  234. {
  235. }
  236. }
  237. /// <summary>
  238. /// 判断登录状态
  239. /// </summary>
  240. /// <returns>-1未登录,1登录成功,0登录过期</returns>
  241. public OperatorResult IsOnLine(string account)
  242. {
  243. try
  244. {
  245. string token = WebHelper.GetCookie(LoginUserToken).ToString();
  246. string loginMark = WebHelper.GetCookie(LoginUserMarkKey).ToString();
  247. return IsOnLine(token, loginMark, account);
  248. }
  249. catch (Exception)
  250. {
  251. return new OperatorResult { stateCode = -1 };
  252. }
  253. }
  254. /// <summary>
  255. /// 判断登录状态
  256. /// </summary>
  257. /// <param name="token">登录票据</param>
  258. /// <param name="loginMark">登录设备标识</param>
  259. /// <returns>-1未登录,1登录成功,0登录过期</returns>
  260. public OperatorResult IsOnLine(string token, string loginMark, string account = "")
  261. {
  262. OperatorResult operatorResult = new OperatorResult();
  263. operatorResult.stateCode = -1; // -1未登录,1登录成功,0登录过期
  264. try
  265. {
  266. if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(loginMark))
  267. {
  268. return operatorResult;
  269. }
  270. Operator operatorInfo = redisCache.Read<Operator>(cacheKeyOperator + loginMark, CacheId.loginInfo);
  271. if (operatorInfo != null && operatorInfo.token == token)
  272. {
  273. TimeSpan span = (TimeSpan)(DateTime.Now - operatorInfo.logTime);
  274. if (span.TotalHours >= 1200)// 登录操作过12小时移除
  275. {
  276. operatorResult.stateCode = 0;
  277. Dictionary<string, string> tokenMarkList = redisCache.Read<Dictionary<string, string>>(cacheKeyToken + operatorInfo.account, CacheId.loginInfo);
  278. tokenMarkList.Remove(loginMark);
  279. redisCache.Write<Dictionary<string, string>>(cacheKeyToken + operatorInfo.account, tokenMarkList, CacheId.loginInfo);
  280. redisCache.Remove(cacheKeyOperator + loginMark, CacheId.loginInfo);
  281. //登录时间清除
  282. redisCache.Remove("logintime" + operatorInfo.account, CacheId.loginInfo);
  283. WebHelper.RemoveCookie("logintime" + operatorInfo.account);
  284. }
  285. else
  286. {
  287. string verifyonelogin = Util.Config.GetValue("verifyonelogin");
  288. if (!string.IsNullOrEmpty(verifyonelogin) && verifyonelogin == "true" && operatorInfo.account != "")
  289. {
  290. if (operatorInfo.appId.Contains("PC"))
  291. {
  292. //多客户端登录判断
  293. string logintime = redisCache.Read<string>("logintime" + operatorInfo.account, CacheId.loginInfo);
  294. string cookielogintime = WebHelper.GetCookie("logintime" + operatorInfo.account);
  295. if (string.IsNullOrEmpty(logintime) || string.IsNullOrEmpty(cookielogintime) || logintime != cookielogintime)
  296. {
  297. operatorResult.stateCode = 0;
  298. return operatorResult;
  299. }
  300. }
  301. }
  302. if (!string.IsNullOrEmpty(account) && account != operatorInfo.account)
  303. {
  304. operatorResult.stateCode = 2;
  305. return operatorResult;
  306. }
  307. UserInfo userInfo = redisCache.Read<UserInfo>(cacheKeyInfo + operatorInfo.account, CacheId.loginInfo);
  308. if (userInfo == null || userInfo.loadTime == null || userInfo.loadTime <= DateTime.Now.AddMinutes(-5))
  309. {
  310. userInfo = new UserInfo();
  311. userInfo.appId = operatorInfo.appId;
  312. userInfo.logTime = operatorInfo.logTime;
  313. userInfo.iPAddress = operatorInfo.iPAddress;
  314. userInfo.browser = operatorInfo.browser;
  315. userInfo.loginMark = operatorInfo.loginMark;
  316. userInfo.token = operatorInfo.token;
  317. userInfo.account = operatorInfo.account;
  318. UserEntity userEntity = userIBLL.GetEntityByAccount(operatorInfo.account);
  319. if (userEntity != null)
  320. {
  321. userInfo.userId = userEntity.F_UserId;
  322. userInfo.enCode = userEntity.F_EnCode;
  323. userInfo.password = userEntity.F_Password;
  324. userInfo.secretkey = userEntity.F_Secretkey;
  325. userInfo.realName = userEntity.F_RealName;
  326. userInfo.nickName = userEntity.F_NickName;
  327. userInfo.headIcon = userEntity.F_HeadIcon;
  328. userInfo.gender = userEntity.F_Gender;
  329. userInfo.mobile = userEntity.F_Mobile;
  330. userInfo.telephone = userEntity.F_Telephone;
  331. userInfo.email = userEntity.F_Email;
  332. userInfo.oICQ = userEntity.F_OICQ;
  333. userInfo.weChat = userEntity.F_WeChat;
  334. userInfo.companyId = userEntity.F_CompanyId;
  335. userInfo.departmentId = userEntity.F_DepartmentId;
  336. userInfo.openId = userEntity.F_OpenId;
  337. userInfo.isSystem = userEntity.F_SecurityLevel == 1 ? true : false;
  338. userInfo.Description = userEntity.F_Description;
  339. userInfo.roleIds = userRelationIBLL.GetObjectIds(userEntity.F_UserId, 1);
  340. if (!string.IsNullOrEmpty(userInfo.roleIds))
  341. {
  342. var rolelist = userRelationIBLL.GetRoleListByUserId(userEntity.F_UserId);
  343. foreach (var roleEntity in rolelist)
  344. {
  345. userInfo.roleName += roleEntity.F_FullName + ",";
  346. }
  347. }
  348. userInfo.postIds = userRelationIBLL.GetObjectIds(userEntity.F_UserId, 2);
  349. userInfo.companyIds = companyIBLL.GetSubNodes(userEntity.F_CompanyId);
  350. userInfo.departmentIds = departmentIBLL.GetSubNodes(userEntity.F_CompanyId, userEntity.F_DepartmentId);
  351. userInfo.loadTime = DateTime.Now;
  352. if (HttpContext.Current != null)
  353. {
  354. HttpContext.Current.Items.Add("LoginUserInfo", userInfo);
  355. }
  356. operatorResult.userInfo = userInfo;
  357. operatorResult.stateCode = 1;
  358. redisCache.Write<UserInfo>(cacheKeyInfo + operatorInfo.account, userInfo, CacheId.loginInfo);
  359. }
  360. else
  361. {
  362. operatorResult.stateCode = 0;
  363. }
  364. }
  365. else
  366. {
  367. userInfo.logTime = operatorInfo.logTime;
  368. if (HttpContext.Current != null)
  369. {
  370. HttpContext.Current.Items.Add("LoginUserInfo", userInfo);
  371. }
  372. operatorResult.userInfo = userInfo;
  373. operatorResult.stateCode = 1;
  374. }
  375. operatorResult.userInfo.token = operatorInfo.token;
  376. }
  377. }
  378. return operatorResult;
  379. }
  380. catch (Exception)
  381. {
  382. return operatorResult;
  383. }
  384. }
  385. #region 登录错误次数记录
  386. /// <summary>
  387. /// 获取当前登录错误次数
  388. /// </summary>
  389. /// <returns></returns>
  390. public int GetCurrentErrorNum()
  391. {
  392. int res = 0;
  393. try
  394. {
  395. string cookieMark = WebHelper.GetCookie(LoginUserMarkKey).ToString();
  396. if (string.IsNullOrEmpty(cookieMark))
  397. {
  398. cookieMark = Guid.NewGuid().ToString();
  399. WebHelper.WriteCookie(LoginUserMarkKey, cookieMark);
  400. }
  401. string num = redisCache.Read<string>(cacheKeyError + cookieMark, CacheId.loginInfo);
  402. if (!string.IsNullOrEmpty(num))
  403. {
  404. res = Convert.ToInt32(num);
  405. }
  406. }
  407. catch (Exception)
  408. {
  409. }
  410. return res;
  411. }
  412. /// <summary>
  413. /// 增加错误次数
  414. /// </summary>
  415. /// <returns></returns>
  416. public int AddCurrentErrorNum()
  417. {
  418. int res = 0;
  419. try
  420. {
  421. string cookieMark = WebHelper.GetCookie(LoginUserMarkKey).ToString();
  422. if (string.IsNullOrEmpty(cookieMark))
  423. {
  424. cookieMark = Guid.NewGuid().ToString();
  425. WebHelper.WriteCookie(LoginUserMarkKey, cookieMark);
  426. }
  427. string num = redisCache.Read<string>(cacheKeyError + cookieMark, CacheId.loginInfo);
  428. if (!string.IsNullOrEmpty(num))
  429. {
  430. res = Convert.ToInt32(num);
  431. }
  432. res++;
  433. num = res + "";
  434. redisCache.Write<string>(cacheKeyError + cookieMark, num, CacheId.loginInfo);
  435. }
  436. catch (Exception)
  437. {
  438. }
  439. return res;
  440. }
  441. /// <summary>
  442. /// 清除当前登录错误次数
  443. /// </summary>
  444. public void ClearCurrentErrorNum()
  445. {
  446. try
  447. {
  448. string cookieMark = WebHelper.GetCookie(LoginUserMarkKey).ToString();
  449. if (string.IsNullOrEmpty(cookieMark))
  450. {
  451. cookieMark = Guid.NewGuid().ToString();
  452. WebHelper.WriteCookie(LoginUserMarkKey, cookieMark);
  453. }
  454. redisCache.Remove(cacheKeyError + cookieMark, CacheId.loginInfo);
  455. }
  456. catch (Exception)
  457. {
  458. }
  459. }
  460. #endregion
  461. #region 写入操作日志
  462. /// <summary>
  463. /// 写操作日志
  464. /// </summary>
  465. public void WriteOperateLog(OperateLogModel operateLogModel)
  466. {
  467. try
  468. {
  469. if (operateLogModel.userInfo == null)
  470. {
  471. operateLogModel.userInfo = LoginUserInfo.Get();
  472. }
  473. LogEntity logEntity = new LogEntity();
  474. logEntity.F_CategoryId = 3;
  475. logEntity.F_OperateTypeId = ((int)operateLogModel.type).ToString();
  476. logEntity.F_OperateType = EnumAttribute.GetDescription(operateLogModel.type);
  477. logEntity.F_OperateAccount = operateLogModel.userInfo?.account + "(" + operateLogModel.userInfo.realName + ")";
  478. logEntity.F_OperateUserId = operateLogModel.userInfo?.userId;
  479. logEntity.F_Module = operateLogModel.title;
  480. logEntity.F_ExecuteResult = 1;
  481. logEntity.F_ExecuteResultJson = "访问地址:" + operateLogModel.url;
  482. logEntity.F_SourceObjectId = operateLogModel.sourceObjectId;
  483. logEntity.F_SourceContentJson = operateLogModel.sourceContentJson;
  484. logEntity.F_Description = "PC端";
  485. logEntity.WriteLog();
  486. }
  487. catch (Exception)
  488. {
  489. }
  490. }
  491. /// <summary>
  492. /// 写操作日志
  493. /// </summary>
  494. public void WriteOperateLog(OperateLogModel operateLogModel, string source)
  495. {
  496. try
  497. {
  498. if (operateLogModel.userInfo == null)
  499. {
  500. operateLogModel.userInfo = LoginUserInfo.Get();
  501. }
  502. LogEntity logEntity = new LogEntity();
  503. logEntity.F_CategoryId = 3;
  504. logEntity.F_OperateTypeId = ((int)operateLogModel.type).ToString();
  505. logEntity.F_OperateType = EnumAttribute.GetDescription(operateLogModel.type);
  506. logEntity.F_OperateAccount = operateLogModel.userInfo?.account + "(" + operateLogModel.userInfo.realName + ")";
  507. logEntity.F_OperateUserId = operateLogModel.userInfo.userId;
  508. logEntity.F_Module = operateLogModel.title;
  509. logEntity.F_ExecuteResult = 1;
  510. logEntity.F_ExecuteResultJson = "访问地址:" + operateLogModel.url;
  511. logEntity.F_SourceObjectId = operateLogModel.sourceObjectId;
  512. logEntity.F_SourceContentJson = operateLogModel.sourceContentJson;
  513. logEntity.F_Description = "PC端";
  514. logEntity.WriteLog();
  515. }
  516. catch (Exception)
  517. {
  518. }
  519. }
  520. #endregion
  521. }
  522. }