首页 > 其他分享 >个人网站建站日记-面试宝典功能

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

时间:2024-11-14 20:42:17浏览次数:1  
标签:set get question 宝典 日记 面试 saveInterviewQuestion Id public

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

1.功能需求

大致罗列下需求:

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

2.表(实体)结构设计

这里我就用实体来表示了,因为我是用的ef,基本上用CodeFirst就是表结构了

1.题目表

public class Question : Entity<long>
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 类型
        /// </summary>
        public QuestionTypeEnum QuestionType { get; set; }
        /// <summary>
        /// 提交人id
        /// </summary>
        public long UserId { get; set; }
        /// <summary>
        /// 提交人
        /// </summary>
        public User User { get; set; }
        /// <summary>
        /// 题目分类id
        /// </summary>
        public long? QuestionCategoryId { get; set; }
        /// <summary>
        /// 题目标签
        /// </summary>
        public string QuestionTag { get; set; }
        /// <summary>
        /// 浏览数
        /// </summary>
        public int BrowserCount { get; set; }
        /// <summary>
        /// 评论数
        /// </summary>
        public int CommentCount { get; set; }
        /// <summary>
        /// 收藏数
        /// </summary>
        public int CollectCount { get; set; }
        /// <summary>
        /// 奖励金币
        /// </summary>
        public int RewardCoin { get; set; }
        /// <summary>
        /// 是否发布
        /// </summary>
        public bool IsPublish { get; set; }
        /// <summary>
        /// 审核状态
        /// </summary>
        public ApproveStatus ApproveStatus { get; set; }
    }

2.题目解析表

 public class QuestionAnalysis : Entity<long>
    {
        /// <summary>
        /// 题目id
        /// </summary>
        public long InterviewQuestionId { get; set; }
        /// <summary>
        /// 解析简要
        /// </summary>
        public string AnalysisContentDescription { get; set; }
        /// <summary>
        /// 题目解析
        /// </summary>
        public string AnalysisContent { get; set; }
        /// <summary>
        /// 提交人id
        /// </summary>
        public long UserId { get; set; }
        /// <summary>
        /// 提交人
        /// </summary>
        public User User { get; set; }
        /// <summary>
        /// 评论数
        /// </summary>
        public int CommentCount { get; set; }
        /// <summary>
        /// 赞同数
        /// </summary>
        public int AgreeCount { get; set; }
        /// <summary>
        /// 反对数
        /// </summary>
        public int AgainstCount { get; set; }
        /// <summary>
        /// 是否最佳解析
        /// </summary>
        public bool? Best { get; set; }
        /// <summary>
        /// 是否默认
        /// </summary>
        public bool? IsDefault { get; set; }
        /// <summary>
        /// 收货金币
        /// </summary>
        public int? GetCoin { get; set; }
        /// <summary>
        /// 审核状态
        /// </summary>
        public ApproveStatus ApproveStatus { get; set; }
    }

3.题目分类表

public class InterviewQuestionCategory: Entity<long>
    {
        /// <summary>
        /// 分类名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 图标
        /// </summary>
        public string Icon { get; set; }
        /// <summary>
        /// 父分类id
        /// </summary>
        public long? ParentCategoryId { get; set; }
        /// <summary>
        /// 是否启用
        /// </summary>
        public bool IsEnable { get; set; }
        /// <summary>
        ///  排序
        /// </summary>
        public int SortNo { get; set; }
        /// <summary>
        /// 描述
        /// </summary>
        public string Description { get; set; }
    }

大致就罗列这几个主要的吧。

4、业务逻辑实现

业务代码逻辑倒是没有特别复杂,都是写CRUD,一看就会,这里举例部分代码。

递归获取分类树

  public async Task<List<TreeVM>> GetCategoryTreesAsync()
        {
            List<InterviewQuestionCategory> categorys = await GetCategorys();
            return BuildTrees(categorys);
        }

 private List<TreeVM> BuildTrees(List<InterviewQuestionCategory> interviewQuestionCategories)
        {
            List<TreeVM> list = new List<TreeVM>();
            var roots = interviewQuestionCategories.Where(s => !s.ParentCategoryId.HasValue).OrderBy(s => s.SortNo);
            foreach (var root in roots)
            {
                TreeVM interviewCategoryTreeVM = new TreeVM();
                interviewCategoryTreeVM.Id = root.Id;
                interviewCategoryTreeVM.Label = root.Name;
                interviewCategoryTreeVM.Icon = root.Icon;
                GetChildrens(root, interviewQuestionCategories, interviewCategoryTreeVM);
                list.Add(interviewCategoryTreeVM);
            }
            return list;
        }

        private List<TreeVM> GetChildrens(InterviewQuestionCategory root, List<InterviewQuestionCategory> interviewQuestionCategories, TreeVM interviewCategoryTreeVM = null)
        {
            var childrens = interviewQuestionCategories.Where(s => s.ParentCategoryId == root.Id).OrderBy(s => s.SortNo);
            List<TreeVM> list = new List<TreeVM>();
            foreach (var item in childrens)
            {
                TreeVM treeVM = new TreeVM();
                treeVM.Id = item.Id;
                treeVM.Label = item.Name;
                treeVM.Icon = item.Icon;
                list.Add(treeVM);
                if (interviewQuestionCategories.Any(s => s.ParentCategoryId == item.Id))
                    GetChildrens(item, interviewQuestionCategories, treeVM);
            }
            interviewCategoryTreeVM.Children = list;
            return list;
        }

创建题目

 public async Task<long> SaveQuestion(SaveInterviewQuestionVM saveInterviewQuestion)
        {
            if (saveInterviewQuestion.IsPublish && string.IsNullOrEmpty(saveInterviewQuestion.AnalysisContent))
                throw new ValidationException("题目解析内容为空");
            var questionRepository = unitOfWork.GetRepository<Question>();
            var questionAnalysisRepository = unitOfWork.GetRepository<QuestionAnalysis>();
            Question question = null;
            QuestionAnalysis questionAnalysis = null;
            bool isAddQuestion = true;
            bool isAddAnalysis = true;
            if (saveInterviewQuestion.Id.HasValue)
            {
                question = await questionRepository.SelectByIdAsync(saveInterviewQuestion.Id.Value);
                if (question.Id != CurrentLoginUser.UserId)
                    throw new ValidationException("无权修改");
                questionAnalysis = await questionAnalysisRepository.Select(s => s.InterviewQuestionId == saveInterviewQuestion.Id.Value && s.IsDefault == true).FirstOrDefaultAsync();
                isAddQuestion = false;
            }
            else
            {
                question = new Question()
                {
                    Id = CreateEntityId()
                };
            }
            question.Title = saveInterviewQuestion.Title;
            question.QuestionDifficulty = saveInterviewQuestion.Difficultion;
            question.QuestionCategoryId = saveInterviewQuestion.CategoryId;
            question.UserId = LoginUserId.Value;
            question.ApproveStatus = ApproveStatus.ToPass;
            question.IsPublish = saveInterviewQuestion.IsPublish;
            question.QuestionType = QuestionTypeEnum.面试题;
            if (saveInterviewQuestion.QuestionTags != null && saveInterviewQuestion.QuestionTags.Length > 0)
                question.QuestionTag = string.Join(',', saveInterviewQuestion.QuestionTags);
            if (questionAnalysis == null)
            {
                questionAnalysis = new QuestionAnalysis();
                questionAnalysis.Id = CreateEntityId();
                questionAnalysis.IsDefault = true;
                questionAnalysis.InterviewQuestionId = question.Id;
                questionAnalysis.UserId = LoginUserId.Value;
                questionAnalysis.ApproveStatus = ApproveStatus.ToPass;
                questionAnalysis.AnalysisContent = saveInterviewQuestion.AnalysisContent;
            }
            else
            {
                questionAnalysis.AnalysisContent = saveInterviewQuestion.AnalysisContent;
                isAddAnalysis = false;
            }
            if (isAddQuestion)
                await questionRepository.InsertAsync(question);
            else
                await questionRepository.UpdateAsync(question);
            if (isAddAnalysis)
                await questionAnalysisRepository.InsertAsync(questionAnalysis);
            else
                await questionAnalysisRepository.UpdateAsync(questionAnalysis);
            await unitOfWork.CommitAsync();
            return question.Id;
        }

使用Redis的Set类型处理赞成与反对操作

 public async Task<bool> AgreeFunc(InterviewQuestionAnalysisAgreeVM agreeVM)
        {
            var cache = CacheClient.CreateClient();
            string cacheKey = $"{CacheKey.InterviewQuestionAnalysisAgreeKey}_{agreeVM.InterviewQuestionAnalysisId}";
            string cacheValue = $"{agreeVM.AgreeType}_{agreeVM.InterviewQuestionAnalysisId}_{LoginUserId.Value}";
            if (agreeVM.AgreeType == 1)
            {
                string oldCacheValue = $"2_{agreeVM.InterviewQuestionAnalysisId}_{LoginUserId.Value}";
                cache.SetRemove(cacheKey, oldCacheValue);
            }
            else
            {
                string oldCacheValue = $"1_{agreeVM.InterviewQuestionAnalysisId}_{LoginUserId.Value}";
                cache.SetRemove(cacheKey, oldCacheValue);
            }
            bool result = cache.AddSet(cacheKey, cacheValue);
            if (result)
            {
                List<string> setMembers= cache.GetMembersBySetKey(cacheKey);
                int agreeCount = 0;
                int againstCount = 0;
                foreach (var item in setMembers)
                {
                    if (item.StartsWith('1'))
                        agreeCount += 1;
                    else
                        againstCount += 1;
                }
                await qaRepository.UpdateAgree(agreeVM.InterviewQuestionAnalysisId, agreeCount, againstCount);
                await unitOfWork.CommitAsync();
                return true;
            }
            return false;

        }

以上只是部分代码,仅供一下参考,但是也花费了我好多个周末的时间,其它的就不说了,放几个截图看看吧,部分的功能还没完善,这个只是初版。

面试宝典首页图(每日推荐那里还没完成)

image

详细的面试列表界面

image

查看页面

image

提交参考解析的页面

image

作者:程序员奶牛

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

标签:set,get,question,宝典,日记,面试,saveInterviewQuestion,Id,public
From: https://www.cnblogs.com/MrHanBlog/p/18546762

相关文章

  • 30道Spring高频面试题,学完吊打面试官(实用干货!!!)
    1、什么是Spring框架?Spring框架有哪些主要模块?答:Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照设计模式精心打造,这使得我们可......
  • Hive优化(面试宝典)
    Hive优化1.1 hive的随机抓取策略理论上来说,Hive中的所有sql都需要进行mapreduce,但是hive的抓取策略帮我们省略掉了这个过程,把切片split的过程提前帮我们做了。sethive.fetch.task.conversion=none;(一旦进行这么设置,select字段名也是需要进行mapreduce的过程,默认是more)F......
  • 【面试】抽象题目
    1、从重复性工作中,可以收获什么? 【自己】测试的工作职责大体可以归纳为四个部分需求、研发、测试、发布。所有整个工作都会围绕这四部分进行重复性工作,虽然大体的流程是重复的,但是具体到实际的工作中总会遇到各种问题,在解决各种问题的过程中也会锻炼我的处理问题能力、沟通能......
  • MyBatis面试题--(底层原理与基本概念)
    目录什么是Mybatis?MyBatis的好处是什么?什么是ORM?有何作用?MyBatis中的SqlSession是什么?有什么作用?1>什么是SqlSession?2>SqlSession的作用解释一下SqlSessionFactory的作用并解释它如何使用SqlSessionFactory的作用?如何使用SqlSessionFactory1.添加依赖2.配置数据源和S......
  • 面试官:说说Ribbon是如何实现负载均衡的?
    Ribbon的作用是负载均衡,但是根据我面试他人的情况来看,很多人只忙于业务,而不清楚具体的底层原理,在面试中是很容易吃亏的。基于此,本文就来分析一下Ribbon的原理,如果看不惯的话,可以直接看最后的总结。一、基础概念1.什么是Ribbon目前主流的负载方案分为以下两种:集中式负载......
  • 26届JAVA 学习日记——Day8
    2024.11.12周二距离上次打卡已经过去了三天,虽然有三天没有学习,但是旅游的过程还是很治愈的。今天开始继续打卡。八股SpringBoot里面有哪些重要的注解?有一个配置相关的注解是哪个?@SpringBootApplicaiton:用于标注主应用程序类,标识一个SpringBoot应用程序的入口点,同时启......
  • 【面试】月薪35k,5面上岸腾讯数据分析师经验贴
    经过5次面试,前不久终于进入了自己心仪的头部互联网大厂腾讯,目前主要是从事信息安全方面的数据运营分析相关工作,CDA数据分析师二级持证人。今天主要跟来分享一下面试求职中的一些经验教训。主要准备从五个方面跟大家分享一下:1、面试前的准备。2、面试中的表现,3、面试后......
  • 基础的软件测试面试题及答案
    1.自我介绍虽然简历中都有信息,但是这也是一个必经的流程,不仅是展示个人信息和专业技能,同时也在展示语言组织能力,沟通能力甚至亲和力等等...2.上一家公司测试和开发有多少人国内的比例一般是1个测试对应4-5个开发(个别大公司可能对应的开发会到3)3.介绍一下之前的测试流程提前拿到......
  • 【日记】感觉身体像僵尸(438 字)
    正文不让人动真的是一种酷刑。今天实在受不了,在地上试了一下KickOut,结果发现还是老样子。可能稍微好了一点?说实话我不太能感受到。这已经休息了整整两周了,折磨得我死去活来。什么时候才能跳舞啊……我这膝盖还能不能好了……昨天应酬吃的东西感觉有问题。今天跑肚子,......
  • 先天软工圣体队——冲刺日记(第一天)
    先天软工圣体队——冲刺日记(第一天)1.每位团队成员的分工与进度成员完成的任务完成的任务时长剩余时间何愉心、邱雨涵完成了vlog脚本10小时5小时陈思雨,郑奇键部分开发“资料库”模块6小时10小时陈尚冰完成了开发上传历年卷功能5小时3小时柯鸿毅完......