spring boot之从零开始开发自己的网站

概述

  • 首先要感谢两位大神,该项目的想法来源自tale和MyBlog。

  • 做了一些改造,增加了一些功能和一些代码的重构,并且更换了博客主题。

  • 关于项目,对于开发的练手项目,能够工程化,严谨一些。

  • 关于文档,本文主要中从项目需求,项目设计的方式来阐述.

  • 如何从零开始,使用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常用注解

  • srpingboot整合mybatis

  • springboot之邮件的发送

  • springboot之thymeleaf的使用

  • springboot之定时任务

  • springboot之netty的使用

  • springboot之redis的整合与使用

  • 以上是我学习springboot总结的一些博客,特此分享

网站地址

www.janti.cn

项目代码

 喜欢的话,给个推荐,给个star鼓励一下

如果有项目上的一些问题,可直接邮箱我 jantent@qq.com

 

转载于:https://www.cnblogs.com/superfj/p/9044532.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python day5--正则表达式

#----正则表达式 import re elink <a href"(.*)">(.*)</a> info <a href"http://www.baidu.com">baidu</a> cinfo re.findall(elink,info) print (cinfo) import re print(re.search (r^a,abc\neee)) #预期结果 ^匹配字符开…

WCF系列教程之WCF客户端调用服务

1、创建WCF客户端应用程序需要执行下列步骤 (1)、获取服务终结点的服务协定、绑定以及地址信息 (2)、使用该信息创建WCF客户端 (3)、调用操作 (4)、关闭WCF客户端对象 二、操作实例 1、WCF服务层搭建:新建契约层、服务层、和WCF宿主,添加必须的引用(这里不会的参考本人前面的随…

短信认证方案,用手机短信进行上网认证如何实现?

WFilter NGF的“Web认证”模块&#xff0c;提供了一系列的上网认证解决方案。包括如下认证方式&#xff1a;本地用户名密码认证AD域用户名密码认证企业邮箱用户名密码认证Radius用户名密码认证微信WiFi认证Facebook Wifi认证除此&#xff0c;WFilter NGF还有一个“其他”的选项…

Nginx 之一:编译安装nginx 1.8.1 及配置

转http://www.cnblogs.com/zhang-shijie/p/5294162.html 一&#xff1a;基介绍 官网地址www.nginx.org&#xff0c;nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的&#xff0c;开发工作最早从2002年开始&#xff0c;第一次公开发布时间…

PI校正环节的程序实现推导过程

PI校正环节在经典控制论中非常有用&#xff0c;特别是对负反馈控制系统&#xff0c;基本上都有PI校正环节。1.下面分别说明比例环节和积分环节的作用&#xff0c;以阶跃信号为例。①比例环节单独作用以上分析说明&#xff0c;若只有比例环节的控制系统&#xff0c;阶跃响应也是…

vs里根据json快速创建对应类的方法

有时候,我们在调用别人接口的时候,服务端返回了一个json格式的字符串,我们要获取json里面的数据的话一般有两种方式: 1.通过正则 2.反序列化成一个对象 第一种方式这里不再多说,主要说一下第二种,(为什么呢&#xff0c;你看到后面 你也会喜欢上第二种) 有人肯定会说, json字符串…

人工智能之基于face_recognition的人脸检测与识别

不久乘高铁出行&#xff0c;看见高铁火车站已经实现了“刷脸进站”&#xff0c;而且效率很高&#xff0c;很感兴趣&#xff0c;今天抽时间研究一下&#xff0c;其实没那么复杂。 我基本上是基于https://github.com/ageitgey/face_recognition上的资料和源码做一些尝试和试验。 …

iOS 升级https的方案选择

我的选择是将UIWebView统一替换为WKWebView WKWebView AFN SDWebImage https的支持之前的博客都有涉及转载于:https://www.cnblogs.com/Jusive/p/6867531.html

Python3抓取糗百、不得姐

​点击关注 异步图书&#xff0c;置顶公众号 每天与你分享 IT好书 技术干货 职场知识 重要提示1:本文所列程序均基于Python3.6,低于Python3.6的Python版本可能无法运行.重要提示2:因所抓取的网站可能随时更改展示内容,因此程序也需及时跟进.重要提示3:本程序仅供学习,不能拿去做…

Oracle优化-表设计

前言  绝大多数的Oracle数据库性能问题都是由于数据库设计不合理造成的&#xff0c;只有少部分问题根植于Database Buffer、Share Pool、Redo Log Buffer等内存模块配置不合理&#xff0c;I/O争用&#xff0c;CPU争用等DBA职责范围上。所以除非是面对一个业已完成不可变更的系…

Win10远程桌面 出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP加密Oracle修正 解决方法...

升级至win10 最新版本10.0.17134&#xff0c;远程桌面连接Window Server时报错信息如下&#xff1a; 出现身份验证错误&#xff0c;要求的函数不正确&#xff0c;这可能是由于CredSSP加密Oracle修正。 解决方法&#xff1a; 运行 gpedit.msc 本地组策略&#xff1a; 计算机配置…

Rsyslog 日志相关内容

[rootserver vusers_home]# rpm -ql rsyslog|more ###.so结尾为模块&#xff0c;模块有分im为输入模块&#xff0c;om 为输出模块/etc/logrotate.d/syslog/etc/pki/rsyslog/etc/rc.d/init.d/rsyslog/etc/rsyslog.conf/etc/rsyslog.d/etc/sysconfig/rsyslog/lib64/rsyslog…

MFC导出对话框类DLL的实现

1.新建基于对话框的应用程序 2.新建MFC DLL工程 3.选择MFC DLL 4.选择扩展Dll选项&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09; 5.为Dll工程添加一个MFC类&#xff0c;基类为CDialogEx 6.Dll新建的MFC 类中添加resource.h防止编译出错…

身于“乱世”,我们程序员应该如何打算?

今天看了这篇文章&#xff0c; 发现自己也有点生处乱世&#xff0c;不平之感&#xff0c;但是文章的朴实却让我有了一个良好的反省&#xff0c;特此转载 分类&#xff1a; 项目管理 2011-09-04 00:58 770人阅读 评论(12) 收藏 举报 不仅要低头拉车&#xff0c;还要抬头看路。…

es6--箭头函数

基本用法 ES6允许使用“箭头”&#xff08;>&#xff09;定义函数。 var f v > v; 上面的箭头函数等同于&#xff1a; var f function(v) {return v; }; 如果箭头函数不需要参数或需要多个参数&#xff0c;就使用一个圆括号代表参数部分。 var f () > 5; // 等同于…

NYOJ题目839合并

--------------------------- AC代码&#xff1a; 1 import java.util.Scanner;2 3 public class Main {4 5 public static void main(String[] args) {6 7 8 Scanner scnew Scanner(System.in);9 10 int timessc.nextInt(); 11 …

python多进程

2019独角兽企业重金招聘Python工程师标准>>> python多进程 进程简介 进程是程序在计算机上的一次执行活动。当你运行一个程序&#xff0c;你就启动了一个进程。显然&#xff0c;程序是死的(静态的)&#xff0c;进程是活的(动态的)。进程可以分为系统进程和用户进程。…

夺命雷公狗---node.js---20之项目的构建在node+express+mongo的博客项目5mongodb在项目中实现添加数据...

我们上一步就引入了mongodb了&#xff0c;那么下一步就要开始写添加数据了&#xff0c;不过有个前提是先将表单的数据处理好&#xff1a; 最基本的这部现在已经成功了&#xff0c;因为最基本的这步就是先将表单处的提交方式和提交地址给处理好&#xff0c;这里和PHP的基本上是一…

音频中采样位数,采样率,比特率的名词解释(转)

采样位数&#xff08;采样大小&#xff09;&#xff1a; 采样位数可以理解为采集卡处理声音的解析度。这个数值越大&#xff0c;解析度就越高&#xff0c;录制和回放的声音就越真实。我们首先要知道&#xff1a;电脑中的声音文件是用数字0和1来表示的。所以在电脑上录音的本质就…

WebSocket实时异步通信

WebSocket实时异步通信 【一】WebSocket简介 WebSocket是HTML5推出一个协议规范&#xff0c;用来B/S模式中服务器端和客户端之间进行实时异步通信。 众所周知&#xff0c;传统的HTTP协议中&#xff0c;服务器端和客户端通信只能是在客户端发送一个请求之后&#xff0c;服务器端…