仿牛客网项目---项目总结

本篇文章是对整个项目的一个总结。下面这张图要好好理解。

整个项目都是构建在SpringBoot之上的,所以把它画到最底下,其它技术依托在springboot之上。但是springboot并不是技术的核心,而只是起到了一个辅助的作用,它的作用仅仅是降低其它技术的使用难度,仅此而已。

那我们所有技术的核心是什么呢?我认为是Spring!因为我们所有的技术都是围绕Spring来展开的。对于重点的,我们所要关注的技术,在图中都已经画了下划线。

在Spring之上,我们用到了它的很多模块,比如SpringMVC,解决了这个前后端请求交互的问题,然后我们用到了Spring Mybatis,可以访问数据库。还用了Spring Securtiy,用来管理我们项目中安全层面的内容,管理我们项目中的权限。因为这3个技术是构建在Spring之上的,由Spring进行整合的,所以把它们画到Spring的上方。

而SpringBoot,Spring,SpringMVC,Spring Mybatis,Spring Security这5个技术放在了一块儿,意思是这些内容就是我们整个项目的基石。或者说,我们整个项目的绝大部分请求,都是用这些技术实现的,或者说它们都是基于这些技术。当然我们也用到了其它技术,那这些其它技术呢,就是不同的技术解决不同的模块,不同的问题。

权限模块

开发了注册,登录,退出功能,这些没什么好说的。然后就是状态功能,状态功能就是在每个页面上怎么去显示登录用户的用户名,头像。然后我们开发了设置功能,就是可以上传头像,修改密码。最后还开发了授权功能,就是不同类型的用户登录进来,我们让你访问不同的功能。

这些功能虽然我们开发是开发完了,但是我们必须关注一个非常重要的话题:会话管理。因为我们整个权限模块其实是构建在会话管理之上的,你想想,如果没有会话,那 后端根本记不住前端,那根本开发不出来整个项目。如果你想要一个项目有长期的交互,或者说连续的交互,要开发这样的逻辑,就必须要有会话管理。

关于会话管理,我们需要了解cookie和session,它们各自发挥什么样的作用,它们的区别是什么。

然后后来的话,我们的项目规避了session,不用session了。为什么呢?因为我们考虑到项目在分布式部署的时候,session会有一些问题。具体的问题看之前我写的博客:【cookie和session】娓娓道来cookie和session-CSDN博客

那如果我们不用session的话,怎么解决问题?我的项目中使用的是Redis,把数据存到Redis里,另外还用到了ThreadLocal。总之,对于权限管理,我们从技术上关注interceptor,从业务上关注会话管理。

核心模块

在开发完权限模块后,我们又开发了核心模块。核心模块功能比较多,包括首页,帖子,评论,私信,异常和日志。不过其实这些 功能也都差不多,也就那样吧,特别是首页,帖子,评论,私信这4个功能,都是基于SpringMVC实现的。而异常和日志则用到了一些通用的技术。

从业务角度来说,我们在开发这个模块有两个重点:敏感词和事务。对于敏感词的话,我们主要关注一下它是怎么过滤的,前缀树的结构以及相关的一些算法。对于事务的话,我们这个模块确实是解决了一些事务的问题。

当然了,这个模块肯定也是基于我们之前说的5种技术之上实现的。除了这5种技术之外,还用到了advice(控制器的通知),我们用advice来处理异常。另外我们还用到了AOP,AOP统一记录了业务层的日志。但是其实我感觉这个功能有点薄,感觉其它地方没怎么用到AOP,不过好多人说AOP很重要,这点我也是搞不懂。

性能模块

在开发完核心模块后,我们就开发了性能模块,也就是对性能要求高的模块。这里这些模块包含了社交网站中比较常见的一些功能:点赞,关注。这些功能需要高频的访问,需要高性能。那我们就利用redis开发这样的功能。当然redis肯定不止干这么一件事,它还可以干一些更高级的事,比如说可以用redis做缓存。对于这一块而言,redis肯定是最重要的,我们应该也要多关注redis这方面的内容,比如说关注一下它的数据结构,每种数据结构适合解决什么样的数据问题。

通知模块

再接下来我们又开发了通知模块。这哥模块其实就只有一个功能:系统通知。我们在这里用到了消息队列的框架:kafka。对于这个框架其实在使用的时候很简单,我们需要关注的并不是这个框架是怎么用的,这种只要你看看教程,是个人都会用,我们关键要看的是框架背后的一些通用的原则,比如说kafka的模式:生产者与消费者模式。我感觉只有理解了生产者消费者模式,你才有可能明白,在什么时候可以用到这个功能,这个功能可以帮助我们解决一个什么样的问题。当你要解决的时候,你自然会想到,哎,我可以用kafka,因为里面有一个生产者消费者模式,对解决这个问题很适用哦。

搜索模块

最后,我们开发了这个项目的搜索模块。搜索模块就一个功能:全文搜索。全文搜索的意思是我们针对帖子做一个全面的搜索,搜索帖子的各个字段。在这里我们用到了新的框架:Elasticsearch。这个框架在使用的时候也是比较简单的,我们复习时也是关注一下它的数据结构既可,也可以找一些文章看看Elasticsearch索引相关的内容。

以上就是我对于整个项目从技术到业务所做的一个总结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/446424.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后端项目访问不了

问题: 后端启动不了,无法访问网站 原因: 1.防火墙没有关 2.有缓存 3、项目没有启动 4、docker没有启动 解决: 先查看进程:docker ps,必须有三个 详细查看:docker ps -a exited代表没有开启…

AI相关的实用工具分享

AI实用工具大赏:赋能科研与生活,探索AI的无限可能 前言 在数字化浪潮汹涌而至的今天,人工智能(AI)已经渗透到我们生活的方方面面,无论是工作还是生活,都在悄然发生改变。AI的崛起不仅为我们带…

怎么看待Groq

用眼睛看。 就是字面上的意思用眼睛看。 我属于第一波玩到的,先给大家一个直观的印象,Groq到底有多快。 目前Groq只能选Llama的70b,和Mixtral的MoE,那我选7*8的这个MoE模型来实验。 这么好些字大概花了不到1秒,流式响应,其实是不是流式已经没那么重要了 ,然后看每秒Toke…

dbeaver 数据库连接工具使用教程

dbeaver是一款很强大的数据库连接工具,本人之前使用的是navicat,挺好用的,只不过每次激活都要整半天,然后看到了dbeaver这款工具,本着尝试的心态,体验了下,真香。 下面来配置dbeaver 1.下载安…

软件测试相关内容第三弹--软件测试基础

写在前:在前篇的两篇博客介绍中我们主要学习软件测试的相关概念,对软件测试进行了初步的了解,本篇博客将进一步进行学习。重点内容包括:软件测试的生命周期、如何描述一个bug、如何定义bug的级别、bug的生命周期以及在实际工作中如…

ElasticSearch学习篇10_Lucene数据存储之BKD动态磁盘树

前言 基础的数据结构如二叉树衍生的的平衡二叉搜索树通过左旋右旋调整树的平衡维护数据,靠着二分算法能满足一维度数据的logN时间复杂度的近似搜索。对于大规模多维度数据近似搜索,Lucene采用一种BKD结构,该结构能很好的空间利用率和性能。 …

系统分析与设计(一)

我们有这么多各式各样的工具,互联网给我们带来了这么多用户和数据,这是好事也有副作用。 世界上能访问用户数据,并根据数据做分析和改进的公司,大概Google是其中翘楚,这种 data-centric 的做法做过了头,也有悲剧发生: Douglas Bowman 曾经是Google 的视觉设计主管,2009年的一天…

VUE_自适应布局lib-flexible+postcss-pxtorem、lib-flexible + postcss-px2rem,nuxt页面自适配

lib-flexible postcss-pxtorem适配 我采用的是flexable.js和postcss-pxtorem。我一开始用的是postcss-px2rem后来发现和nuxt引入公共css的时候发生了冲突所以改用了postcss-pxtorem。 安装依赖 npm i lib-flexible -S npm install postcss-pxtorem --save 1、lib-flexible.…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:动态属性设置)

动态设置组件的属性,支持开发者在属性设置时使用if/else语法,且根据需要使用多态样式设置属性。 说明: 从API Version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 attributeModifier attributeMo…

Mint_21.3 drawing-area和goocanvas的FB笔记(六)

FreeBASIC gfx 基本 graphics 绘图 一、旧故事 DOS时代PC技术将各类硬插卡限制在 640K到1MB的空间范围内,BIOS负责在相关位置写读测试卡的存在,那时期的Color Video在0xB800,Monochrome Video在0xB000,这是显卡的内存地址&#…

算法学习之动态规划DP——背包问题

一、01背包问题 (一)题目 有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。 第i件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值…

前后端交互理解 简易表白墙(servlet)

前后端交互理解 简易表白墙(servlet) 文章目录 前后端交互理解 简易表白墙(servlet)后端核心内容前后端交互接口约定后端代码展示 上期介绍过 Servlet API ,本篇文章目的是借助 servlet 做出一个完整的网站。在一个网站…

51单片机基础篇系列-人人都能学会单片机

🌈个人主页: 会编程的果子君 💫个人格言:“成为自己未来的主人~” 什么是单片机 在一片集成电路芯片上集成计算机所有基 本部分(中央处理器CPU、存储器RAM、ROM、 定时计数器T/C,输入输出接口IO、中断系 统)都集成…

【UVM_phase objection_2024.03.08

phase 棕色:function phase 不消耗仿真时间 绿色:task phase 消耗仿真时间 run_phase与右边的phase并行执行,右边的phase(run_time phase)依次执行: List itemreset_phase对DUT进行复位,初始…

Elastic Stack--07--JavaAPI----文档(新增 、修改 、 查询 、 删除)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 JavaAPI-文档1.新增 Insert2.修改 Update3.查询 Get4.删除 Delete5.批量操作 BulkRequest批量新增批量删除 高级查询1.查询所有索引数据2.条件查询3.分页查询4.查询…

代码随想录算法训练营Day39 || leetCode 762.不同路径 || 63. 不同路径 II

62.不同路径 每一位的结果等于上方与左侧结果和 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector(n,0));for (int i 0; i < m; i) dp[i][0] 1;for (int j 0; j < n; j) dp[0][j] 1;for (int i 1; i < m; …

基于raft的kvDB

1 raft共识算法 raft是强leader模型&#xff0c;通过选举leader来实现一致性&#xff0c;leader拥有完全的能力来管理复制日志。leader从客户端获取日志条目&#xff0c;复制到其他的服务器中&#xff0c;告诉他们什么时候应用这个日志到状态机是安全的。 leader这个角色简化…

实现“ 字体逐渐展现 ”程序

本期介绍&#x1f356; 主要介绍&#xff1a;如何实现在屏幕上从两边向中间逐渐打印字符串。 题目&#xff1a;编写字体逐渐展现程序&#xff0c;功能是&#xff1a;多个字符从两端向中逐渐间显现&#xff0c;直到全部显示为止。举个例子&#xff0c;要逐渐显示“hello world ”…

MEMTO: Memory-guided Transformer for Multivariate Time Series Anomaly Detection

目录 一、问题与思路1.1 现存问题1.2 解决思路 二、模型与方法2.1 模型概览2.2 Encoder and decoder2.3 门控存储器模块2.3.1 门控存储器更新阶段2.3.2 查询更新阶段2.3.3 损失函数2.3.4 初始化内存项2.3.5 异常评分2.3.6 阈值设定 三、实验与分析3.1 模型结果3.2 消融实验3.3 …

宝塔一键迁移报错创建失败问题完美解决

很多站长朋友在使用宝塔面板迁移的时候总是出错&#xff0c;如图&#xff1a; 遇到这样的问题不要慌&#xff0c;我们已经完美处理&#xff0c;详细解决教程&#xff1a;宝塔一键迁移报错问题完美解决教程