飞星
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

672 行
24 KiB

  1. using System.Collections.Generic;
  2. using Permission.Entity.System;
  3. using Permission.Service.IServices;
  4. using System.Linq;
  5. using Permission.Utils.Validate;
  6. using System;
  7. using System.IO;
  8. using AutoMapper;
  9. using Microsoft.AspNetCore.Hosting;
  10. using Microsoft.EntityFrameworkCore;
  11. using Permission.Infrastructure.Repositories;
  12. using Permission.Entity.DbContext;
  13. using Permission.Infrastructure.WebControls;
  14. using Permission.Service.DTO.ApiModels;
  15. using Permission.Utils.Converts;
  16. namespace Permission.Service.Services
  17. {
  18. public class SysUserService : ISysUserService
  19. {
  20. private readonly IUnitOfWork _unitOfWork;
  21. private readonly PermissionContext _dbContext;
  22. private readonly IHostingEnvironment _env;
  23. private readonly IMapper _mapper;
  24. private readonly IBaseRepository<SysUser> _sysUserRepository;
  25. private readonly IBaseRepository<SysRole> _sysRoleRepository;
  26. private readonly IBaseRepository<SysMenu> _sysMenuRepository;
  27. private readonly ISysRoleService _sysRoleService;
  28. private readonly ISysOrganizeService _sysOrganizeService;
  29. public SysUserService(IUnitOfWork unitOfWork, PermissionContext dbContext, IHostingEnvironment env,IMapper mapper, IBaseRepository<SysUser> sysUserRepository, IBaseRepository<SysRole> sysRoleRepository, IBaseRepository<SysMenu> sysMenuRepository, ISysRoleService sysRoleService, ISysOrganizeService sysOrganizeService)
  30. {
  31. this._unitOfWork = unitOfWork;
  32. this._dbContext = dbContext;
  33. this._env = env;
  34. this._mapper = mapper;
  35. this._sysUserRepository = sysUserRepository;
  36. this._sysRoleRepository = sysRoleRepository;
  37. this._sysMenuRepository = sysMenuRepository;
  38. this._sysRoleService = sysRoleService;
  39. this._sysOrganizeService = sysOrganizeService;
  40. }
  41. public bool AddModel(SysUser model)
  42. {
  43. try
  44. {
  45. model.GuidId = Guid.NewGuid().ToString();
  46. string defaultpass = "123456";
  47. model.Password = defaultpass.ToMd5();
  48. model.IsEnabled = model.IsEnabled != null;
  49. model.DeleteMark = false;
  50. model.CreateTime = DateTime.Now;
  51. var res = _sysUserRepository.Save(model);
  52. return res;
  53. }
  54. catch (Exception ex)
  55. {
  56. throw ex;
  57. }
  58. }
  59. public bool ModifyModel(SysUser model)
  60. {
  61. try
  62. {
  63. var user = _sysUserRepository.Get(model.Id);
  64. user.RealName = model.RealName;
  65. user.NickName = model.NickName;
  66. user.Birthday = model.Birthday;
  67. user.Gender = model.Gender;
  68. user.Email = model.Email;
  69. user.OrganizeId = model.OrganizeId;
  70. user.DepartmentId = model.DepartmentId;
  71. user.DutyName = model.DutyName;
  72. user.MobilePhone = model.MobilePhone;
  73. user.QQ = model.QQ;
  74. user.WeChat = model.WeChat;
  75. user.MSN = model.MSN;
  76. user.IsEnabled = model.IsEnabled;
  77. user.Address = model.Address;
  78. user.Signature = model.Signature;
  79. user.ModifyTime = DateTime.Now;
  80. user.ModifyUser = model.ModifyUser;
  81. user.Remark = model.Remark;
  82. var res = _sysUserRepository.Update(user);
  83. return res;
  84. }
  85. catch (Exception ex)
  86. {
  87. throw ex;
  88. }
  89. }
  90. public bool ModifyPass(SysUser model)
  91. {
  92. try
  93. {
  94. var user = _sysUserRepository.Get(model.Id);
  95. user.Password = model.Password;
  96. var res = _sysUserRepository.Update(user);
  97. return res;
  98. }
  99. catch (Exception ex)
  100. {
  101. throw ex;
  102. }
  103. }
  104. public void SetUserRoles(int userId, params int[] roleIds)
  105. {
  106. try
  107. {
  108. var current = _customerById(_dbContext, userId);
  109. if (roleIds == null)
  110. {
  111. //清空当前用户下所有角色
  112. //current.UserRoleList.Clear();
  113. current.UserRoles.Clear();
  114. }
  115. else
  116. {
  117. //a.用户需要重新设置的权限ID集合。
  118. var newRoleIdList = roleIds.ToList();
  119. var newRoleList = _sysRoleRepository.LoadAll(m => newRoleIdList.Contains(m.Id) && m.IsEnabled == true && m.DeleteMark == false).ToList();
  120. //b.清空当前用户下所有角色
  121. //current.UserAuthorizeList.Clear();
  122. current.UserRoles.Clear();
  123. //c.新集合中剩下的角色信息新增到数据库。
  124. UserRole model;
  125. newRoleList.ForEach((role) =>
  126. {
  127. model = new UserRole
  128. {
  129. GuidId = Guid.NewGuid().ToString(),
  130. UserId = userId,
  131. RoleId = role.Id,
  132. SortCode = role.SortCode,
  133. CreateTime = DateTime.Now
  134. //CreateUser = "",
  135. };
  136. //current.UserRoleList.Add(model);
  137. current.UserRoles.Add(model);
  138. });
  139. }
  140. _unitOfWork.SaveChanges();
  141. }
  142. catch (Exception ex)
  143. {
  144. throw ex;
  145. }
  146. }
  147. public SysUser GetUserByAccount(string account)
  148. {
  149. try
  150. {
  151. if (!account.IsEmpty())
  152. {
  153. var data = _sysUserRepository.Get(m => m.Account == account);
  154. return data;
  155. }
  156. return null;
  157. }
  158. catch (Exception e)
  159. {
  160. throw e;
  161. }
  162. }
  163. public SysUser GetUserByMobile(string mobile)
  164. {
  165. try
  166. {
  167. if (!mobile.IsEmpty())
  168. {
  169. var data = _sysUserRepository.Get(m => m.MobilePhone == mobile);
  170. return data;
  171. }
  172. return null;
  173. }
  174. catch (Exception e)
  175. {
  176. throw e;
  177. }
  178. }
  179. public SysUser GetUserByAccountOrMobile(string loginName)
  180. {
  181. try
  182. {
  183. if (!loginName.IsEmpty())
  184. {
  185. var data = _sysUserRepository.Get(m => m.MobilePhone == loginName || m.Account == loginName);
  186. return data;
  187. }
  188. return null;
  189. }
  190. catch (Exception e)
  191. {
  192. throw e;
  193. }
  194. }
  195. public SysUser GetUserByKey(int key)
  196. {
  197. try
  198. {
  199. if (!key.IsEmpty() || key > 0)
  200. {
  201. var data = _customerById(_dbContext, key);
  202. return data;
  203. }
  204. return null;
  205. }
  206. catch (Exception e)
  207. {
  208. throw e;
  209. }
  210. }
  211. public SysUser GetUserOrgByKey(int key)
  212. {
  213. try
  214. {
  215. if (!key.IsEmpty() || key > 0)
  216. {
  217. var data = _customerOrgById(_dbContext, key);
  218. return data;
  219. }
  220. return null;
  221. }
  222. catch (Exception e)
  223. {
  224. throw e;
  225. }
  226. }
  227. public List<SysMenu> UserLoginPermissions(int userId)
  228. {
  229. List<int> currentmenuids = new List<int>();
  230. if (userId.IsEmpty() || userId <= 0)
  231. {
  232. return null;
  233. }
  234. else
  235. {
  236. //原先方式
  237. //var current = _sysUserRepository.Entities.Include("UserRoleList").Include("UserAuthorizeList").Where(u => u.Id == userId && u.IsEnabled == true && u.DeleteMark == false).FirstOrDefault();
  238. //获取当前用户信息
  239. var current = _customerById(_dbContext, userId);
  240. //获取登陆用户角色信息
  241. //var rids = current.UserRoleList.Select(ur => ur.RoleId);
  242. var rids = current.UserRoles.Select(ur => ur.RoleId);
  243. //获取角色拥有的权限信息
  244. foreach (var rid in rids)
  245. {
  246. var menus = _sysRoleService.GetMenuIdListByRoleId(rid);
  247. currentmenuids.AddRange(menus);
  248. }
  249. //获取登陆用户权限信息
  250. //var userpermissids = current.UserAuthorizeList.Select(ua => ua.MenuId).ToList();
  251. var userpermissids = current.UserAuthorizes.Select(ua => ua.MenuId).ToList();
  252. currentmenuids.AddRange(userpermissids);
  253. var resmenuids = currentmenuids.Distinct();
  254. var data =
  255. _sysMenuRepository.LoadAll(m => resmenuids.Contains(m.Id) && m.IsEnable == true && m.DeleteMark == false)
  256. .OrderBy(ms => ms.SortCode)
  257. .ToList();
  258. return data;
  259. }
  260. }
  261. public Page<SysUser> PageList(string keyword, int pageindex, int pagesize)
  262. {
  263. try
  264. {
  265. //if (keyword.IsEmpty())
  266. //{
  267. // var data = _sysUserRepository.PageList<DateTime>(pageindex, pagesize, u => u.DeleteMark == false, us => us.CreateTime.Value, false);
  268. // return data;
  269. //}
  270. //else
  271. //{
  272. // var data = _sysUserRepository.PageList<DateTime>(pageindex, pagesize, u => (u.Account.Contains(keyword) || u.RealName.Contains(keyword)) && u.DeleteMark == false, us => us.CreateTime.Value, false);
  273. // return data;
  274. //}
  275. int total = 0;
  276. if (keyword.IsEmpty())
  277. {
  278. var data = _sysUserRepository.PageList(pageindex, pagesize, us => us.OrderBy(ur => ur.CreateTime),
  279. u => _customerOrgById(_dbContext, u.Id),
  280. out total,
  281. u => u.DeleteMark == false);
  282. return data;
  283. }
  284. else
  285. {
  286. var data = _sysUserRepository.PageList(pageindex, pagesize, us => us.OrderBy(ur => ur.CreateTime), u => _customerOrgById(_dbContext, u.Id),
  287. out total,
  288. u => (u.Account.Contains(keyword) || u.RealName.Contains(keyword)) && u.DeleteMark == false);
  289. return data;
  290. }
  291. }
  292. catch (Exception e)
  293. {
  294. throw e;
  295. }
  296. }
  297. public List<int> GetMenuIdListByUserId(int userId)
  298. {
  299. var data =
  300. _customerById(_dbContext, userId)
  301. .UserAuthorizes.Where(m => m.UserId == userId)
  302. .Select(m => m.MenuId)
  303. .ToList();
  304. return data;
  305. }
  306. public void SetUserAuthorize(int userId, params int[] menuIds)
  307. {
  308. var currentUser = _customerById(_dbContext, userId);
  309. if (menuIds == null)
  310. {
  311. //清空当前用户下所有权限
  312. currentUser.UserAuthorizes.Clear();
  313. }
  314. else
  315. {
  316. //a.角色需要重新设置的权限ID集合。
  317. var newMenuIdList = menuIds.ToList();
  318. var newMenuList = _sysMenuRepository.LoadAll(m => newMenuIdList.Contains(m.Id) && m.IsEnable == true && m.DeleteMark == false).ToList();
  319. //c.清空当前角色下所有权限
  320. currentUser.UserAuthorizes.Clear();
  321. //d.新集合中剩下的授权信息新增到数据库。
  322. UserAuthorize model;
  323. newMenuList.ForEach((menu) =>
  324. {
  325. model = new UserAuthorize
  326. {
  327. GuidId = Guid.NewGuid().ToString(),
  328. UserId = userId,
  329. MenuId = menu.Id,
  330. SortCode = menu.SortCode,
  331. CreateTime = DateTime.Now
  332. //CreateUser = "",
  333. };
  334. currentUser.UserAuthorizes.Add(model);
  335. });
  336. }
  337. _unitOfWork.SaveChanges();
  338. }
  339. public bool UpdateUsersOpenId(int userId, string openId)
  340. {
  341. try
  342. {
  343. if (!userId.IsEmpty() || userId > 0)
  344. {
  345. var model = _sysUserRepository.Get(userId);
  346. model.Secretkey = openId;
  347. return _sysUserRepository.Update(model);
  348. }
  349. else
  350. {
  351. return false;
  352. }
  353. }
  354. catch (Exception ex)
  355. {
  356. throw ex;
  357. }
  358. }
  359. public List<SysOrganize> GetGroupDepsByOrgId(int userId, int orgId)
  360. {
  361. List<SysOrganize> organizes = new List<SysOrganize>();
  362. try
  363. {
  364. if (!userId.IsEmpty() || userId > 0)
  365. {
  366. var user = _customerOrgById(_dbContext, userId);
  367. if (!orgId.IsEmpty() || orgId > 0)
  368. {
  369. if (user.Department != null)
  370. {
  371. var userdep = user.Department;
  372. organizes.Add(userdep);
  373. }
  374. return organizes;
  375. }
  376. else
  377. {
  378. return null;
  379. }
  380. }
  381. else
  382. {
  383. return null;
  384. }
  385. }
  386. catch (Exception ex)
  387. {
  388. throw ex;
  389. }
  390. }
  391. #region 私有方法
  392. private static Func<PermissionContext, int, SysUser> _customerById =
  393. EF.CompileQuery((PermissionContext db, int userId) => db.SysUsers
  394. .Include(u => u.UserRoles)
  395. .Include(u => u.UserAuthorizes)
  396. .FirstOrDefault(c => c.Id == userId));
  397. private static Func<PermissionContext, int, SysUser> _customerOrgById =
  398. EF.CompileQuery((PermissionContext db, int userId) => db.SysUsers
  399. .Include(u => u.Organize)
  400. .Include(u => u.Department)
  401. .FirstOrDefault(c => c.Id == userId));
  402. #endregion
  403. #region api
  404. public bool UpdateUserModelApi(UserModel userModel)
  405. {
  406. try
  407. {
  408. var model = _mapper.Map<SysUser>(userModel);
  409. if (userModel.HeadBytes != null)
  410. {
  411. var headcontent = StringBase64.Base64Formart(userModel.HeadBytes);
  412. if (!headcontent.IsEmpty())
  413. {
  414. var headBytes = Convert.FromBase64String(headcontent);
  415. var webRootInfo = _env.WebRootPath;
  416. var basePath = System.IO.Path.Combine(webRootInfo, "HeadImgs");
  417. if (!Directory.Exists(basePath))
  418. {
  419. Directory.CreateDirectory(basePath);
  420. }
  421. var imgPath = Path.Combine(basePath, userModel.UserId + ".jpg");
  422. var fs = new FileStream(imgPath, FileMode.Create, FileAccess.Write);
  423. var bw = new BinaryWriter(fs);
  424. bw.Write(headBytes);
  425. bw.Close();
  426. fs.Close();
  427. model.HeadIcon = "/HeadImgs/" + userModel.UserId + ".jpg";
  428. }
  429. }
  430. if (!string.IsNullOrEmpty(model.HeadIcon))
  431. {
  432. model.HeadIcon = "/HeadImgs/" + userModel.UserId + ".jpg";
  433. }
  434. var res = this.ModifyModel(model);
  435. return res;
  436. }
  437. catch (Exception ex)
  438. {
  439. throw ex;
  440. }
  441. }
  442. public UserModel GetUsersByIdApi(string userId)
  443. {
  444. try
  445. {
  446. if (!userId.IsEmpty())
  447. {
  448. var user = _customerOrgById(_dbContext, int.Parse(userId));
  449. var data = _mapper.Map<UserModel>(user);
  450. return data;
  451. }
  452. else
  453. {
  454. return null;
  455. }
  456. }
  457. catch (Exception ex)
  458. {
  459. throw ex;
  460. }
  461. }
  462. public bool CheckLoginApi(string loginname, string loginpass, out string msg, out UserModel userModel)
  463. {
  464. bool flag = false;
  465. if (loginname.IsEmpty() || loginpass.IsEmpty())
  466. {
  467. userModel = null;
  468. msg = "请求失败,缺少必要参数。";
  469. flag = false;
  470. }
  471. var usermodel = this.GetUserByAccountOrMobile(loginname);
  472. if (usermodel == null)
  473. {
  474. //SysLogger.Info(2, loginModel.Account, HttpContext.GetOperIp(), "登陆失败!该账户不存在,请重新输入。");
  475. userModel = null;
  476. msg = "该账户不存在,请重新输入。";
  477. flag = false;
  478. }
  479. if (usermodel.IsEnabled != true)
  480. {
  481. //SysLogger.Info(2, loginModel.Account, HttpContext.GetOperIp(), "登陆失败!该账户已被禁用,请联系管理员。");
  482. userModel = null;
  483. msg = "该账户已被禁用,请联系管理员。";
  484. flag = false;
  485. }
  486. string pass = loginpass.ToMd5();
  487. if (!usermodel.Password.Equals(pass))
  488. {
  489. //LogHelper.Write(Level.Info, "系统登录", "密码错误", userEntity.Account, userEntity.RealName);
  490. //SysLogger.Info(2, loginModel.Account, HttpContext.GetOperIp(), "登陆失败!密码错误,请重新输入。");
  491. userModel = null;
  492. msg = "密码错误,请重新输入。";
  493. flag = false;
  494. }
  495. else
  496. {
  497. var loginuser = _customerOrgById(_dbContext, usermodel.Id);
  498. var model = _mapper.Map<UserModel>(loginuser);
  499. string openId = string.Empty;
  500. if (model.Secretkey.IsEmpty())
  501. {
  502. string newOpenId = Guid.NewGuid().ToString() + DateTime.Now.ToString("yyyyMMddhhmmss");
  503. //更新至数据库
  504. bool addopen = this.UpdateUsersOpenId(model.UserId, newOpenId);
  505. if (addopen)
  506. {
  507. openId = newOpenId;
  508. }
  509. else
  510. {
  511. openId = "";
  512. }
  513. }
  514. else
  515. {
  516. openId = model.Secretkey;
  517. }
  518. model.Secretkey = openId;
  519. flag = true;
  520. msg = "登陆成功!";
  521. userModel = model;
  522. }
  523. return flag;
  524. }
  525. public IEnumerable<DepUserModel> GetUsersByOrgIdApi(int orgId)
  526. {
  527. List<DepUserModel> data = null;
  528. try
  529. {
  530. if (orgId.IsEmpty())
  531. {
  532. return null;
  533. }
  534. else
  535. {
  536. //获取机构下部门列表
  537. var deps = _sysOrganizeService.GetDepsByOrgId(orgId);
  538. data = new List<DepUserModel>();
  539. if (deps.Any())
  540. {
  541. foreach (var dep in deps)
  542. {
  543. var users = _sysOrganizeService.GetUsersByOrgId(dep.Id).ToList();
  544. if (users.Any())
  545. {
  546. var depUser = new DepUserModel
  547. {
  548. OrgId = orgId,
  549. DepId = dep.Id,
  550. DepName = dep.FullName,
  551. SortCode = dep.SortCode,
  552. Status = dep.IsEnabled == true ? 1 : 0,
  553. CreateTime = dep.CreateTime,
  554. CreateName = dep.CreateUser,
  555. Description = dep.Remark,
  556. UserModels = _mapper.Map<List<UserModel>>(users)
  557. };
  558. data.Add(depUser);
  559. }
  560. }
  561. return data;
  562. }
  563. else
  564. {
  565. return null;
  566. }
  567. }
  568. }
  569. catch (Exception ex)
  570. {
  571. throw ex;
  572. }
  573. }
  574. public IEnumerable<DepUserModel> GetGroupUsersByOrgIdApi(int userId, int orgId)
  575. {
  576. List<DepUserModel> data = null;
  577. try
  578. {
  579. if (orgId.IsEmpty() || userId.IsEmpty())
  580. {
  581. return null;
  582. }
  583. else
  584. {
  585. //获取机构下部门列表
  586. var deps = this.GetGroupDepsByOrgId(userId, orgId);
  587. data = new List<DepUserModel>();
  588. if (deps.Any())
  589. {
  590. foreach (var dep in deps)
  591. {
  592. var users = _sysOrganizeService.GetUsersByOrgId(dep.Id).ToList();
  593. if (users.Any())
  594. {
  595. var depUser = new DepUserModel
  596. {
  597. OrgId = orgId,
  598. DepId = dep.Id,
  599. DepName = dep.FullName,
  600. SortCode = dep.SortCode,
  601. Status = dep.IsEnabled == true ? 1 : 0,
  602. CreateTime = dep.CreateTime,
  603. CreateName = dep.CreateUser,
  604. Description = dep.Remark,
  605. UserModels = _mapper.Map<List<UserModel>>(users)
  606. };
  607. data.Add(depUser);
  608. }
  609. }
  610. return data;
  611. }
  612. else
  613. {
  614. return null;
  615. }
  616. }
  617. }
  618. catch (Exception ex)
  619. {
  620. throw ex;
  621. }
  622. }
  623. #endregion
  624. }
  625. }