翼度科技»论坛 编程开发 .net 查看内容

个人网站建站日记-面试宝典功能

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
目前,关于java的面试相关的,网上可以说是多的数不胜数,但是关于.net的,找来找去却发现很少,并且大部分相似,所以,我这里便想做个关于.net面试相关的功能,所以就我花了好几个周末的时间,毛毛糙糙的算是把这个功能赶了出来,当然也有很多不完善的地方。欢迎大家赏脸哈!现在我把我的实现步骤贴出来分享一下。
因为一个人开发,个人精力以及能力有限,很多地方也会有不好的地方,所以希望大家多多包涵,如果感兴趣的话,可以点进去瞧瞧 https://www.xiandanplay.com/interview-manual
1.功能需求

大致罗列下需求:

  • 题目分类管理
  • 题目的发布,只要谁登录了网站都可以发布,默认是待审核的,网页只显示 已审核、待审核的功能
  • 题目解析,发布者必须填写自己的对题目的解析,其他人也可以提交参考解析,并且展现出来
  • 对题目解析的查看,如果第一次查看这个题目,需要点击“查看解析”的按钮,如果已登录并且查看过,则第二次就不需要点“查看解析”的按钮了。
  • 支持对题目的标题、难度、标签的查询
2.表(实体)结构设计

这里我就用实体来表示了,因为我是用的ef,基本上用CodeFirst就是表结构了
1.题目表
  1. public class Question : Entity<long>
  2.     {
  3.         /// <summary>
  4.         /// 标题
  5.         /// </summary>
  6.         public string Title { get; set; }
  7.         /// <summary>
  8.         /// 类型
  9.         /// </summary>
  10.         public QuestionTypeEnum QuestionType { get; set; }
  11.         /// <summary>
  12.         /// 提交人id
  13.         /// </summary>
  14.         public long UserId { get; set; }
  15.         /// <summary>
  16.         /// 提交人
  17.         /// </summary>
  18.         public User User { get; set; }
  19.         /// <summary>
  20.         /// 题目分类id
  21.         /// </summary>
  22.         public long? QuestionCategoryId { get; set; }
  23.         /// <summary>
  24.         /// 题目标签
  25.         /// </summary>
  26.         public string QuestionTag { get; set; }
  27.         /// <summary>
  28.         /// 浏览数
  29.         /// </summary>
  30.         public int BrowserCount { get; set; }
  31.         /// <summary>
  32.         /// 评论数
  33.         /// </summary>
  34.         public int CommentCount { get; set; }
  35.         /// <summary>
  36.         /// 收藏数
  37.         /// </summary>
  38.         public int CollectCount { get; set; }
  39.         /// <summary>
  40.         /// 奖励金币
  41.         /// </summary>
  42.         public int RewardCoin { get; set; }
  43.         /// <summary>
  44.         /// 是否发布
  45.         /// </summary>
  46.         public bool IsPublish { get; set; }
  47.         /// <summary>
  48.         /// 审核状态
  49.         /// </summary>
  50.         public ApproveStatus ApproveStatus { get; set; }
  51.     }
复制代码
2.题目解析表
  1. public class QuestionAnalysis : Entity<long>
  2.     {
  3.         /// <summary>
  4.         /// 题目id
  5.         /// </summary>
  6.         public long InterviewQuestionId { get; set; }
  7.         /// <summary>
  8.         /// 解析简要
  9.         /// </summary>
  10.         public string AnalysisContentDescription { get; set; }
  11.         /// <summary>
  12.         /// 题目解析
  13.         /// </summary>
  14.         public string AnalysisContent { get; set; }
  15.         /// <summary>
  16.         /// 提交人id
  17.         /// </summary>
  18.         public long UserId { get; set; }
  19.         /// <summary>
  20.         /// 提交人
  21.         /// </summary>
  22.         public User User { get; set; }
  23.         /// <summary>
  24.         /// 评论数
  25.         /// </summary>
  26.         public int CommentCount { get; set; }
  27.         /// <summary>
  28.         /// 赞同数
  29.         /// </summary>
  30.         public int AgreeCount { get; set; }
  31.         /// <summary>
  32.         /// 反对数
  33.         /// </summary>
  34.         public int AgainstCount { get; set; }
  35.         /// <summary>
  36.         /// 是否最佳解析
  37.         /// </summary>
  38.         public bool? Best { get; set; }
  39.         /// <summary>
  40.         /// 是否默认
  41.         /// </summary>
  42.         public bool? IsDefault { get; set; }
  43.         /// <summary>
  44.         /// 收货金币
  45.         /// </summary>
  46.         public int? GetCoin { get; set; }
  47.         /// <summary>
  48.         /// 审核状态
  49.         /// </summary>
  50.         public ApproveStatus ApproveStatus { get; set; }
  51.     }
复制代码
3.题目分类表
  1. public class InterviewQuestionCategory: Entity<long>
  2.     {
  3.         /// <summary>
  4.         /// 分类名称
  5.         /// </summary>
  6.         public string Name { get; set; }
  7.         /// <summary>
  8.         /// 图标
  9.         /// </summary>
  10.         public string Icon { get; set; }
  11.         /// <summary>
  12.         /// 父分类id
  13.         /// </summary>
  14.         public long? ParentCategoryId { get; set; }
  15.         /// <summary>
  16.         /// 是否启用
  17.         /// </summary>
  18.         public bool IsEnable { get; set; }
  19.         /// <summary>
  20.         ///  排序
  21.         /// </summary>
  22.         public int SortNo { get; set; }
  23.         /// <summary>
  24.         /// 描述
  25.         /// </summary>
  26.         public string Description { get; set; }
  27.     }
复制代码
大致就罗列这几个主要的吧。
4、业务逻辑实现

业务代码逻辑倒是没有特别复杂,都是写CRUD,一看就会,这里举例部分代码。
递归获取分类树
  1.   public async Task<List<TreeVM>> GetCategoryTreesAsync()
  2.         {
  3.             List<InterviewQuestionCategory> categorys = await GetCategorys();
  4.             return BuildTrees(categorys);
  5.         }
  6. private List<TreeVM> BuildTrees(List<InterviewQuestionCategory> interviewQuestionCategories)
  7.         {
  8.             List<TreeVM> list = new List<TreeVM>();
  9.             var roots = interviewQuestionCategories.Where(s => !s.ParentCategoryId.HasValue).OrderBy(s => s.SortNo);
  10.             foreach (var root in roots)
  11.             {
  12.                 TreeVM interviewCategoryTreeVM = new TreeVM();
  13.                 interviewCategoryTreeVM.Id = root.Id;
  14.                 interviewCategoryTreeVM.Label = root.Name;
  15.                 interviewCategoryTreeVM.Icon = root.Icon;
  16.                 GetChildrens(root, interviewQuestionCategories, interviewCategoryTreeVM);
  17.                 list.Add(interviewCategoryTreeVM);
  18.             }
  19.             return list;
  20.         }
  21.         private List<TreeVM> GetChildrens(InterviewQuestionCategory root, List<InterviewQuestionCategory> interviewQuestionCategories, TreeVM interviewCategoryTreeVM = null)
  22.         {
  23.             var childrens = interviewQuestionCategories.Where(s => s.ParentCategoryId == root.Id).OrderBy(s => s.SortNo);
  24.             List<TreeVM> list = new List<TreeVM>();
  25.             foreach (var item in childrens)
  26.             {
  27.                 TreeVM treeVM = new TreeVM();
  28.                 treeVM.Id = item.Id;
  29.                 treeVM.Label = item.Name;
  30.                 treeVM.Icon = item.Icon;
  31.                 list.Add(treeVM);
  32.                 if (interviewQuestionCategories.Any(s => s.ParentCategoryId == item.Id))
  33.                     GetChildrens(item, interviewQuestionCategories, treeVM);
  34.             }
  35.             interviewCategoryTreeVM.Children = list;
  36.             return list;
  37.         }
复制代码
创建题目
  1. public async Task<long> SaveQuestion(SaveInterviewQuestionVM saveInterviewQuestion)
  2.         {
  3.             if (saveInterviewQuestion.IsPublish && string.IsNullOrEmpty(saveInterviewQuestion.AnalysisContent))
  4.                 throw new ValidationException("题目解析内容为空");
  5.             var questionRepository = unitOfWork.GetRepository<Question>();
  6.             var questionAnalysisRepository = unitOfWork.GetRepository<QuestionAnalysis>();
  7.             Question question = null;
  8.             QuestionAnalysis questionAnalysis = null;
  9.             bool isAddQuestion = true;
  10.             bool isAddAnalysis = true;
  11.             if (saveInterviewQuestion.Id.HasValue)
  12.             {
  13.                 question = await questionRepository.SelectByIdAsync(saveInterviewQuestion.Id.Value);
  14.                 if (question.Id != CurrentLoginUser.UserId)
  15.                     throw new ValidationException("无权修改");
  16.                 questionAnalysis = await questionAnalysisRepository.Select(s => s.InterviewQuestionId == saveInterviewQuestion.Id.Value && s.IsDefault == true).FirstOrDefaultAsync();
  17.                 isAddQuestion = false;
  18.             }
  19.             else
  20.             {
  21.                 question = new Question()
  22.                 {
  23.                     Id = CreateEntityId()
  24.                 };
  25.             }
  26.             question.Title = saveInterviewQuestion.Title;
  27.             question.QuestionDifficulty = saveInterviewQuestion.Difficultion;
  28.             question.QuestionCategoryId = saveInterviewQuestion.CategoryId;
  29.             question.UserId = LoginUserId.Value;
  30.             question.ApproveStatus = ApproveStatus.ToPass;
  31.             question.IsPublish = saveInterviewQuestion.IsPublish;
  32.             question.QuestionType = QuestionTypeEnum.面试题;
  33.             if (saveInterviewQuestion.QuestionTags != null && saveInterviewQuestion.QuestionTags.Length > 0)
  34.                 question.QuestionTag = string.Join(',', saveInterviewQuestion.QuestionTags);
  35.             if (questionAnalysis == null)
  36.             {
  37.                 questionAnalysis = new QuestionAnalysis();
  38.                 questionAnalysis.Id = CreateEntityId();
  39.                 questionAnalysis.IsDefault = true;
  40.                 questionAnalysis.InterviewQuestionId = question.Id;
  41.                 questionAnalysis.UserId = LoginUserId.Value;
  42.                 questionAnalysis.ApproveStatus = ApproveStatus.ToPass;
  43.                 questionAnalysis.AnalysisContent = saveInterviewQuestion.AnalysisContent;
  44.             }
  45.             else
  46.             {
  47.                 questionAnalysis.AnalysisContent = saveInterviewQuestion.AnalysisContent;
  48.                 isAddAnalysis = false;
  49.             }
  50.             if (isAddQuestion)
  51.                 await questionRepository.InsertAsync(question);
  52.             else
  53.                 await questionRepository.UpdateAsync(question);
  54.             if (isAddAnalysis)
  55.                 await questionAnalysisRepository.InsertAsync(questionAnalysis);
  56.             else
  57.                 await questionAnalysisRepository.UpdateAsync(questionAnalysis);
  58.             await unitOfWork.CommitAsync();
  59.             return question.Id;
  60.         }
复制代码
使用Redis的Set类型处理赞成与反对操作
  1. public async Task<bool> AgreeFunc(InterviewQuestionAnalysisAgreeVM agreeVM)
  2.         {
  3.             var cache = CacheClient.CreateClient();
  4.             string cacheKey = $"{CacheKey.InterviewQuestionAnalysisAgreeKey}_{agreeVM.InterviewQuestionAnalysisId}";
  5.             string cacheValue = $"{agreeVM.AgreeType}_{agreeVM.InterviewQuestionAnalysisId}_{LoginUserId.Value}";
  6.             if (agreeVM.AgreeType == 1)
  7.             {
  8.                 string oldCacheValue = $"2_{agreeVM.InterviewQuestionAnalysisId}_{LoginUserId.Value}";
  9.                 cache.SetRemove(cacheKey, oldCacheValue);
  10.             }
  11.             else
  12.             {
  13.                 string oldCacheValue = $"1_{agreeVM.InterviewQuestionAnalysisId}_{LoginUserId.Value}";
  14.                 cache.SetRemove(cacheKey, oldCacheValue);
  15.             }
  16.             bool result = cache.AddSet(cacheKey, cacheValue);
  17.             if (result)
  18.             {
  19.                 List<string> setMembers= cache.GetMembersBySetKey(cacheKey);
  20.                 int agreeCount = 0;
  21.                 int againstCount = 0;
  22.                 foreach (var item in setMembers)
  23.                 {
  24.                     if (item.StartsWith('1'))
  25.                         agreeCount += 1;
  26.                     else
  27.                         againstCount += 1;
  28.                 }
  29.                 await qaRepository.UpdateAgree(agreeVM.InterviewQuestionAnalysisId, agreeCount, againstCount);
  30.                 await unitOfWork.CommitAsync();
  31.                 return true;
  32.             }
  33.             return false;
  34.         }
复制代码
以上只是部分代码,仅供一下参考,但是也花费了我好多个周末的时间,其它的就不说了,放几个截图看看吧,部分的功能还没完善,这个只是初版。
面试宝典首页图(每日推荐那里还没完成)


详细的面试列表界面


查看页面


提交参考解析的页面


作者:程序员奶牛

个人主页:https://www.xiandanplay.com/user/user-home?id=16782377660907520

来源:https://www.cnblogs.com/MrHanBlog/p/18546762
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具