SysOnlineUserService.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using Microsoft.AspNetCore.SignalR;
  2. namespace Admin.NET.Core.Service;
  3. /// <summary>
  4. /// 系统在线用户服务
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 300)]
  7. public class SysOnlineUserService : IDynamicApiController, ITransient
  8. {
  9. private readonly SqlSugarRepository<SysOnlineUser> _sysOnlineUerRep;
  10. private readonly SysConfigService _sysConfigService;
  11. private readonly IHubContext<OnlineUserHub, IOnlineUserHub> _onlineUserHubContext;
  12. public SysOnlineUserService(SqlSugarRepository<SysOnlineUser> sysOnlineUerRep,
  13. SysConfigService sysConfigService,
  14. IHubContext<OnlineUserHub, IOnlineUserHub> onlineUserHubContext)
  15. {
  16. _sysOnlineUerRep = sysOnlineUerRep;
  17. _sysConfigService = sysConfigService;
  18. _onlineUserHubContext = onlineUserHubContext;
  19. }
  20. /// <summary>
  21. /// 获取在线用户分页列表
  22. /// </summary>
  23. /// <returns></returns>
  24. [ApiDescriptionSettings(Name = "Page")]
  25. [DisplayName("获取在线用户分页列表")]
  26. public async Task<SqlSugarPagedList<SysOnlineUser>> GetPage([FromQuery] PageOnlineUserInput input)
  27. {
  28. return await _sysOnlineUerRep.AsQueryable()
  29. .WhereIF(!string.IsNullOrWhiteSpace(input.UserName), u => u.UserName.Contains(input.UserName))
  30. .WhereIF(!string.IsNullOrWhiteSpace(input.RealName), u => u.RealName.Contains(input.RealName))
  31. .ToPagedListAsync(input.Page, input.PageSize);
  32. }
  33. /// <summary>
  34. /// 强制下线
  35. /// </summary>
  36. /// <param name="user"></param>
  37. /// <returns></returns>
  38. [NonValidation]
  39. [ApiDescriptionSettings(Name = "ForceOffline")]
  40. [DisplayName("强制下线")]
  41. public async Task ForceOffline(SysOnlineUser user)
  42. {
  43. await _onlineUserHubContext.Clients.Client(user.ConnectionId).ForceOffline("强制下线");
  44. await _sysOnlineUerRep.DeleteAsync(user);
  45. }
  46. /// <summary>
  47. /// 发布站内消息
  48. /// </summary>
  49. /// <param name="notice"></param>
  50. /// <param name="userIds"></param>
  51. /// <returns></returns>
  52. [ApiDescriptionSettings(false)]
  53. public async Task PublicNotice(SysNotice notice, List<long> userIds)
  54. {
  55. var userList = await _sysOnlineUerRep.GetListAsync(m => userIds.Contains(m.UserId));
  56. if (!userList.Any()) return;
  57. foreach (var item in userList)
  58. {
  59. await _onlineUserHubContext.Clients.Client(item.ConnectionId).PublicNotice(notice);
  60. }
  61. }
  62. /// <summary>
  63. /// 单用户登录
  64. /// </summary>
  65. /// <returns></returns>
  66. [ApiDescriptionSettings(false)]
  67. public async Task SignleLogin(long userId)
  68. {
  69. if (await _sysConfigService.GetConfigValue<bool>(CommonConst.SysSingleLogin))
  70. {
  71. var user = await _sysOnlineUerRep.GetFirstAsync(u => u.UserId == userId);
  72. if (user == null) return;
  73. await ForceOffline(user);
  74. }
  75. }
  76. }