当前位置: 首页 > Web前端 > vue.js

手写一个Hexo评论系统(二)

时间:2023-04-01 00:21:52 vue.js

继上一篇《手写一个Hexo评论系统(一)》之后,本文主要介绍评论系统实现的一些具体设计方案和技术细节,方便日后修改或重构。还有项目部署问题,包括域名解析、Nginx配置代理、云服务器选择等。选服务器的坑真的很大,尽量选大厂的,稳定的,好用的,不用太在意多少钱,按自己的需要买配置更划算.上次列出了以下需求。想象一下按照这些需求如何设计:1.无需登录验证码,直接评论即可2.支持评论回复,无限递归回复3.支持评论点赞,按赞排序,按时间排序如果是同一个管理系统,可以设置相应的属性6.支持评论导出,高度100%可恢复数据界面和UI设计第一版的UI是这样的,整体风格比较简洁,这也是我最喜欢的风格。文章加载后,审稿人将获得一个随机的昵称和头像。点击昵称可以切换昵称和头像,但都是随机的。然后是三个输入框,邮箱输入框,评论内容,文章评分。所以整体分为两部分,一部分是用户信息和评论框,另一部分是具体的评论展示区,只要想清楚了就可以入手。无论如何,它是PC的Web端UI。我直接去ElementUI。其实挺适合的,尤其是展示具体评论的时候,最适合按时间线展示,评分组件也很OK,很好看。是的,以后有空再试试其他的组件库!交互流程设计首先,用户一打开博客就可以获得一个随机的头像和昵称,维护用户的状态,所以整体思路如下:首先,对于一个从未打开过博客页面的用户,在浏览器端存储的clientID一定没有这个字段,可以直接判断为新用户,所以去后台申请一个ClientID,并分配一个随机的昵称和头像,发送这个用户信息到数据库,即使用户点击刷新了昵称和头像,但是ClientID并没有变,这样用户信息就已经保存下来了。如果客户端ID在浏览器中已经存在,那么数据库中应该有对应的用户信息,所以直接请求后台获取用户数据即可。第二个问题,后台怎么知道哪些评论属于哪些博客?其实这里用了一个比较简单的方法,就是直接根据URL来判断。同一个url一定是同一个博客,但是这个也是有缺陷的,就是本地调试的时候是localhost:8080开头,但是远程是zouchanglin.cn,这样本地的测试数据就不会显示在官方博客中评论。而且zouchanglin.cn和zouchanglin.gitee.io上的评论也不尽相同。其实,这是不合理的。域名应该和URL的其余部分分开,这样通用性会更好。我会在有空的时候做这个。重构。第三个问题,用户设置了邮箱后如何通知对方?其实对于这样的客户端设计,只要用户填写邮箱,评论或者回复,就可以设置邮箱,因为这样可以大大降低业务的复杂度,只要你的邮箱发生变化,你的下次评论要通知的时候,我肯定会填一个新的邮箱,这样可以直接更新整个用户的邮箱,很方便。数据库设计数据库采用MySQL8.0。首先是设计客户端信息表,代表用户信息(主要包括客户端ID、Email、昵称、创建时间、头像、客户端OS等信息,如果需要可以添加其他字段):然后文章信息表(主要字段有文章URL,文章评论数),一条数据对应一个博客,博客评论总数,其实可以用URL作为主键,但是为了以后修改方便,还是决定自定义生成主键比较好。然后是评论表,这里我把评论分为两种,一种是文章评论(主要字段是文章ID,comment_parent是无效字段,评论客户端ID,评论内容,点赞数,创建时间,文章评分),即文章正下方的评论;另一个是子评论(主要字段是文章评论ID,评论客户端ID,评论内容,点赞数,回复客户端ID,创建时间),这个就是对文章评论的回复。当然不管是文章评论的子评论还是子评论的回复评论,都存储为子评论,分两张表。唯一不同的是,文章评论会存储在哪篇文章下的评论,子评论会存储在哪篇文章评论下,会存储回复的客户是谁,所以也存储了reply_client字段.后台系统设计点击进入后台代码仓库:https://gitee.com/zouchanglin/comment-box后台系统还是基于SpringBoot的后台服务,比较常见技术,SpringMVC、SpringDataJPA等,平时使用较少的邮件发送服务。其实使用spring-boot-starter-mail发送邮件并不太好用。需要注意的是后端的跨域问题。需要配置一个允许跨域的配置类,但是后面部署的时候推荐使用Nginx同域部署,就不存在跨域问题了。这是目前我最喜欢的解决方案。项目部署问题1、购买云服务推荐腾讯云88/年,百度云太贵,一直用阿里云。腾讯云同学还是可以买的。1核2G的配置其实已经够用了。一开始脑子一跳,买了天翼云。虽然只有77元/年,但使用起来却极其困难,最高速度也只有130K/s。这么慢的速度谁受得了。宁愿多花几块钱买个好一点的,毕竟大厂靠谱。不买天翼云,不买天翼云,不买天翼云,重要的事情说三遍。2.解决HTTPS问题,其实整个代码都写完了,只剩下一个部署了,但是由于我的网站都是HTTPS,所以评论系统也必须是HTTPS,否则评论模块会因为浏览器的安全策略。无法加载。于是我通过域名解析了一个二级域名comment.zouchanglin.cn到服务器,并为这个二级域名申请了证书,就完全OK了。3、Nginx部署前端项目打包后,直接使用Nginx部署即可。顺便配置一下HTTPS证书,这样前端项目就可以通过HTTPS访问了。后端呢?不可能有https://comment.zouchanglin.cn:8080这样的URL,所以通过Nginx很容易解决这个问题,只要通过Nginx配置一个代理,就100%固定了,而且它一劳永逸地彻底解决。跨域问题,共享域名,也使用反向代理隐藏后端地址,更方便集中管理。所以我个人推荐使用Nginx将前后端部署在同一个域中。Nginx真的帮了大忙!后端项目application.yml配置如下,其实访问路径变成了http://127.0.0.1:8080/api/....server:port:8080servlet:context-path:/api记得关闭前端项目History模式,然后请求的baseURL写成:axios.defaults.baseURL='https://comment.zouchanglin.cn/api/'Nginx的配置文件如下如下:用户root;worker_processes2;events{worker_connections1024;}http{includemime.types;default_type应用程序/八位字节流;发送文件;keepalive_timeout65;gzip上;#HTTPS服务器服务器{listen443ssl;server_namecomment.zpuchanglin.cn;#配置证书ssl_certificate/opt/ssl_file/cn_chain.阴极射线管;ssl_certificate_key/opt/ssl_file/cn_key.key;ssl_session_cache共享:SSL:1m;ssl_session_timeout5m;ssl_ciphersHIGH:!aNULL:!MD5;/index.html;}location^~/api/{proxy_passhttp://127.0.0.1:8080;}}}集思广益改进思路,也可以评论留言...支持后台管理支持自适应移动端(需要调整宽高)支持Docker一键部署...原文地址:《手写一个Hexo评论系统(二)》