Exemplo n.º 1
0
        public async Task <Resp> GetDetail()
        {
            using var db = new MyForContext();

            DB.Tables.Segment segment = await db.Segments.AsNoTracking()
                                        .FirstOrDefaultAsync(s => s.Id == Id);

            if (segment is null)
            {
                return(Resp.Fault(Resp.NONE, NONE_SEGMENT));
            }

            Results.SegmentDetail detail = new Results.SegmentDetail
            {
                Content    = segment.Content,
                Creator    = Clients.Client.GetName(segment.CreateById),
                CreateDate = segment.CreateDate.ToStandardString(),
                State      = new Share.KeyValue
                {
                    Key   = segment.State,
                    Value = ((SegmentState)segment.State).GetDescription()
                }
            };
            return(Resp.Success(detail, ""));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 修改答案
        /// </summary>
        public async Task <Resp> ModifyAsync(string content)
        {
            if (string.IsNullOrWhiteSpace(content))
            {
                return(Resp.Fault(Resp.NONE, "答案不能为空"));
            }

            await using var db = new YGBContext();

            var answer = await db.Answers.FirstOrDefaultAsync(a => a.Id == Id);

            if (answer is null)
            {
                return(Resp.Fault(Resp.NONE, "该答案不存在"));
            }

            if (answer.Content == content)
            {
                return(Resp.Fault(Resp.NONE, "您还没有进行修改"));
            }
            answer.Content = content;
            int changeCount = await db.SaveChangesAsync();

            if (changeCount == 1)
            {
                return(Resp.Success());
            }
            return(Resp.Fault(Resp.NONE, "修改失败"));
        }
Exemplo n.º 3
0
        /// <summary>
        /// 通过一个答案
        /// </summary>
        /// <returns></returns>
        public async Task <Resp> EnabledAsync()
        {
            using var db = new YGBContext();
            DB.Tables.Answer answer = await db.Answers.FirstOrDefaultAsync(a => a.Id == Id);

            if (answer is null)
            {
                return(Resp.Fault(Resp.NONE, NOT_EXIST_ANSWER));
            }

            int    stateId     = (int)Answer.StandardStates.Enabled;
            string description = Answer.StandardStates.Enabled.GetDescription();

            if (answer.State == stateId)
            {
                return(Resp.Fault(Resp.NONE, $"已经是{description}的状态,不能再次{description}"));
            }

            answer.State = stateId;
            int changeCount = await db.SaveChangesAsync();

            if (changeCount == 1)
            {
                return(Resp.Success(Resp.NONE, $"{description}成功"));
            }
            return(Resp.Fault(Resp.NONE, $"{description}失败"));
        }
Exemplo n.º 4
0
        /// <summary>
        /// 修改完答案后提交去审核
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        public async Task <Resp> ToAudit(string content)
        {
            using YGBContext db = new YGBContext();

            DB.Tables.Answer answer = await db.Answers.FirstOrDefaultAsync(a => a.Id == Id);

            if (answer is null)
            {
                return(Resp.Fault(Resp.NONE, NOT_EXIST_ANSWER));
            }

            if (answer.Content == content)
            {
                return(Resp.Fault(Resp.NONE, "内容未修改"));
            }

            answer.Content = content;
            answer.State   = (int)AnswerState.ToAudit;
            int changeCount = await db.SaveChangesAsync();

            if (changeCount == 1)
            {
                return(Resp.Success(Resp.NONE, "提交成功,待审核"));
            }
            return(Resp.Success(Resp.NONE, "提交失败,请重试"));
        }
Exemplo n.º 5
0
        /// <summary>
        /// 修改密码
        /// </summary>
        /// <param name="newPassword">经过加密的新密码</param>
        /// <returns></returns>
        public async Task <Resp> ChangePasswordAsync(Models.ChangePassword model)
        {
            (bool isValid, string msg) = model.IsValid();
            if (!isValid)
            {
                return(Resp.Fault(Resp.NONE, msg));
            }

            using var db = new YGBContext();
            DB.Tables.User user = await db.Users.FirstOrDefaultAsync(u => u.Id == Id);

            if (user is null)
            {
                return(Resp.NeedLogin(Resp.NONE, "请重新登录"));
            }
            if (!user.Password.Equals(model.OldPassword, StringComparison.OrdinalIgnoreCase))
            {
                return(Resp.Fault(Resp.NONE, "旧密码有误"));
            }
            if (user.Password.Equals(model.NewPassword, StringComparison.OrdinalIgnoreCase))
            {
                return(Resp.Fault(Resp.NONE, "新密码不能和旧密码相同"));
            }
            user.Password = model.NewPassword;
            int changeCount = await db.SaveChangesAsync();

            if (changeCount == 1)
            {
                return(Resp.Success(Resp.NONE));
            }
            return(Resp.Fault(Resp.NONE, "修改失败"));
        }
Exemplo n.º 6
0
        public async Task <Resp> Login(Models.Login_Info info)
        {
            (bool isValid, string msg) = info.IsValid();
            if (!isValid)
            {
                return(Resp.Fault(Resp.NONE, msg));
            }

            using var db = new MyForContext();

            DB.Tables.Client client = await db.Clients
                                      .Where(c => c.AccountName == info.Account && c.Password == info.Password)
                                      .FirstOrDefaultAsync();

            if (client is null)
            {
                return(Resp.Fault(Resp.NONE, "账号不存在后密码错误"));
            }

            client.Token = Guid.NewGuid();
            int suc = await db.SaveChangesAsync();

            if (suc != 1)
            {
                return(Resp.Fault(Resp.NONE, "登录失败"));
            }

            Results.Login_Result result = new Results.Login_Result
            {
                Id      = client.Id,
                Token   = client.Token,
                Account = client.AccountName
            };
            return(Resp.Success(result));
        }
Exemplo n.º 7
0
        /// <summary>
        /// 忽略举报
        /// </summary>
        /// <returns></returns>
        public async Task <Resp> IgnoreAsync()
        {
            /*
             * 清除所有举报记录
             * 不改变提问状态
             */

            await using var db = new YGBContext();

            List <DB.Tables.QuestionReportRecord> list = await db.QuestionReportRecords.AsNoTracking()
                                                         .Where(qr => qr.QuestionId == _id)
                                                         .ToListAsync();

            if (list.Count == 0)
            {
                return(Resp.Success());
            }

            list.ForEach(qr => qr.IsHandled = true);
            db.QuestionReportRecords.UpdateRange(list);
            int changeCount = await db.SaveChangesAsync();

            if (changeCount == list.Count)
            {
                return(Resp.Success());
            }
            return(Resp.Fault(Resp.NONE, "忽略失败"));
        }
Exemplo n.º 8
0
        /// <summary>
        /// 提一个问题,会返回新提问的 ID
        /// </summary>
        public async Task <Resp> AskQuestion(Models.PostQuestion questionParams)
        {
            (bool isValid, string msg) = questionParams.IsValid();
            if (!isValid)
            {
                return(Resp.Fault(Resp.NONE, msg));
            }

            DB.Tables.Question question = new DB.Tables.Question
            {
                Title       = questionParams.Title,
                Description = questionParams.Description,
                Tags        = string.Join(',', questionParams.Tags),
                State       = (int)Question.QuestionState.Enabled,
                AskerId     = questionParams.UserId
            };

            if (questionParams.Tags.Length >= 0)
            {
                await new Tags.Hub().AddTagsAsync(questionParams.Tags);
            }

            await using YGBContext db = new YGBContext();

            db.Add(question);
            if (await db.SaveChangesAsync() != 0)
            {
                return(Resp.Success(question.Id, ""));
            }

            return(Resp.Fault(Resp.NONE, "提交失败"));
        }
Exemplo n.º 9
0
        public async Task <Resp> NewCommentsAsync(Models.NewCommentInfo info)
        {
            (bool isValid, string msg) = info.IsValid();
            if (!isValid)
            {
                return(Resp.Fault(Resp.NONE, msg));
            }

            List <File> files = await File.SaveImagesAsync(info.Images, 100, 100);

            DB.Tables.Comment newComment = new DB.Tables.Comment
            {
                PostId     = info.PostId,
                CreateDate = DateTimeOffset.Now,
                Creator    = info.NickName,
                Content    = info.Content,
                Images     = string.Join(", ", files.Select(f => f.Id))
            };

            using var db = new DB.DarkContext();
            db.Comments.Add(newComment);
            int suc = await db.SaveChangesAsync();

            if (suc == 1)
            {
                return(Resp.Fault(Resp.NONE, "成功"));
            }
            return(Resp.Fault(Resp.NONE, "提交失败"));
        }
Exemplo n.º 10
0
 public Resp IsLogged()
 {
     if (CurrentAccount.IsEmpty())
     {
         return(Resp.Fault());
     }
     return(Resp.Success(Resp.NONE));
 }
Exemplo n.º 11
0
 public IActionResult IsLogged()
 {
     if (!CurrentUser.IsEmpty())
     {
         return(Pack(Resp.Success()));
     }
     return(Pack(Resp.Fault()));
 }
Exemplo n.º 12
0
        /// <summary>
        /// 删除一个答案
        /// </summary>
        /// <param name="id"></param>
        /// <param name="deep">是否深删除</param>
        /// <returns></returns>
        public async Task <Resp> DeleteQuestionAsync(int id, bool deep = false)
        {
            await using var db = new YGBContext();
            var question = await db.Questions.FirstOrDefaultAsync(q => q.Id == id);

            if (question is null)
            {
                return(Resp.Fault(Resp.NONE, "该问题不存在"));
            }

            if (deep)
            {
                List <DB.Tables.Answer> answers = await db.Answers.AsNoTracking().Where(a => a.QuestionId == id).ToListAsync();

                List <int> answersId   = answers.Select(a => a.Id).ToList();
                var        backRecords = await db.AnswerBackRecords.AsNoTracking().Where(a => answersId.Contains(a.AnswerId)).ToListAsync();

                var reportRecords = await db.AnswerReportRecords.AsNoTracking().Where(a => answersId.Contains(a.AnswerId)).ToListAsync();

                var comments = await db.AnswerComments.AsNoTracking().Where(a => answersId.Contains(a.AnswerId)).ToListAsync();

                db.AnswerBackRecords.RemoveRange(backRecords);
                db.AnswerComments.RemoveRange(comments);
                db.AnswerReportRecords.RemoveRange(reportRecords);
                db.Answers.RemoveRange(answers);

                var backQuestion = await db.QuestionBackRecords.AsNoTracking().Where(q => q.QuestionId == id).ToListAsync();

                var reportQuestion = await db.QuestionReportRecords.AsNoTracking().Where(q => q.QuestionId == id).ToListAsync();

                var commentQuestion = await db.QuestionComments.AsNoTracking().Where(q => q.QuestionId == id).ToListAsync();

                db.QuestionComments.RemoveRange(commentQuestion);
                db.QuestionBackRecords.RemoveRange(backQuestion);
                db.QuestionReportRecords.RemoveRange(reportQuestion);
                db.Questions.Remove(question);

                int changeCount = await db.SaveChangesAsync();

                int count = answers.Count + 1 + backRecords.Count + reportRecords.Count + comments.Count + backQuestion.Count + reportQuestion.Count + commentQuestion.Count;
                if (changeCount == count)
                {
                    return(Resp.Success());
                }
            }
            else
            {
                question.State = (int)Question.QuestionState.Remove;
                int changeCount = await db.SaveChangesAsync();

                if (changeCount == 1)
                {
                    return(Resp.Success(Resp.NONE));
                }
            }

            return(Resp.Fault(Resp.NONE, "删除失败"));
        }
Exemplo n.º 13
0
        public async Task <Resp> DisabledAsync()
        {
            string msg = await ModifyState(UserState.Disabled);

            if (string.IsNullOrWhiteSpace(msg))
            {
                return(Resp.Success(Resp.NONE));
            }
            return(Resp.Fault(Resp.NONE, msg));
        }
Exemplo n.º 14
0
        /// <summary>
        /// クライアントホームページの回答リストを取得する
        /// </summary>
        public override async Task <Resp> GetListAsync(Paginator pager)
        {
            /*
             *
             */

            if (!int.TryParse(pager["userId"], out int userId))
            {
                return(Resp.Fault(Resp.NONE, "用户参数有误"));
            }
            if (!int.TryParse(pager["currentUserId"], out int currentUserId))
            {
                return(Resp.Fault(Resp.NONE, "登录用户有有误"));
            }
            string questionTitle = pager["questionTitle"] ?? "";

            Expression <Func <DB.Tables.Answer, bool> > whereStatement = a => a.AnswererId == userId && a.State != (int)Answer.AnswerState.Remove;

            bool isSelf = userId == currentUserId;

            //
            if (!isSelf)
            {
                whereStatement = whereStatement.And(a => a.State == (int)Answer.AnswerState.Enabled);
            }

            if (!string.IsNullOrWhiteSpace(questionTitle))
            {
                whereStatement = whereStatement.And(a => a.Question.Title.Contains(questionTitle, StringComparison.OrdinalIgnoreCase));
            }

            await using var db = new YGBContext();

            pager.TotalRows = await db.Answers.CountAsync(whereStatement);

            pager.List = await db.Answers.AsNoTracking()
                         .Where(whereStatement)
                         .Include(a => a.Question)
                         .OrderByDescending(a => a.CreateDate)
                         .Skip(pager.Skip)
                         .Take(pager.Size)
                         .Select(a => new Results.AnswerItem_UserPage
            {
                Id            = a.Id,
                QuestionId    = a.QuestionId,
                QuestionTitle = a.Question.Title,
                AnswerContent = a.Content.Overflow(50),
                State         = Share.KeyValue <int, string> .Create(a.State, a.State.GetDescription <Answer.AnswerState>()),
                CreateDate    = a.CreateDate.ToStandardDateString(),
                IsSelf        = isSelf
            })
                         .ToListAsync();

            return(Resp.Success(pager));
        }
Exemplo n.º 15
0
        /// <summary>
        /// 获取当前帖子的详情
        /// </summary>
        /// <returns></returns>
        public async Task <Resp> GetDetail()
        {
            if (IsEmpty())
            {
                return(Resp.Fault(Resp.NONE, NONE_POST));
            }

            using var db = new MyForContext();
            DB.Tables.Post post = await db.Posts.AsNoTracking()
                                  .Include(p => p.Theme)
                                  //.Include(p => p.Comments)
                                  .FirstOrDefaultAsync(p => p.Id == Id);

            if (post is null)
            {
                return(Resp.Fault(Resp.NONE, NONE_POST));
            }

            Results.PostDetail detail = new Results.PostDetail
            {
                Title   = post.Title,
                Theme   = post.Theme.Name,
                Content = post.Content,
                Likes   = post.Likes,
                State   = new Share.KeyValue
                {
                    Key   = post.State,
                    Value = ((PostState)post.State).GetDescription()
                },
                Creator    = Clients.Client.GetName(post.CreateById),
                CreateDate = post.CreateDate.ToStandardString(),
                //Comments = post.Comments.Select(c => new Results.Comment
                //{
                //    Id = c.Id,
                //    NickName = Clients.Client.GetName(c.CreateById),
                //    Date = c.CreateDate.ToStandardString(),
                //    CommentContent = c.Comment
                //}).ToList()
            };

            List <Results.Comment> comments = await db.PostComments.AsNoTracking()
                                              .Where(c => c.PostId == Id)
                                              .Take(10)
                                              .Select(c => new Results.Comment
            {
                Id             = c.Id,
                NickName       = Clients.Client.GetName(c.CreateById),
                Date           = c.CreateDate.ToStandardString(),
                CommentContent = c.Comment
            }).ToListAsync();

            detail.Comments = comments;

            return(Resp.Success(detail, ""));
        }
Exemplo n.º 16
0
        public override async Task <Resp> GetListAsync(Paginator pager)
        {
            if (!int.TryParse(pager["questionId"], out int questionId) || !int.TryParse(pager["answerState"], out int answerState))
            {
                return(Resp.Fault(Resp.NONE, "参数错误"));
            }

            (pager.List, pager.TotalRows) = await GetAnswersAsync(questionId, pager.Index, pager.Size, (Answer.AnswerState) answerState);

            return(Resp.Success(pager));
        }
Exemplo n.º 17
0
        /// <summary>
        /// 删除举报的提问
        /// </summary>
        /// <param name="questionId"></param>
        /// <returns></returns>
        public async Task <Resp> DeleteAsync(int questionId)
        {
            /*
             * 将提问标记为删除
             * 删除相关的其他记录
             * 不可恢复
             */

            await using var db = new YGBContext();
            var question = await db.Questions.FirstOrDefaultAsync(q => q.Id == questionId);

            if (question is null)
            {
                return(Resp.Fault(Resp.NONE, "该问题不存在"));
            }

            List <DB.Tables.Answer> answers = await db.Answers.AsNoTracking().Where(a => a.QuestionId == questionId).ToListAsync();

            List <int> answersId   = answers.Select(a => a.Id).ToList();
            var        backRecords = await db.AnswerBackRecords.AsNoTracking().Where(a => answersId.Contains(a.AnswerId)).ToListAsync();

            var reportRecords = await db.AnswerReportRecords.AsNoTracking().Where(a => answersId.Contains(a.AnswerId)).ToListAsync();

            var comments = await db.AnswerComments.AsNoTracking().Where(a => answersId.Contains(a.AnswerId)).ToListAsync();

            db.AnswerBackRecords.RemoveRange(backRecords);
            db.AnswerComments.RemoveRange(comments);
            db.AnswerReportRecords.RemoveRange(reportRecords);
            db.Answers.RemoveRange(answers);

            var backQuestion = await db.QuestionBackRecords.AsNoTracking().Where(q => q.QuestionId == questionId).ToListAsync();

            var reportQuestion = await db.QuestionReportRecords.AsNoTracking().Where(q => q.QuestionId == questionId).ToListAsync();

            var commentQuestion = await db.QuestionComments.AsNoTracking().Where(q => q.QuestionId == questionId).ToListAsync();

            db.QuestionComments.RemoveRange(commentQuestion);
            db.QuestionBackRecords.RemoveRange(backQuestion);
            db.QuestionReportRecords.RemoveRange(reportQuestion);

            question.Title       = "该提问因违反法律法规已被删除";
            question.Description = "该提问因违反法律法规已被删除,请对自己的言论负责";
            question.State       = (int)Question.QuestionState.Delete;

            int changeCount = await db.SaveChangesAsync();

            if (changeCount == answers.Count + 1 + backRecords.Count + reportRecords.Count + comments.Count + backQuestion.Count + reportQuestion.Count + commentQuestion.Count)
            {
                return(Resp.Success());
            }

            return(Resp.Fault(Resp.NONE, "删除失败"));
        }
Exemplo n.º 18
0
        /*
         * 被移除的提问用户自己也不能看到
         * 如果当前获取提问列表的非用户本人
         * 则只能获取到启用的提问
         */

        public async Task <Resp> GetListAsync(Paginator pager)
        {
            Expression <Func <DB.Tables.Question, bool> > whereStatement = q => q.State != (int)Question.QuestionState.Remove;

            //  要获取的人的ID
            if (int.TryParse(pager["userId"] ?? "", out int userId))
            {
                whereStatement = whereStatement.And(q => q.AskerId == userId);
            }
            else
            {
                return(Resp.Fault(Resp.NONE, ""));
            }

            //  当前登录人ID
            if (!int.TryParse(pager["currentUserId"] ?? "", out int currentUserId))
            {
                currentUserId = 0;
            }
            //  如果不是用户本人,只能看到通过的提问
            bool isSelf = currentUserId == userId;

            if (!isSelf)
            {
                whereStatement = whereStatement.And(q => q.State == (int)Question.QuestionState.Enabled);
            }
            //  如果是,则能看到所有提问

            using var db = new YGBContext();

            pager.TotalRows = await db.Questions.CountAsync(whereStatement);

            pager.List = await db.Questions.AsNoTracking()
                         .OrderByDescending(q => q.CreateDate)
                         .Where(whereStatement)
                         .Skip(pager.Skip)
                         .Take(pager.Size)
                         .Include(q => q.Answers)
                         .Select(q => new Results.QuestionItem_UserSelf
            {
                Id           = q.Id,
                IsSelf       = isSelf,
                Title        = q.Title,
                Description  = q.Description.Length > Question.LIST_DESCRIPTION_LENGTH ? q.Description.Substring(0, Question.LIST_DESCRIPTION_LENGTH) + "..." : q.Description,
                CreateDate   = q.CreateDate.ToStandardDateString(),
                State        = Share.KeyValue <int, string> .Create(q.State, q.State.GetDescription <Question.QuestionState>()),
                AnswersCount = q.Answers.Count
            })
                         .ToListAsync();

            return(Resp.Success(pager, ""));
        }
Exemplo n.º 19
0
        /// <summary>
        /// 获取详情
        /// </summary>
        /// <returns></returns>
        public async Task <Resp> GetDetailAsync()
        {
            try
            {
                var detail = await GetUserInfoAsync();

                return(Resp.Success(detail));
            }
            catch (Exception ex)
            {
                return(Resp.Fault(Resp.NONE, ex.Message));
            }
        }
Exemplo n.º 20
0
        /// <summary>
        /// 退回提问
        /// </summary>
        /// <param name="reason"></param>
        /// <returns></returns>
        public async Task <Resp> BackAsync(string reason)
        {
            if (string.IsNullOrWhiteSpace(reason))
            {
                return(Resp.Fault(Resp.NONE, "需要退回理由"));
            }

            var  question = Hub.GetQuestion(_id);
            bool success  = await question.BackQuestionAsync(reason, true);

            if (success)
            {
                return(Resp.Success(Resp.NONE));
            }
            return(Resp.Fault(Resp.NONE, "退回失败"));
        }
Exemplo n.º 21
0
        /// <summary>
        /// 登出
        /// </summary>
        public async Task <Resp> Logout()
        {
            using var db = new YGBContext();
            DB.Tables.Admin account = await db.Admins.FirstOrDefaultAsync(a => a.Id == Id);

            if (account is null)
            {
                return(Resp.Success(Resp.NONE));
            }
            account.Token = Guid.NewGuid();
            if (await db.SaveChangesAsync() == 1)
            {
                return(Resp.Success(Resp.NONE));
            }
            return(Resp.Fault(Resp.NONE, "退出登录失败"));
        }
Exemplo n.º 22
0
        /// <summary>
        /// 添加一个账号
        /// </summary>
        /// <param name="newAccount"></param>
        /// <returns></returns>
        public async Task <Resp> AddAccount(Models.NewAccount newAccount)
        {
            (bool isValid, string msg) = newAccount.IsValid();
            if (!isValid)
            {
                return(Resp.Fault(msg));
            }

            using var db = new MyForContext();

            if (await db.Accounts.AnyAsync(a => a.AccountName == newAccount.AccountName))
            {
                return(Resp.Fault("账号名已经存在"));
            }

            //if (await db.Accounts.AnyAsync(a => a.Email == newAccount.Email))
            int avatarId;

            if (newAccount.Avatar is null)
            {
                avatarId = User.GetDefaultAvatarId();
            }
            else
            {
                Files.File file = new Files.File();
                avatarId = await file.SaveFileToDBAsync(newAccount.Avatar);
            }

            DB.Tables.Account model = new DB.Tables.Account
            {
                AccountName = newAccount.AccountName,
                Password    = newAccount.Password,
                AvatarId    = avatarId,
                Email       = newAccount.Email,
                Phone       = newAccount.Phone,
                Gender      = newAccount.Gender,
                CreateById  = newAccount.CreatorId
            };
            db.Accounts.Add(model);
            int suc = await db.SaveChangesAsync();

            if (suc == 1)
            {
                return(Resp.Success(Resp.NONE, "添加成功"));
            }
            return(Resp.Fault(msg: "添加账号失败"));
        }
Exemplo n.º 23
0
        public async Task <Resp> GetDetailAsync(int questionId, Paginator page)
        {
            using var db = new YGBContext();
            DB.Tables.Question question = await db.Questions.Include(q => q.Asker)
                                          .ThenInclude(asker => asker.Avatar)
                                          .Include(q => q.QuestionComments)
                                          .FirstOrDefaultAsync(q => q.Id == questionId);

            if (question is null)
            {
                return(Resp.Fault(Resp.NONE, Question.QUESTION_NO_EXIST));
            }

            Answers.Hub answerHub = new Answers.Hub();
            //  获取第一页的答案分页

            //  获取提问下的答案分页
            Answers.List.AnswerList answers = answerHub.GetAnswers(Answers.Hub.AnswerSource.Question);

            (page.List, page.TotalRows) = await answers.GetAnswersAsync(questionId, page.Index, page.Size, Answers.Answer.AnswerState.NoSelected);

            Results.QuestionDetailForAdmin detail = new Results.QuestionDetailForAdmin
            {
                Id          = question.Id,
                Title       = question.Title,
                Description = question.Description,
                Tags        = question.Tags.Split(','),
                Votes       = question.Votes,
                Views       = question.Views,
                Actived     = question.Actived.ToStandardString(),
                CreateDate  = question.CreateDate.ToStandardString(),
                State       = KeyValue <int, string> .Create(question.State, question.State.GetDescription <Question.QuestionState>()),
                Comments    = question.QuestionComments.Select(q => KeyValue <int, string> .Create(q.Id, q.Content)).ToArray(),
                User        = new Clients.Results.UserIntro
                {
                    Id      = question.Asker.Id,
                    Account = question.Asker.Name,
                    Avatar  = question.Asker.Avatar.Thumbnail
                },
                Page = page
            };

            await db.SaveChangesAsync();

            return(Resp.Success(detail, ""));
        }
Exemplo n.º 24
0
        /// <summary>
        /// 不同意回答
        /// </summary>
        /// <returns></returns>
        public async Task <Resp> UnLikeAsync()
        {
            using YGBContext db = new YGBContext();

            DB.Tables.Answer answer = await db.Answers.FirstOrDefaultAsync(a => a.Id == Id);

            if (answer is null)
            {
                return(Resp.Fault(Resp.NONE, NOT_EXIST_ANSWER));
            }
            answer.Votes--;
            if (await db.SaveChangesAsync() == 1)
            {
                return(Resp.Success(Resp.NONE));
            }
            return(Resp.Fault(Resp.NONE, "请求失败"));
        }
Exemplo n.º 25
0
        /// <summary>
        /// 登录
        /// </summary>
        public static async Task <Resp> LoginAsync(Models.LoginInfo loginInfo)
        {
            /*
             * 检查登录参数
             */

            (bool isValid, string msg) = loginInfo.IsValid();
            if (!isValid)
            {
                return(Resp.Fault(Resp.NONE, msg));
            }

            /*
             * 检查登录账号密码
             */

            using var db = new YGBContext();

            DB.Tables.User user = await db.Users.Include(u => u.Avatar)
                                  .FirstOrDefaultAsync(a =>
                                                       (a.Name.Equals(loginInfo.Account, StringComparison.OrdinalIgnoreCase) || a.Email.Equals(loginInfo.Account, StringComparison.OrdinalIgnoreCase)) &&
                                                       a.Password == loginInfo.Password);

            if (user is null)
            {
                return(Resp.Fault(Resp.NONE, "用户名或邮箱不存在或密码错误"));
            }

            user.Token = Guid.NewGuid();
            int suc = await db.SaveChangesAsync();

            if (suc != 1)
            {
                return(Resp.Fault(Resp.NONE, "登录失败, 请重试"));
            }

            Results.LoggedInInfo result = new Results.LoggedInInfo
            {
                Avatar = user.Avatar.Thumbnail,
                Id     = user.Id,
                Token  = user.Token,
                Name   = user.Name
            };
            return(Resp.Success(result));
        }
Exemplo n.º 26
0
        /// <summary>
        /// 删除一个评论
        /// </summary>
        public async Task <Resp> DeleteAsync(int id)
        {
            await using var db = new YGBContext();

            var comment = await db.QuestionComments.AsNoTracking().FirstOrDefaultAsync(qc => qc.Id == id);

            if (comment != null)
            {
                db.QuestionComments.Remove(comment);
                int changeCount = await db.SaveChangesAsync();

                if (changeCount != 1)
                {
                    return(Resp.Fault(Resp.NONE, "删除失败"));
                }
            }
            return(Resp.Success());
        }
Exemplo n.º 27
0
        public override async Task <Resp> GetListAsync(Paginator pager)
        {
            if (!int.TryParse(pager["state"], out int state))
            {
                return(Resp.Fault(Resp.NONE, ""));
            }

            string questionTitle = pager["questionTitle"] ?? "";

            Expression <Func <DB.Tables.Answer, bool> > whereStatement = a => a.State == state;

            if (!string.IsNullOrWhiteSpace(questionTitle))
            {
                whereStatement = whereStatement.And(q => q.Question.Title.Contains(questionTitle));
            }

            await using var db = new YGBContext();

            int totalSize = await db.Answers.CountAsync(whereStatement);

            pager.TotalRows = await db.Answers.CountAsync(whereStatement);

            pager.List = await db.Answers.AsNoTracking()
                         .Where(whereStatement)
                         .Skip(pager.Skip)
                         .Take(pager.Size)
                         .Include(a => a.Question)
                         .Include(a => a.Answerer)
                         .OrderByDescending(a => a.CreateDate)
                         .Select(a => new Results.AnswerItem_All
            {
                Id            = a.Id,
                QuestionTitle = a.Question.Title,
                Content       = a.Content.Overflow(10, "..."),
                Votes         = a.Votes,
                CreateDate    = a.CreateDate.ToStandardDateString(),
                AnswererName  = a.Answerer.Name,
                State         = Share.KeyValue <int, string> .Create(a.State, a.State.GetDescription <Answers.Answer.AnswerState>())
            })
                         .ToListAsync();

            return(Resp.Success(pager));
        }
Exemplo n.º 28
0
        public async Task <Resp> GetAnswerDetailAsync(int answerId)
        {
            await using var db = new YGBContext();

            DB.Tables.Answer answer = await db.Answers.AsNoTracking()
                                      .Where(a => a.Id == answerId)
                                      .Include(a => a.Question)
                                      .ThenInclude(q => q.Asker)
                                      .ThenInclude(asker => asker.Avatar)
                                      .Include(a => a.Answerer)
                                      .ThenInclude(user => user.Avatar)
                                      .FirstOrDefaultAsync();

            if (answer is null)
            {
                return(Resp.Fault(Resp.NONE, "答案不存在"));
            }

            Results.AnswerDetailForClient detail = new Results.AnswerDetailForClient
            {
                Id              = answerId,
                QuestionTitle   = answer.Question.Title,
                QuestionContent = answer.Question.Description,
                Tags            = answer.Question.Tags.Split(',', ','),
                AnswerContent   = answer.Content,
                State           = Share.KeyValue <int, string> .Create(answer.State, answer.State.GetDescription <Answer.AnswerState>()),
                CreateDate      = answer.CreateDate.ToStandardDateString(),
                AnswererUser    = new Clients.Results.UserIntro
                {
                    Id      = answer.Answerer.Id,
                    Account = answer.Answerer.Name,
                    Avatar  = answer.Answerer.Avatar.Thumbnail
                },
                AskerUser = new Clients.Results.UserIntro
                {
                    Id      = answer.Question.Asker.Id,
                    Account = answer.Question.Asker.Name,
                    Avatar  = answer.Question.Asker.Avatar.Thumbnail
                }
            };
            return(Resp.Success(detail));
        }
Exemplo n.º 29
0
        /// <summary>
        /// 登录
        /// </summary>
        public static async Task <(bool, Resp)> Login(Models.LoginInfo loginInfo)
        {
            /*
             * 检查登录参数
             */

            (bool isValid, string msg) = loginInfo.IsValid();
            if (!isValid)
            {
                return(false, Resp.Fault(Resp.NONE, msg));
            }

            /*
             * 检查登录账号密码
             */

            using var db = new YGBContext();

            DB.Tables.Admin account = await db.Admins.FirstOrDefaultAsync(a => a.Account == loginInfo.Account && a.Password == loginInfo.Password);

            if (account is null)
            {
                return(false, Resp.Fault(Resp.NONE, "账号不存在或密码错误"));
            }

            account.Token = Guid.NewGuid();
            int suc = await db.SaveChangesAsync();

            if (suc != 1)
            {
                return(false, Resp.Fault(Resp.NONE, "登录失败, 请重试"));
            }

            Results.LoggedInInfo result = new Results.LoggedInInfo
            {
                Id       = account.Id,
                Token    = account.Token,
                UserName = account.Account,
                Email    = account.Email
            };
            return(true, Resp.Success(result));
        }
Exemplo n.º 30
0
        /// <summary>
        /// 登出
        /// </summary>
        public async Task <Resp> Logout()
        {
            using var db = new MyForContext();

            DB.Tables.Account account = await db.Accounts.FirstOrDefaultAsync(a => a.Id == Id);

            if (account is null)
            {
                return(Resp.NeedLogin(Resp.NONE, "请重新登录"));
            }

            account.Token = Guid.NewGuid();
            int suc = await db.SaveChangesAsync();

            if (suc == 1)
            {
                return(Resp.Success(Resp.NONE, "成功"));
            }
            return(Resp.Fault(Resp.NONE, "失败"));
        }