Пример #1
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, "提交失败"));
        }
Пример #2
0
        public async Task <Resp> EnabledAsync()
        {
            int    enabledValue       = (int)QuestionState.Enabled;
            string enabledDescription = QuestionState.Enabled.GetDescription();

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

            if (question is null)
            {
                return(Resp.Fault(Resp.NONE, QUESTION_NO_EXIST));
            }
            if (question.State == enabledValue)
            {
                return(Resp.Fault(Resp.NONE, $"已经是{enabledDescription}的状态,不能再次{enabledDescription}"));
            }
            question.State = enabledValue;
            int changeCount = await db.SaveChangesAsync();

            if (changeCount == 1)
            {
                return(Resp.Success(Resp.NONE));
            }
            return(Resp.Fault(Resp.NONE, "修改失败"));
        }
Пример #3
0
        internal async Task <(bool, string)> NewAnswerAsync(int questionId, string content, string nickName)
        {
            //  匿名的要审核

            if (string.IsNullOrWhiteSpace(nickName))
            {
                nickName = "匿名";
            }
            if (string.IsNullOrWhiteSpace(content))
            {
                return(false, "回答内容不能为空");
            }

            using var db = new YGBContext();
            DB.Tables.Answer answer = new DB.Tables.Answer
            {
                QuestionId = questionId,
                Content    = content,
                NickName   = nickName,
                State      = (int)Answer.AnswerState.ToAudit
            };
            db.Answers.Add(answer);
            if (await db.SaveChangesAsync() == 1)
            {
                return(true, "");
            }
            return(false, "回答失败");
        }
Пример #4
0
        public async Task <Resp> GetListAsync(Paginator pager)
        {
            await using var db = new YGBContext();

            Expression <Func <DB.Tables.Question, bool> > where = q => q.State == (int)Question.QuestionState.Enabled;

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

            pager.List = await db.Questions.AsNoTracking()
                         .OrderByDescending(q => q.CreateDate)
                         .Where(where)
                         .Skip(pager.Skip)
                         .Take(pager.Size)
                         .Include(q => q.Answers)
                         .Include(q => q.Asker)
                         .ThenInclude(asker => asker.Avatar)
                         .Select(q => new Results.QuentionItem_Client
            {
                Id           = q.Id,
                Title        = q.Title,
                Description  = q.Description.Length > 20 ? q.Description.Substring(0, 20) + "..." : q.Description,
                CreateDate   = q.CreateDate.ToStandardString(),
                VoteCounts   = q.Votes,
                ViewCounts   = q.Views,
                AnswerCounts = q.Answers.Count(a => a.State == (int)Answers.Answer.AnswerState.Enabled),
                Tags         = q.Tags.SplitOfChar(','),
                AskerName    = q.Asker.Name,
                AskerAvatar  = q.Asker.Avatar.Thumbnail
            })
                         .ToListAsync();

            return(Resp.Success(pager));
        }
Пример #5
0
        /// <summary>
        /// 回退提问
        /// </summary>
        /// <param name="reason"></param>
        /// <param name="isClearReport">是否清除举报记录</param>
        /// <returns></returns>
        internal async Task <bool> BackQuestionAsync(string reason, bool isClearReport = false)
        {
            await using var db = new YGBContext();
            DB.Tables.Question question = await db.Questions.FirstOrDefaultAsync(q => q.Id == Id);

            if (question is null)
            {
                return(false);
            }
            if (question.State == (int)QuestionState.Back)
            {
                return(false);
            }
            question.State = (int)QuestionState.Back;
            DB.Tables.QuestionBackRecord record = new DB.Tables.QuestionBackRecord
            {
                QuestionId  = Id,
                Description = reason
            };
            db.QuestionBackRecords.Add(record);
            int shouldChangeCount = 2;

            if (isClearReport)
            {
                var qrList = await db.QuestionReportRecords.AsNoTracking().Where(qr => qr.QuestionId == Id && !qr.IsHandled).ToListAsync();

                db.QuestionReportRecords.RemoveRange(qrList);
                shouldChangeCount += qrList.Count;
            }

            int changeCount = await db.SaveChangesAsync();

            return(changeCount == shouldChangeCount);
        }
Пример #6
0
        /// <summary>
        /// 注册
        /// </summary>
        public async Task <Resp> RegisterAsync(Models.RegisterInfo register)
        {
            (bool isValid, string msg) = register.IsValid();
            if (!isValid)
            {
                return(Resp.Fault(Resp.NONE, msg));
            }

            using var db = new YGBContext();
            if (await db.Users.AnyAsync(u => u.Email.ToLower() == register.Email.ToLower()))
            {
                return(Resp.Fault(Resp.NONE, "该邮箱已被注册"));
            }

            DB.Tables.User newUser = new DB.Tables.User
            {
                Name     = Guid.NewGuid().ToString(),
                Email    = register.Email,
                Password = register.Password,
                AvatarId = File.DEFAULT_IMG_ID,
                Token    = System.Guid.NewGuid(),
                State    = (int)User.UserState.Enabled
            };
            db.Users.Add(newUser);
            if (await db.SaveChangesAsync() == 1)
            {
                newUser.Name = $"未命名_{newUser.Id}";
                await db.SaveChangesAsync();

                return(Resp.Success(Resp.NONE));
            }
            return(Resp.Fault(Resp.NONE, "注册失败,请重试"));
        }
Пример #7
0
        /// <summary>
        /// 提交审核
        /// </summary>
        public async Task <Resp> ToAudit(string description)
        {
            if (string.IsNullOrWhiteSpace(description))
            {
                return(Resp.Fault(Resp.NONE, "提问内容不能为空"));
            }

            using var db = new YGBContext();

            DB.Tables.Question question = await db.Questions.FirstOrDefaultAsync(q => q.Id == Id);

            if (question is null)
            {
                return(Resp.Fault(Resp.NONE, QUESTION_NO_EXIST));
            }
            if (question.Description == description)
            {
                return(Resp.Fault(Resp.NONE, "提问内容未修改"));
            }
            question.State       = (int)QuestionState.ToAudit;
            question.Description = description;
            if (await db.SaveChangesAsync() == 1)
            {
                return(Resp.Success(Resp.NONE));
            }
            return(Resp.Fault(Resp.NONE, "提交失败"));
        }
Пример #8
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, "提交失败,请重试"));
        }
Пример #9
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, "修改失败"));
        }
Пример #10
0
        /// <summary>
        /// 添加标签
        /// </summary>
        public async Task AddTagsAsync(string[] tags)
        {
            /*
             * 添加标签,如果标签已经有了,不会重复添加
             */

            await using YGBContext db = new YGBContext();

            List <DB.Tables.Tag> tagList = new List <DB.Tables.Tag>(tags.Length);

            foreach (string tag in tags)
            {
                if (Tag.IsExistTag(tag))
                {
                    continue;
                }
                tagList.Add(new DB.Tables.Tag
                {
                    Name = tag
                });
            }
            if (tagList.Count > 0)
            {
                db.Tags.AddRange(tagList);
                await db.SaveChangesAsync();
            }
        }
Пример #11
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}失败"));
        }
Пример #12
0
        private async Task <string> ModifyState(UserState userState)
        {
            using var db = new YGBContext();

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

            if (user is null)
            {
                return(USER_NOT_EXIST);
            }

            int    value       = (int)userState;
            string description = userState.GetDescription();

            if (user.State == value)
            {
                return($"用户已是{description}的状态,不能重复{description}");
            }
            user.State = value;

            int count = await db.SaveChangesAsync();

            if (count == 1)
            {
                return("");
            }
            return("启用失败");
        }
Пример #13
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, "修改失败"));
        }
Пример #14
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, "忽略失败"));
        }
Пример #15
0
        /// <summary>
        /// 追问
        /// </summary>
        public async Task <Resp> AddCommentAsyns(int commenterId, string content)
        {
            if (string.IsNullOrWhiteSpace(content))
            {
                return(Resp.Fault(Resp.NONE, "追问内容不能为空"));
            }
            if (content.Length > Comments.COMMENT_MAX_LENGTH)
            {
                return(Resp.Fault(Resp.NONE, $"追问内容不得超过{Comments.COMMENT_MAX_LENGTH}个字"));
            }

            await using var db = new YGBContext();

            if (!await db.Questions.AnyAsync(q => q.Id == Id))
            {
                return(Resp.Fault(Resp.NONE, QUESTION_NO_EXIST));
            }

            DB.Tables.QuestionComment comment = new DB.Tables.QuestionComment
            {
                QuestionId  = Id,
                CommenterId = commenterId,
                Content     = content
            };
            db.QuestionComments.Add(comment);
            int changeCount = await db.SaveChangesAsync();

            if (changeCount == 1)
            {
                return(Resp.Success());
            }
            return(Resp.Fault(Resp.NONE, "追问失败"));
        }
Пример #16
0
        /// <summary>
        /// 获取客户列表
        /// 管理端使用
        /// </summary>
        /// <param name="pager"></param>
        /// <returns></returns>
        public async Task <Resp> GetClientsListAysnc(Paginator pager)
        {
            string search = pager["search"] ?? "";

            using var db = new YGBContext();

            Expression <Func <DB.Tables.User, bool> > whereStatement = u => u.Name.Contains(search) || u.Email.Contains(search);

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

            pager.List = await db.Users.AsNoTracking()
                         .Where(whereStatement)
                         .Skip(pager.Skip)
                         .Take(pager.Size)
                         .Select(u => new Results.ClientItem
            {
                Id         = u.Id,
                UserName   = u.Name,
                Email      = u.Email,
                CreateDate = u.CreateDate.ToStandardString(),
                State      = Share.KeyValue <int, string> .Create(u.State, u.State.GetDescription <User.UserState>())
            })
                         .ToListAsync();

            return(Resp.Success(pager));
        }
Пример #17
0
        /// <summary>
        /// 删除回答,硬删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task <Resp> DeleteAsync(int id)
        {
            await using var db = new YGBContext();

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

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

            var backList = await db.AnswerBackRecords.AsNoTracking().Where(a => a.AnswerId == id).ToListAsync();

            var commentList = await db.AnswerComments.AsNoTracking().Where(a => a.AnswerId == id).ToListAsync();

            var reportList = await db.AnswerReportRecords.AsNoTracking().Where(a => a.AnswerId == id).ToListAsync();

            db.AnswerBackRecords.RemoveRange(backList);
            db.AnswerComments.RemoveRange(commentList);
            db.AnswerReportRecords.RemoveRange(reportList);
            db.Answers.Remove(answer);

            int count       = 1 + backList.Count + commentList.Count + reportList.Count;
            int changeCount = await db.SaveChangesAsync();

            if (count == changeCount)
            {
                return(Resp.Success());
            }
            return(Resp.Fault(Resp.NONE, "删除失败"));
        }
Пример #18
0
        /// <summary>
        /// 获取用户编辑的提问信息
        /// </summary>
        /// <param name="questionId"></param>
        /// <returns></returns>
        public async Task <Results.QuestionEditInfo> GetEditInfoAsync(int questionId)
        {
            await using var db = new YGBContext();
            DB.Tables.Question question = await db.Questions.AsNoTracking().FirstOrDefaultAsync(q => q.Id == questionId);

            if (question is null)
            {
                return(default);
Пример #19
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, "删除失败"));
        }
Пример #20
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));
        }
Пример #21
0
        /// <summary>
        /// 该标签是否已存在
        /// </summary>
        /// <param name="tag"></param>
        /// <returns></returns>
        public static bool IsExistTag(string tag)
        {
            bool?exist = Cache.Get <bool?>(tag);

            if (exist is null)
            {
                using var db = new YGBContext();
                exist        = db.Tags.Any(t => t.Name == tag);
                Cache.Set(tag, exist);
            }
            return(exist.Value);
        }
Пример #22
0
        /// <summary>
        /// 根据 token 获取管理员,如果管理员不存在,会返回管理员空值
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static Account GetAccount(string token)
        {
            using var db = new YGBContext();

            DB.Tables.Admin account = db.Admins.AsNoTracking()
                                      .FirstOrDefault(a => a.Token.ToString() == token);
            if (account is null)
            {
                return(new Account(Account.EMPTY));
            }
            return(new Account(account.Id));
        }
Пример #23
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, "删除失败"));
        }
Пример #24
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, ""));
        }
Пример #25
0
        /// <summary>
        /// 获取用户
        /// </summary>
        public static User GetUser(string token)
        {
            using var db = new YGBContext();

            DB.Tables.User user = db.Users.AsNoTracking()
                                  .Where(u => u.Token.ToString() == token)
                                  .FirstOrDefault();
            if (user is null)
            {
                return(User.GetEmpty());
            }

            return(new User(user.Id));
        }
Пример #26
0
        public static User GetUserByUserName(string userName)
        {
            using var db = new YGBContext();

            DB.Tables.User user = db.Users.AsNoTracking()
                                  .Where(u => u.Name.Equals(userName, StringComparison.OrdinalIgnoreCase))
                                  .FirstOrDefault();
            if (user is null)
            {
                return(User.GetEmpty());
            }

            return(new User(user.Id));
        }
Пример #27
0
        /// <summary>
        /// 获取标题
        /// </summary>
        /// <returns></returns>
        public string GetTitle()
        {
            CheckEmpty();

            string key  = $"c0396d57-7c18-47d5-957c-d135f57882aa_{Id}";
            string name = Cache.Get <string>(key);

            if (name is null)
            {
                using var db = new YGBContext();
                DB.Tables.Question question = db.Questions.AsNoTracking().FirstOrDefault(a => a.Id == Id);
                name = question?.Title ?? "";
                Cache.Set(key, name);
            }
            return(name);
        }
Пример #28
0
        /// <summary>
        /// 获取账号
        /// </summary>
        /// <returns></returns>
        public string GetAccount()
        {
            CheckEmpty();

            string key  = $"0d376d79-1049-4e0d-8562-896392539b2d_{Id}";
            string name = Cache.Get <string>(key);

            if (name is null)
            {
                using var db = new YGBContext();
                var account = db.Admins.AsNoTracking().FirstOrDefault(a => a.Id == Id);
                name = account?.Account ?? "";
                Cache.Set(key, name);
            }
            return(name);
        }
Пример #29
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, "退出登录失败"));
        }
Пример #30
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, ""));
        }