spring boot之从零开始开发自己的网站
概述
做了一些改造,增加了一些功能和一些代码的重构,并且更换了博客主题。
关于项目,对于开发的练手项目,能够工程化,严谨一些。
关于文档,本文主要中从项目需求,项目设计的方式来阐述.
如何从零开始,使用springboot开发项目。
记录一些在开发过程中遇到的一些问题,总结开发技巧
接下来,会以需求和设计方式来阐述
效果图
首页展示
文章编辑
文章管理
项目需求
项目背景
对于刚学习springboot的同学,最好的就是拿一个项目练练手。在编码过程中遇到的问题并解决,这都是宝贵的经验。 用springboot开发的博客系统,简单而且实用,适合做练手项目。
功能需求
界面需求
主页
- 博客汇总,以列表加图片的形式展示
- 能够以分类的方式查看文章
- 能够以时间列表的方式归档文章
- 个人介绍,github地址
- 搜索框,能够搜索文章
后台管理
管理主页,记录最新文章,最新留言,最近日志等
- 最近日志记录登录IP,地址,操作等
- 记录一天的访问量
发布文章
- 使用markdown编辑器,支持插入代码,插入图片等功能
- 能够给文章添加缩略图。
- 可将文章存为草稿或者发布
- 文章可选择分类和标签,自定义url
- 文章可控制是否允许评论
文章管理
- 以列表形式展示文章信息
- 在可选操作中增加删除,预览,编辑功能
- 支持分页显示
- 增加搜索功能,可根据文章名文章信息
分类管理
- 可以新增、删除、修改分类
文件管理
- 支持文件上传
- 支持删除已上传的文件
友情链接
- 支持增加友情链接
- 支持删除友情链接
系统设置
- 支持修改密码
- 支持备份数据库
- 支持黑名单配置
非界面需求
- 日志记录,记录来访IP名单
- 每天定时备份数据库
安装部署需求
- 可以使用docker方式部署,也可支持-jar方式
- 使用springboot自带方式打包
非功能性需求
性能需求
- 首页响应的时间不超过1秒钟
- 文章页响应时间不超过1秒钟
项目设计
总体设计
本项目用到的技术和框架
- 项目构建: maven
- web框架:spring boot
- 数据库ORM:mybatis
- 数据库连接池:Druid
- 分页插件:PageHelper
- 数据库:mysql
- 缓存NOSQL:redis
- 前段模板:thymeleaf
- 文章展示:使用commonmark,将markdown转成html页面
本项目的关键点
- 采用springboot开发,数据库使用连接池加orm框架的模式,对于系统的关键业务使用redis缓存,加快响应速度
- 整体系统采用门户网站+后台管理的方式搭建,门户主要展示博客内容,后台管理主要用于编辑文章,上传附件,控制黑名单登录等。
环境
结构设计
熟悉spring开发的同学,相信对此结构图也并不陌生。平时的开发过程中,结构设计是重要的缓解,特别是协作开发的时候,明细的分包,模块化,可减少在git提交时的冲突。
业务设计
本模块主要介绍一些关键的业务流程。
发布文章流程:
修改文章的流程大致上和发布是相似的,这里不再赘述了
登录流程
文件上传
- 在写文章的时候,通常会使用到图片,可以引用一些网络上的图片,更好的是本系统支持上传文件和图片
- 将文件区别为图片和其他,图片支持预览模式
- 文件路径设计成绝对路径,在web系统中可直接引用
- 文件按月份归类,文件名以uuid的重新命名存储
- 其他文件支持下载
- 文件上传流程图
- 首页展示
- 首页也文章列表+图片的形式展示内容,默认最大显示12篇文章,包括发布时间和分类
- 上部展示菜单栏,支持搜索,归档页等功能
- 右侧显示菜单栏,展示个人github地址,个人信息,标签云等
- 使用redis缓存首页的html页面,加速访问。
打包、部署和运行
- 本项目采用springboot的maven插件进行打包,打成jar形式
- 部署方式:使用**nohub java -jar xxx.jar &**的方式,启动项目
数据设计
用户表:t_users
用户表主要管理后台管理用户。
文章表:t_contents
主要管理文章内容,外键为cid
标签表:t_metas
管理标签信息,外键为mid
文章标签关系表:t_relationships
记录文章和分类的关系,多对多表
性能与可靠性
性能设计
- 将文章内容写入redis中,加快访问速度
可靠性设计
- 后台管理,可以系统日志,查看系统运行状态
- 定时发送邮件,发送服务端的可用内存,cpu,最新日志,硬盘情况进行监控
- 对于恶意的IP,支持黑名单设置,禁止访问
开发流程
数据库的curd
首先,编写sql语句,创建数据库。
本项目的crud操作采用mybatis的逆向功能,对于特殊操作,需要自己手写sql语句
springboot如何使用mybatis,以及mybatis的逆向工程,请参考springboot与mybatis
编写service层,根据需求分析和概要设计,将具体业务转成具体代码
关于事务的使用,使用srping中的@Transactional,还是很方便的
本流程的开发不是特别难,关键在于业务的实现
页面与展示
作为一个后端开发,css的功力还是有所欠缺的,所以也是用了妹子UI主题,和tale的后端页面,大大减少了页面的开发难度,特此感谢
页面与后端的交换主要是在controller包中,springboot的页面开发和springmvc是几乎一样的,@PostMapping和@GetMapping这两个注解也是方便了开发。
统一的异常处理,使用@ControllerAdvice,定义异常页面,设置自动跳转500,404页面。
拦截器,获取http请求中的ip,判断是否在黑名单(如果在,则禁止访问系统)
其他功能
该项目是在My blog基础上修改的,修复了部分bug,增加添加黑白单功能,指定文章缩略图
分析访问量最多的数据,主要在于文章访问部分,将文章放入redis缓存。每次编辑完文章后,更新缓存
每天定时发送邮件,汇报服务器运行状态和最新日志,手机即可查看。
系统安全
使用阿里云云主机,借助阿里云本身防护机制,
在主机中安装denyhosts,对于尝试暴力破解ssh的IP,实施封禁
对于评论部分,能够抵御sql注入和xss攻击
打包测试
使用springboot本身测试方式,在集成测试之前,先进行单元测试
打包,使用springboot的mvn插件,打成jar包
网站建设
- 服务器选用的是阿里云centos7
- 域名是腾讯送的
- 网站需要备案,备案的话,只要按照阿里云提示的流程走,就可以了,就是上传个人身份信息,和审核,大概需要一个月的时间
开发总结
以上是我学习springboot总结的一些博客,特此分享
网站地址
spring boot之从零开始开发自己的网站的更多相关文章
- Spring Boot Web应用开发 CORS 跨域请求支持:
Spring Boot Web应用开发 CORS 跨域请求支持: 一.Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等CORS与JSONP相比 1. JSONP只能实现 ...
- Spring Boot 企业级应用开发实战 刘伟东-2018年3月第一版
Spring会自动搜索某些路径下的Java类 并将这些类注册微Bean实例,这样就省去了所有Bean都配置在XML的麻烦 Spring会适当地将显示指定路径下的的类全部注册微Spring Bean . ...
- 图书-技术-SpringBoot:《Spring Boot 企业级应用开发实战》
ylbtech-图书-技术-SpringBoot:<Spring Boot 企业级应用开发实战> Spring Boot 企业级应用开发实战,全书围绕如何整合以 Spring Boot 为 ...
- 居然仅用浏览器,就完成了Spring Boot应用的开发与部署!
最近有幸试用了一下阿里云的一个新产品:云开发平台,体验一把全新的开发模式!虽然中间也碰到了一些问题,但整体的体验透露着未来感,因为整个过程都不需要使用我们最常用的IDEA,仅依靠浏览器就把一个Spri ...
- spring boot纯注解开发模板
简介 spring boot纯注解开发模板 创建项目 pom.xml导入所需依赖 点击查看源码 <dependencies> <dependency> <groupId& ...
- 【Spring Boot】web开发
springboot在开发web项目的时候具备天然的优势,现在的很多企业级开发都是依托于springboot的. 使用springboot的步骤: 1.创建一个SpringBoot应用,选 ...
- 一个.net专业户转Spring Boot V2.0开发的体会
java web的idea开发工具总体用起来还是比vs差很多,但是在使用Hibernate跟MyBatis的感触,Hibernate有着.net core ef没有的细腻,Hibernate在细节上完 ...
- Spring Boot的web开发
web开发的自动配置类:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 自动配置的ViewResolver 视图的 ...
- SSM到Spring Boot从零开发校园商铺平台
项目目的 特别 由于准备春招,所以希望各位看客方便的话,能去github上面帮我Star一下项目 https://github.com/Draymonders/Campus-Shop emmm, 已经 ...
随机推荐
- 查看Linux系统的平均负载
1.Linux系统的平均负载的概念 有时候我们会觉得系统响应很慢,但是又找不到原因,这时就要查看平均负载了,看它是否有大量的进程在排队等待.特定时间间隔内运行队列中的平均进程数可以反映系统的繁忙程度, ...
- JavaScript进阶(十一)JsJava2.0版本
JavaScript进阶(十一)JsJava2.0版本 2007年9月11日,JsJava团队发布了JsJava2.0版本,该版本不仅增加了许多新的类库,而且参照J2SE1.4,大量使用了类的继承和实 ...
- 循环链表设计与API实现
基本概念 循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素 循环链表拥有单链表的所有操作 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos ...
- 为多态基类声明virtual析构函数
一个函数的返回值为基类指针,而当指针指向一个派生类对象,接下来派生类对象被这个基类指针删除的时候,就出现了局部销毁的问题.因为C++指出,当派生类经由一个基类指针被删除,而该基类指针带着一个non-v ...
- Slop One 算法
Slope One 算法是由 Daniel Lemire 教授在 2005 年提出的一个 Item-Based 推荐算法. Slope One 算法试图同时满足这样的的 5 个目标: 易于实现和维护: ...
- 根据isbn获得图书的所有信息
几点说明 1这个豆瓣的api https://api.douban.com/v2/book/isbn/:9787549208869 可以以json的形式返回书籍的所有信息 2最开始的时候是我自己写的用 ...
- 如何让minicom换行
以前在使用minicom验证裸板代码的时候,经常会遇到以下这个问题: 通常一直打数据往后打就只能打一行,然后就不能换行了,遇到这个问题如何解决? 看到屏幕下方提示:CTRL-A Z for hel ...
- Unity UGUI
超详细的基础教程传送门:(持续更新中) Unity UGUI之Canvas&EventSystem:http://blog.csdn.net/qq992817263/article/detai ...
- PS 滤镜算法原理——拼贴
%%%% Tile %%%%% 实现拼贴效果 %%%%% 将原图像进行分块,然后让图像块在 %%%%% 新图像范围内进行随机移动,确定移动后的边界 %%%%% 将移动后的图像块填入新图像内 clc; ...
- RubyMotion之父:Ruby是目前替代Objective-C的最佳iOS开发语言
发表于2012-08-16 00:52| 21716次阅读| 来源CSDN| 24 条评论| 作者杨鹏飞 RubyMotionRubyObjective-CiOSJava 摘要:曾几何时,PC端有那么 ...