先上博客链接:www.zr7.top
全套资料和源代码已上传至Gitee:https://gitee.com/da-ji/full_stack_developer,大家需要可自取
笔者是一名非科班出身,对编程非常感兴趣的一名在校学生。在今年11月初,我学完了SSM阶段。但是对知识的掌握仅仅停留在网络视频以及技术书籍上的了解,并没有任何实际的项目经验。所以就产生了做一个综合项目的想法。
在寻找这类综合项目时,我却迷茫了。首先是网上的开源项目眼花缭乱,不知道哪些项目适合我现在的阶段。
最终我通过各种渠道,找到了各种各样的优秀综合项目:
通过对上面思维导图的梳理,我的思路逐渐清晰——那就是做一个个人博客项目。
原因如下几点:
这里我并不是说其他类型的综合项目不好,比如音乐播放系统,图书馆系统,网盘系统等等,它们也很优秀,但是最终将其发布到互联网,并连接到域名,由于种种原因,部署的实际意义并不是很大,但是它们的业务逻辑和涉及的知识点也很全面,适合自己练手做。
前台显示借鉴:燕十三的前端模板(已于Gitee上开源)
后台管理借鉴:李仁密老师——SpringBoot开发一个小而美的个人博客(已于GitHub上开源,并有相关视频教学)
虽然借鉴了他们的开源代码学习,但是在编写的实践过程中,后台和前台并不是互通的(李仁密和燕十三根本就不认识),导致他们之间的接口不互通,对此我只能自己设计后端部分和接口。
而且第一版博客我并没有照着开源项目的SpringBoot架构写,而是用SSM头铁做的(就是为了感受一下XML配Bean,更深入的了解Spring),中间出现了很多版本兼容的问题。
真正进入了开发阶段,第一步大家应该都知道,就是先从GitHub上Clone下来人家的项目,跑一跑,确定能跑通之后,再照猫画虎地模仿。
这一时期大概花费了我五天左右,才搞清楚了人家的项目究竟是怎么一回事,技术点究竟有哪些。毕竟大家都是这样过来的,欲增加自己的功能,必先知道人家究竟是怎么跑的。
想学会跑,必先学会走,必须懂得循序渐进的道理,才能走的更远。
前面我已经介绍过,我所借鉴的两个开源项目之间并不互通。根据MVC架构的原则(什么是MVC架构,我之前博客有写),所以要自己设计从View层到Controller层之间的桥梁,也就是俗称的接口,是一种对接前后端的规范。然而Model层如何与Controller层交互的方法以及业务层和持久层的对接,开源项目中设计的极为巧妙,我也从中获取到了很多知识,并真切的感受到了Spring为我们带来的解耦。
后来添加新功能时,我也遵循着已经架构好的模式,自顶向下的进行开发。(此处有争议,为什么自顶向下,是因为我自己一人写了全栈,自顶向下我可以根据前端需要的数据,一步一步的添加方法,一直走到Dao层访问数据库。)具体实际开发是前后端分离的,可能我自己这种开发模式不是很科学,但是前后端都是我写的,规矩自然我来定。
下面放出几张我当时设计好的设计图:
到这一步就开始愉快的敲代码了,按照之前的设计,一个一个功能去实现。期间遇到了很多的问题,但是这一时期也是我进步最快最大的时期,我也在此期间总结出了很多技术博客。
下面将一一介绍编写博客过程中踩过的坑。
前台的页面显示大家都能在我的网站中看到。下面就说一下大家看不到的地方以及后台管理的部分功能好了:
个人博客项目的主营业务(对博客的CRUD操作),实现了从Redis中读,从MySQL中写,从而加快了响应速度。
将所有除了父评论(爹级)的所有评论(不管你是子,孙,曾孙,重孙)找出来,并且一视同仁,全部视作父评论的子评论。
也就是说不管它们在数据库里面有多复杂的关系(子,孙,曾孙,重孙这种连续几级关系),一律一视同仁,看作子级。只要你上面有父级评论(数据库中parent_comment_id不为-1),那么一视同仁。
因为在前端页面中,只有两层关系:父级评论和子级评论
这点有点像链表,有数据域和指针域。并递归调用寻找子集评论的方法查询出所有子孙级评论。
后台可以上传博客首图到数据库中,为此我还总结出博客:
SSM或SpringBoot上传图片到数据库
人家网上的开源项目数据库都是一对一的,我为了挑战自我(作死),硬给改成了多对多的。因此出现了非常多的问题,好在后来都一一解决了,并且大大提升了我的SQL能力。
在处理这一问题的时候,我也是相当于把整个MyBatis和SQL语句都复习了一遍,总结出了不少博客和不少文章,欢迎大家观看:
最开始我学RESTful风格的时候,认为只是一种风格而已,没有必要遵守,但是后来的麻烦教我做人了。
之前因为自己开发经验不足,在Controller里面接口都是乱写,动不动就是@RequestMapping,直到集成swagger进行接口测试的时候,傻眼了。
先给大家看看正常的接口是啥样的:
每个接口的GET \ POST分工明确,各自有不同的功能。
再给大家看看我因为乱用@RequestMapping带来的后果:
看似有这么多接口,但是只对应了一个方法。产生这问题的原因就是乱使用@RequestMapping
经此以后,终于理会了好好设计接口,使用RESTful风格的必要性
之前写某个功能模块的子功能模块的接口路径地址,一直瞎起名。直到有一天我集成了Shiro,要进行资源过滤时,傻眼了。
假如你要对一组资源进行权限过滤,最方便的方式是利用Shiro的通配符(/**),这样的话,假如你这一组资源路径是不遵循规范,随机命名的,不但不美观,而且过滤就会带来极大的不便。不能使用通配符,只能一个一个手动过滤。
这里就是自由探索阶段了。网络上的学习视频只有单个技术,不会手把手教你如何将这门技术应用到你自己的项目中。不过有了之前的基础,倒是也不难。
先上图,我自己实现的附加功能(对号的是已实现的,未勾选的是还未实现,会随本人技术栈陆续更新):
以下是我集成的各个功能,如无特殊说明,链接内资料都是我自己写的(打个小广告,涨涨访问量)
Shiro不同身份多个Realm的问题及反思
SSM环境下整合Shiro,网页过滤不生效
Redis远程连接Linux云服务器(Jedis方式或Springboot方式)
狂神说Java的b站视频 【狂神说Java】一小时掌握Swagger技术
【MyBatis】PageHelper无法处理多对多查询分页问题
【分页查询】在SSM环境中使用PageHelper
SSM或SpringBoot上传图片到数据库
后期这个系列会持续更新,欢迎大家关注我。
这个需要好好说道说道了。
首先,如果想走这一步,必须先有Linux的相关知识。网络上关于Linux的学习资源也很多,我也学习了总结了不少。
先给出一张自己的学习路线吧,画的有点乱,后期有时间会精修一下:
还有我写的几篇关于Linux的排坑博客:
Linux如何联网,以及SecureCRT解决中文乱码问题.
【Debug】本地JDK和阿里云服务器JDK不一致,jar包在Linux上跑不起来
Linux直接通过端口号杀对应进程,lsof命令无效
SpringBoot项目打成war包,部署到远端Linux服务器
在进入下一个阶段之前,建议先自己在本地的电脑上安装一个Linux的虚拟机(我使用的是VMware):
在本地环境下敲熟了,再去购买云服务器部署。
这里就是上一个阶段的实战和应用了,有了Linux的前置知识,并不难。
下面介绍我的学习路线:
最后说一下关于域名备案
备案没有大家想象的那么复杂,照着阿里云官方的指引(腾讯云,华为云也一样)一步一步做就好。是阿里云先审核你,阿里云的审核过了才会提交到工信部审核。
阿里云的审核就一天,而且你有些地方填的不对,客服小姐姐会给你打电话纠正。工信部审核就比较慢了,官方给出的时间是18天,因各地区而异。
笔者所在的山东地区,仅用了9天就通过了!必须得夸一下大山东的办事效率!
域名备案完事之后,想要将域名连接到你的端口,只需要配置一下Nginx的域名映射即可:
阿里云服务器安装Nginx以及配置Nginx域名映射
该网站从构思到实际落地,共用了一个多月的时间,期间肯定有很多不足之处。如果各位看官在我的网页浏览体验不佳,我先要说一声抱歉。该博客一直在更新,体验一定会越来越好的。
通过这次个人博客的开发,对自己的提升真的不是一点半点,强烈建议大家学完一个阶段,都要找一个项目来实际练手,这样既能加深印象,还能以练促学。
当然,对我影响最大的还是各位大佬们的技术输出,他们的开源项目,技术分享态度,正代表了互联网精神。在仰望他们之余,正视自己的不足,努力填补短板,更坚定了自己在编程之路上走下去的决心和信念。
最后,希望自己能一直保持对技术的初心。非科班出身的我,正是因为热爱,才选择了编程,虽然之前因为找不到方向,走了大量的弯路,但我还是幸运的。相信以后的路会越走越宽。
欢迎大家访问我的博客!