项目简述3

 

0、博客系统

1、项目的背景是什么,解决一个什么样的问题:

在上一家外包公司做了一个类似论坛的一个博客系统,是针对学校内学生使用的一个博客系统,对于学生们可以促进学习,记录收货,结交朋友,共享知识和交流看法。

 

2、项目的基础功能有哪些:

此项目是前后端分离开发有 用户端和管理员端(暂无移动端)

该系统大概包含了以下功能:前端有用户的登录与注册、系统的权限管理、发表编辑博客、博客查阅、博客删除、博客评论、博客点赞、
个人信息的修改、个人信息页展示如热门标签、热门博客、新发表博客还有所有博客列表,同时会做阅读量、评论量以及点赞量的统计,
还支持全文搜索,此外还有根据学生们的一些学习模块,比如课程的列表和详情还有课程的视频在线播放评论等。当然还为管理员提供了后台管理系统,用来管理与维护博客系统,如用户管理,博客管理还有课程分类模块、课程管理模块等。

3、项目使用的技术栈是什么,技术架构是怎么样的:

前端采用的是 :vue全家桶等

后端采用 SpringBoot做主体框架、nginx部署前端系统把跨域反向代理为不跨域、SpringSecurity做授权与认证、SpringData做数据访问层控制,全文检索使用Elasticsearch、redis做数据缓存、rabbitmq作为消息中间件、数据库使用MySQL、swagger2编写接口文档,项目中的图片上传及图片存储展示使用的一款开源的文件服务器,该文件服务器是基于MongoDB作为文件信息存储此外还针对视频的播放采用的是阿里云视频点播技术等。

 

4、项目开发周期:

(①需求确认;②原型设计;③UI设计;④程序开发;⑤测试&验收;⑥上线,) 本项目开发人员有2个前端4个后端,开发周期六个月,期间有百分之八十的时间是和前端约定整理接口,逻辑分析和表的设计、等。剩下的时间就完成代码书写,测试优化等。

 

5、项目中你的职责是什么:

我担任前端的首页模块、阅读博客详情、新闻模块、后端的用户管理模块和前后端用户对于权限的控制以及用户认证方式的登录模块和注册模块。

 

登录:

对于权限的控制以及用户认证登录等功能,我们使用了SpringSecurity这个安全框架,它负责用户的认证与授权,认证就是用户登录认证,授权就是对于用户的权限操作比如要进入(个人主页、博客编辑、点赞、评论等等)都需要进行登录,然后后台管理有一个动态路由的处理对于不同等级的管理员划分不同的控制模块,SpringSecurity有一些核心类,可以以注解的形式对我们Controller进行权限把控。

 

怎么根据权限实现动态路由效果:

使用springSecurity的RBAC权限模型,基于角色的权限控住,我们使用的是以注解方式定义在接口上进行权限的标识(然后会给各个功能提供对应的权限表(menu表),还有角色表可以理解为权限组表,一个角色对应多个权限,当然一个权限对应多个角色,此时就需要一个中间表来对应。那么用户和角色也是一样的)登录的时候把权限信息封装到UserDetails实现类中,然后实现getAuthorities方法,框架底层Authentication就会调用此方法获取传进来的权限信息存入redis,那么在登录接口里就可以从redis经过过滤器取出权限信息给到usernamepasswordAuthentionToken中,到时候springSecurity就可以拿到对应的权限信息,进行相应的校验。

 

基本流程:

​ 在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。然后设置资源所需要的权限即可。

=================================================================

注册:

注册要求用户能够在注册界面完成用户的注册。要求用户名,昵称,邮箱不能和数据库中原有的数据重复。如果某项重复了注册失败并且要有对应的提示。并且要求用户名,密码,昵称,邮箱都不能为空而且密码必须密文存储到数据库中可以使用我们 jwt 技术进行加密处理,然后添加到表中。

 =================================================================

 

首页模块

首页模块查询浏览量最高的前10篇文章等信息。要求展示文章标题、浏览量、点赞数、时间等。把能让用户自己点击跳转到具体的文章详情进行浏览。此外不能把草稿展示出来,不能把删除了的文章查询出来。要按照浏览量进行降序排序,我们可以在表中设计相应的字段从而避免这些问题。

 =================================================================

 

阅读博客详情:

用户在点击某个同学博客文章的时候会跳转到文章详情页面,可以让用户阅读文章正文,就需要在文章详情中展示其分类名、发布时间、阅读量、评论和发表评论。

 =================================================================

 

新闻模块:

新闻模块有最新发布、推荐新闻、热门新闻、新闻评论、搜索新闻等,基本的新闻展示也是对数据库的一个查询和排序等操作,搜索新闻使用到的是es搜索引擎,帮助用户在海量信息中快速搜索到对应信息。

 =================================================================

 

用户管理模块:

对用户表进行一些增删改查的操作

 =================================================================

 

6. 你觉得项目中有什么特色/亮点

在我负责的这几个模块和功能中,我的一个测试代码覆盖率达到了百分之八十以上主要使用了junit单元测试框架还有我的一个书写格式和注释的标识都有去严格遵守公司的一个规定。
然后我也会对编写代码时进行优化,通过日志去记录接口的调用信息(有打印所访问这个接口的URL、业务的一个名称或者说接口的一个名称、http请求方式、方法所在的类还有方法名、访问接口的ip地址、请求参数、响应参数数据),这样可以便于我们进行一些调试和排查,然后因为可能有很多的接口对原有的功能去增加这个功能的增强并且都要进行一个增强,所以我采用的是一个spring AOP(面向切面)的一个方式它可以是批量的进行增强,而且aop的增强功能对原有的逻辑没有任何耦合所以aop比较适合。

 

7. 你开发项目过程中有没有遇到过什么问题(重点)

在阅读博客详情当中有一个展示浏览量的功能,每个用户在点进去这条博客的时候就会赠加浏览量的数量,一开始是对对应的博客表里面修改一条字段viewcont来实现的,在测试的时候出现了问题,实际上对一条字段的更改默认情况下mysql会对这条记录进行一个写锁的,那在写锁的情况下如果有其他用户进行一个访问其实是会受到影响的,如果并发量大的情况下肯定会对性能造成影响。

解决方案

所以跟我一旁的同事讨论,引入redis,那么对应浏览次数更新的时候前端请求到后端后端直接从redis里面进行更新,读的话也从redis里面去读。但开始的时候是redis是没有对应博客的一些浏览次数的,那么可以在程序启动的时候可以先把mysql当中的博客id和浏览量读取出来然后把id做为key浏览量作为值存到redis中,那么在实际操作的时候前端请求后端,后端对reids里的对应浏览量的数据进行递增。然后就是在程勋启动时把博客的浏览量存储到redis中,我们可以实现CommandLineRunner这个注解加入到spring容器后,这样就会在程序启动的时候就spring会帮助我们执行对应的代码,然后我们还会用到rabbitmq延时死信队列每隔10分钟把Redis中的浏览量异步更新到数据库中也可以防止数据丢失问题(比如redis数据在更新完之后,mysql数据更新完之前,redis挂掉了也不会丢失数据)。然后读取文章浏览量的时候就从redis里面读取就解决了这个问题。

复制代码
问题:文章浏览量的递增如果只是更改表里字段高并发的情况下会对性能造成影响

1、在应用启动时把博客的浏览量存储到redis中

2、每隔10分钟把Redis中的浏览量更新到数据库中

3、更新浏览量时去更新redis中的数据

4、读取文章浏览量时从redis读取
复制代码

 

8. 你做完项目有什么感受

在我做阅读博客详情的时候,在展示父子评论时的子评论出现了问题,接口能查到但是前端不显示也是思考了挺久,最终发现了我的问题,vo类里的封装子评论的list集合字段名跟前端的不对应,所以出现了前端取不到数据的情况改一下就可以了。在解决问题之前啊我去问前端的兄弟才知道 。也是感受到了团队的重要性。

 

posted @   张栈  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示