using Infrastructure; using Infrastructure.Attribute; using Infrastructure.Extensions; using Infrastructure.Model; using Microsoft.AspNetCore.Mvc; using ZR.Model.Content.Dto; using ZR.Model.social; using ZR.Model.System; using ZR.Repository; using ZR.Service.Social.IService; namespace ZR.Service.Social { /// /// 粉丝 /// [AppService(ServiceType = typeof(ISocialFansService))] public class SocialFansService : BaseService, ISocialFansService, IDynamicApi { /// /// 查询关注/粉丝列表 /// /// /// [HttpGet] public ApiResult FollowList([FromQuery] FansQueryDto dto) { var userid = (int)HttpContextExtension.GetUId(App.HttpContext); PagedInfo list = dto.SelectType == 1 ? GetFollow(dto, userid) : GetFans(dto, userid); return ApiResult.Success(list); } /// /// 是否关注 /// /// /// public ApiResult IsFollow([FromQuery] int toUserid) { var userid = (int)HttpContextExtension.GetUId(App.HttpContext); if (userid == toUserid || toUserid <= 0) { return ApiResult.Success(""); } var isFollow = Any(f => f.Userid == userid && f.ToUserid == toUserid); return ApiResult.Success(isFollow); } /// /// 关注 /// /// /// [HttpPost] public ApiResult Follow([FromBody] SocialFansDto dto) { dto.Userid = (int)HttpContextExtension.GetUId(App.HttpContext); if (dto.Userid == dto.ToUserid) { throw new CustomException("不能关注自己"); }; if (dto.ToUserid <= 0) { return ApiResult.Error("关注失败"); } //TODO 判断用户是否存在 var isFollow = GetFirst(x => x.Userid == dto.Userid && x.ToUserid == dto.ToUserid); if (isFollow != null) { throw new CustomException("已关注"); } var fans = new SocialFans { Userid = dto.Userid, ToUserid = dto.ToUserid, FollowTime = DateTime.Now, UserIP = HttpContextExtension.GetClientUserIp(App.HttpContext) }; var result = UseTran2(() => { //添加粉丝 InsertReturnSnowflakeId(fans); UpdateFollowInfo(dto.Userid, isFollowNum: true); UpdateFollowInfo(dto.ToUserid, isFollowNum: false); }); if (!result) { return ApiResult.Error("关注失败"); } var data = Context.Queryable() .Where(x => x.Userid == dto.Userid) .First(); return ApiResult.Success("关注成功", data); } /// /// 取消关注 /// /// /// [HttpPost] public ApiResult CancelFollow([FromBody] SocialFansDto dto) { dto.Userid = (int)HttpContextExtension.GetUId(App.HttpContext); var result = UseTran(() => { //删除粉丝 Delete(f => f.Userid == dto.Userid && f.ToUserid == dto.ToUserid); Context.Updateable() .SetColumns(x => x.FollowNum == x.FollowNum - 1) .Where(x => x.Userid == dto.Userid) .ExecuteCommand(); Context.Updateable() .SetColumns(x => x.FansNum == x.FansNum - 1) .Where(x => x.Userid == dto.ToUserid) .ExecuteCommand(); }); if (!result.IsSuccess) { return ApiResult.Error("取消关注失败"); } var data = Context.Queryable() .Where(x => x.Userid == dto.Userid) .First(); return ApiResult.Success("取消关注成功", data); } private void UpdateFollowInfo(long userId, bool isFollowNum) { var count = Context.Updateable() .SetColumnsIF(isFollowNum, x => x.FollowNum == x.FollowNum + 1) .SetColumnsIF(!isFollowNum, x => x.FansNum == x.FansNum + 1) .Where(x => x.Userid == userId) .ExecuteCommand(); if (count > 0) return; Context.Insertable(new SocialFansInfo { Userid = userId, FollowNum = isFollowNum ? 1 : 0, FansNum = isFollowNum ? 0 : 1, UpdateTime = DateTime.Now }).ExecuteCommand(); } private PagedInfo GetFollow(FansQueryDto dto, int userid) { return Queryable() .LeftJoin((it, u) => it.ToUserid == u.UserId) .Where(it => it.Userid == userid) .Select((it, u) => new SocialFansDto() { User = new ArticleUser() { Avatar = u.Avatar, NickName = u.NickName, Sex = u.Sex, }, Status = 1, ToUserid = it.ToUserid, }) .ToPage(dto); } private PagedInfo GetFans(FansQueryDto dto, int userid) { return Queryable() .LeftJoin((it, u) => it.Userid == u.UserId) .Where(it => it.ToUserid == userid) .Select((it, u) => new SocialFansDto() { User = new ArticleUser() { Avatar = u.Avatar, NickName = u.NickName, Sex = u.Sex, }, Userid = it.Userid, }) .ToPage(dto); } } }