从零开发博客系统:1.需求设计与方案设计

需求设计与方案设计

1 背景与规划

1.1 背景

  很早就想通过写博客,对自己的技术进行反思与沉淀,但是由于拖延症晚期,一直没有实际执行,而且市面上的各种博客系统创建的博客页面总是有很多第三方的元素,显得页面很繁琐,我个人是很讨厌这些多余的东西,所以就有了自己搭一个博客的念头。
  最初是2016年的时候打算用wordpress来搭建,因为整体框架已经成熟,api也很完善。但是用起来需要对这些api很熟悉才能灵活的定制博客,否则就会束手束脚,而且当时编程能力还比较差,对前端代码几乎一无所知,写起来十分困难,加上刚换了工作,就没有更深入的去了解。
  这两年以来用业余时间断断续续学习了一些前端技术,而且实际工作中对系统架构设计的理解也有了比较大的成长,所以就萌生了从零搭建一个纯净博客系统的念头,

1.2 规划

1.2.1 第一版

  • 用最简单粗暴的代码实现功能。
  • 支持文章的发布、修改与查看(离线发布)。
  • 可以增加删除文章分类(分类分为主分类和副分类,比如主分类:技术,下属有PHP、MySQL、Linux等副分类)。
  • PC浏览美观,暂不考虑移动端的兼容。
  • Google、百度等搜索引擎可搜到

1.2.2 第二版

  • 兼容移动端,考虑使用bootstrap的响应式布局。
  • 线上线下配置分离
  • 对代码进行模块化的封装
    1. 后端代码抽象出路由模块、数据库模块、网络请求模块、http响应模块。
    2. 前端代码抽象出网络请求模块。

1.2.3 第三版

  • 支持评论、订阅功能
  • 支持线上发布、修改文章(权限控制)
  • 多机部署
  • 将文章合成自动生成的js代码,实现简单的防爬机制

2 技术选型

最终选用的技术栈如下:

前端:Vue
后端:Golang(gin框架) + MySQL + Nginx + Linux

2.1 前端

  其实一年前我对前端技术还是一无所知,大概2017年5月份左右,有了一个想做教育APP的想法,直到17年12月左右工作的压力才逐渐小了一些,每天大概有两小时左右的业余时间可以搞一些小玩意。
  当时考虑到做APP的话,无论Andriod还是iOS如果想做原生APP,学习成本太高,而且要做两套APP,就选了学习成本最低的微信小程序。小程序一旦写好,甚至不需要安装就可以获得媲美原生APP的功能,还有微信的流量,实在是方便。小程序使用的语言又恰好和html、js、css很像,于是这才渐渐有了一些了解。
  回到这次开发博客的技术栈,在经过同学还有同事的安利后,前端框架决定使用Vue,轻量级框架,学习成本较低。

2.2 后端服务开发语言

  后端服务的话,由于我本身是做了三年的PHP开发,使用PHP开发博客的话,几乎没有什么新的技术难题,更不用说成长了。PHP属于动态脚本语言,所以打算使用一种之前没用过的静态编译型语言。
  近些年来,Golang作为一门新兴语言,实在是劲头火热,各大公司的许多项目也在向Golang逐渐转型,所以我选择Golang作为后端开发语言,虽然可能暂时用不到channel和协程这些语言特性,但也可以为学习新语言打开一扇大门了。
  本来Golang是可以不用框架,直接裸写服务,不过之前面试罗辑思维的时候,了解过他们框架用的gin,网上查了查发现这属于一个轻量级框架,似乎评价还可以,所以就打算拿来用用,正好在博客的第二版可以对框架进行一些二次开发,增加一些技术难题和工作量。

2.3 反向代理服务器

  Golang的服务器前面我是打算再搭一个Nginx,1是为了后续流量上升后的负载均衡做准备,2是因为js、css等静态资源肯定需要一个web服务器提供服务。反正CDN暂时是不考虑了orz

2.4 数据库

  数据库选择使用MySQL,毕竟MySQL可以说是当前业界最流行的关系型数据库。
  MongoDB这种数据库说实话我还没用过,从网上的资料看起来的应用场景似乎也不太匹配,这次就不用了,等后续有时间再看看吧。
  Redis暂时也就不用了,一开始似乎也不需要用到这种设备,用了反而增加系统复杂度。

2.5 操作系统

  服务器的操作系统不多哔哔,就是Linux,其他也不废话了。

3 数据库设计

3.1 文章详情表

第一版主要实现以下几个功能

  • 方便的增加、修改
  • 浏览数计数
  • 记录创建、修改时间
  • 记录文章分类

建表语句如下:

CREATE TABLE `article_detail` (
 `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID',
 `uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '文章ID',
 `content` text COMMENT '文章内容',
 `browser_count` bigint(11) NOT NULL DEFAULT '0' COMMENT '浏览数',
 `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
 `main_category_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '主类别ID',
 `sub_category_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '副类别ID',
 `title` varchar(255) NOT NULL DEFAULT '' COMMENT '文章标题',
 `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
 PRIMARY KEY (`id`),
 UNIQUE KEY `idx_uuid` (`uuid`),
 KEY `idx_main_category_uuid` (`main_category_uuid`),
 KEY `idx_sub_category_uuid` (`sub_category_uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  表结构就不多说了,加了三个索引,uuid是每个文章的唯一标记,主、副类别ID的索引是为了在筛选文章列表的时候加快查询速度用的。加索引在数据量够大时,可以增加查询速度,具体原理以后会写文章讲解。

3.2 主副类别表

建表语句如下:

CREATE TABLE `main_category` (
 `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID',
 `uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '主类别ID',
 `title` varchar(255) NOT NULL DEFAULT '' COMMENT '类别名称',
 `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
 PRIMARY KEY (`id`),
 UNIQUE KEY `idx_uuid` (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `sub_category` (
 `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID',
 `uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '副类别ID',
 `title` varchar(255) NOT NULL DEFAULT '' COMMENT '类别名称',
 `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
 `main_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '对应的主类别ID',
 PRIMARY KEY (`id`),
 UNIQUE KEY `idx_uuid` (`uuid`),
 KEY `idx_main_uuid` (`main_uuid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

  其实这么建表我是有点纠结的,很多地方,为了父子节点的拓展方便,可能会只建一张表,然后表内有一个父节点ID的字段,就可以实现无限多级的父子关系,不过我觉着这里没必要有无限多级的父子关系,而且建两张表的话,父子关系会更清晰。

4 接口设计

主要需要以下几个接口,这里只写接口功能,具体的接口名就无所谓了

  • 增加文章
  • 修改文章
  • 增加主分类
  • 增加副分类
  • 获取主分类列表
  • 获取副分类列表
  • 根据主副分类获取文章列表
  • 获取文章详情
  • 提交图片(因为文章里可能会有图片,需要把图片上传到服务器)

5 项目实施

设计阶段应该到此为止了,接下来的博文会按照以下步骤开始实施项目:

  1. 按照接口的功能,先写前端代码,本地Mock数据,调试通过
  2. 编写后端代码,与前端代码调试通过
  3. 将MySQL、Nginx、Golang等服务搭好
  4. 将代码部署到服务器

猜你喜欢

转载自blog.csdn.net/FYA_93/article/details/81670585