个人博客系统项目总结

一、项目简介

       个人博客系统采用前后端分离的方式来实现,使用数据库来存储相关的数据。前端由五个页面构成,分别是注册页面、登录页面、博客列表页、博客详情页、博客编辑页,这五个页面模拟实现了博客的最基础的功能。其结合后端实现了以下的功能:注册功能、登录功能、查看博客功能、发布博客功能、博客展示功能。

二、项目使用的技术

HTML、CSS、JS、Ajax、SpringMVC、MyBatis、MySQL

三、项目数据库设计

       由于这是一个简易版的博客系统,因此在数据库的设计中还是比较简单的,只有三张表:用户表、图片表和文章表

--创建用户表
create table users (
    uid int primary key auto_increment,
    username varchar(50) not null unique,
    password varchar(50) not null,
    git_repo varchar(200) not null,
    avatar_url varchar(200) not null comment '保存头像URL地址'
);
--创建图片表
create table images (
    imgid int primary key auto_increment,
    content longblob not null comment '保存图片的内容二进制数据'
);
--创建文章表
create table articles (
    aid int primary key auto_increment,
    uid int not null,
    title varchar(100) not null,
    published_at datetime not null,
    category varchar(20) not null,
    content text not null
);

四、项目效果

1、注册页面

2、登录页面

3、博客列表页

4、博客详情页

5、博客编辑页

五、项目实现

       首先要明确该博客系统的需求,即实现注册功能、登录功能、查看博客功能、发布博客功能、博客展示功能。接下来分别对这五大功能的实现做详细解释。

1、实现注册功能

实现逻辑是:

1)先把用户提交的图片保存到images表中,得到一个imgid(不考虑失败的情况);

2)根据imgid得到一个图片的URL,即/images/<imgid>;

3)把username、password、git_repo,img_url插入用户表(不考虑失败的情况);

4)完成注册

实现这个注册功能用到的资源:

①静态资源有/user/register.html、/user/register.css

②动态资源有/user/register.do,这个资源用来读取用户填写的信息、将图片保存到images表中以及将用户信息保存到users表

2、实现登录功能

实现逻辑是:

1)将用户提交的用户名和密码在数据库中进行查询,如果可以查询到相关记录,则登录成功,否则登录失败

2)将登录成功的用户信息放入session中

实现这个登录功能用到的资源:

①静态资源有/user/login.html、/user/login.css

②动态资源有/user/login.do,这个资源的作用有两个,一是根据用户名和密码查询到对应的用户,二是利用Cookie+Session机制保存当前用户的对象信息

实现Cookie+Seeion机制的代码为:

HttpSession session = request.getSession(true);
session.setAttribute("currentUser", user);

3、实现博客展示功能(即在首页显示多篇文章摘要的功能)

实现逻辑是:

先根据session中的内容判断当前用户是否登录

登录分两种情况:

第一种情况:用户未登录,却在博客列表页,这里我们需要把这个页面跳转到登陆页面

第二种情况:用户已登录,此时我们需要要考虑博客列表页的数据渲染情况,这里我们要分两大区域来考虑

1)个人信息区域(即个人头像、用户名、git地址、文章总数、文章分类)

对于这个区域,我们的处理方式:

首先我们知道个人头像、用户名、git地址是可以通过用户表和图片表查询得到的,而文章分类和文章数量需要我们通过特定的SQL语句才能得到,所以这里我们的处理方法是将这里的五个属性放到一个类中,这样就可以通过新建的这个类的对象去得到这五个属性了

这是具体实现的代码:

@GetMapping("/current.json")
    @ResponseBody
    public CurrentResult getCurrentUser(HttpServletRequest request) {
        //1、根据session中的内容判断当前用户是否登录
        User currentUser = null;
        HttpSession session = request.getSession(false);
        if (session != null) {
            currentUser = (User) session.getAttribute("currentUser");
        }

        if (currentUser == null) {
            //用户未登录
            return CurrentResult.notLogin();
        } else {
            //用户已登录
            //查询文章数量
            int articleCount = articleMapper.countByUid(currentUser.uid);
            int categoryCount = articleMapper.countCategoryByUid(currentUser.uid);
            return CurrentResult.login(currentUser, articleCount, categoryCount);
        }
    }

上面代码中的CurrentResult类为

public class CurrentResult {
    public String result;
    public UserWithCount user;

    public static CurrentResult notLogin() {
        CurrentResult result = new CurrentResult();
        result.result = "未登录";
        result.user = null;
        return result;
    }

    public static CurrentResult login(User user, int articleCount, int categoryCount) {
        UserWithCount userWithCount = new UserWithCount(user, articleCount, categoryCount);

        CurrentResult result = new CurrentResult();
        result.result = null;
        result.user = userWithCount;
        return result;
    }
}

上面代码中的UserWithCount类的代码为

@Data
public class UserWithCount extends User {
    public int article_count;
    public int category_count;

    public UserWithCount(User user, int article_count, int category_count) {
        this.uid = user.uid;
        this.username = user.username;
        this.password = user.password;
        this.avatar_url = user.avatar_url;
        this.git_repo = user.git_repo;
        this.article_count = article_count;
        this.category_count = category_count;
    }
}

2)内容区(即显示多篇文章摘要的区域)

这里因为还没有实现发布博客功能,因此暂时不讨论

实现这个博客展示功能用到的资源:

①静态资源有/blog/index.html、/blog/loyout.css、/blog/list.css、/js/list.js;

在/js/list.js中JS通过Ajax请求动态资源/user/current.json得到用户的登录情况,通过Ajax请求动态资源/article/list.json得到该用户所有文章的摘要

②动态资源有/user/current.json、/images/<imgid>、/article/list.json;

/user/current.json这个动态资源根据Cookie+Seeion机制获取当前登录用户信息

/images/<imgid>这个动态资源根据imgid获取对应的图片

/article/list.json根据当前登录用户获取他发表的所有文章

4、实现发布博客功能

实现逻辑是:

先根据session中的内容判断当前用户是否登录

登录分两种情况:

第一种情况:用户未登录,却在博客编辑页,这里我们需要把从这个页面跳转到登陆页面

第二种情况:用户已登录,此时我们需要要考虑文章的发表时间、文章的保存问题

具体的代码为

LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
String publishedAt = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

        Article article = new Article();
        article.uid = currentUser.uid;
        article.title = title;
        article.category = category;
        article.published_at = publishedAt;
        article.content = content;

        articleMapper.insert(article);

        //return "发表成功";
        return "redirect:/blog/detail.html?aid=" + article.aid;

实现这个博客发布功能用到的资源:

①静态资源有/blog/edit.html、/blog/edit.css

②动态资源有/article/save.do

/article/save.do这个动态资源做的是收集用户提交的数据,然后将这些数据保存

这个功能开发完之后,就可以使用博客的发布功能了,也就可以解决第三点实现博客展示功能中遗留的问题了,即在用户已登录的情况下,对内容区(即显示多篇文章摘要的区域)的展示

解决的具体逻辑是

首先根据session中的内容判断当前用户是否登录

登录分两种情况:

第一种情况:用户未登录,此时我们要求返回一个空的顺序表

第二种情况:用户已登录,我们要先根据用户的uid查询到该登录用户所有的文章,因为这里只是展示文章的摘要,因此我们需要对该用户的每篇文章做一定的处理,处理的逻辑是如果文章的字数(准确来说是长度)小于等于100,那么就不做处理,否则只留一百个字(准确来说是长度)。将所有文章处理完后,再依次把它们放入一个顺序表中,经过js的处理将这些文章摘要展示到文章列表页中

对文章的处理逻辑的代码是

public static ArticleSummary build(Article article) {
        ArticleSummary articleSummary = new ArticleSummary();
        articleSummary.aid = article.aid;
        articleSummary.title = article.title;
        articleSummary.published_at = article.published_at;
        if (article.content.length() <= 100) {
            articleSummary.summary = article.content;
        } else {
            articleSummary.summary = article.content.substring(0, 100);
        }

        return articleSummary;
    }

5、实现查看博客功能

实现逻辑是:

1)在博客列表页点击查看全文按钮就会跳转到博客详情页

2)每个查看全文按钮都对应着一个aid,从数据表中根据aid查询文章的标题、文章的发表时间、文章的正文

3)JS通过Ajax请求/article/get.json,然后操作DOM树得到博客详情页的具体文章信息

实现这个查看博客功能用到的资源:

①静态资源有/blog/detail.html、/blog/detail.css、/js/detail.js;

/js/detail.js这个静态资源通过Ajax请求/user/current.json得到用户的登录情况,通过Ajax请求/article/get.json?aid=<aid>得到具体文章的信息

②动态资源有/user/current.json、/images/<imgid>、/article/get.json?aid=<aid>;

/user/current.json这个动态资源根据Cookie+Seeion机制获取当前登录用户信息

/images/<imgid>这个动态资源根据imgid获取对应的图片

/article/get.json?aid=<aid>这个动态资源根据aid查询到对应的文章

六、项目代码

1、项目环境

IDEA + MySQL

2、项目布局

3、项目代码

Gitee链接:yan/blog_project

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 系统需求 该个人博客系统需要支持以下功能: - 注册和登录功能。 - 文章的发布、修改、删除和查看功能。 - 评论功能。 - 分类和标签管理功能。 - 搜索功能。 - 友情链接功能。 - 管理员后台管理功能。 2. 技术选型 - 后端框架:Spring Boot - 数据库:MySQL - 前端框架:Vue - 前端UI库:ElementUI - 数据交互:RESTful API 3. 系统架构 该个人博客系统采用前后端分离的架构,前端使用Vue框架,后端使用Spring Boot框架。前后端之间通过RESTful API进行数据交互。 后端主要包含以下几个模块: - 用户模块:包含用户注册、登录、密码修改等功能。 - 文章模块:包含文章的增删改查、分页查询等功能。 - 评论模块:包含评论的增删改查功能。 - 分类和标签模块:包含分类和标签的增删改查功能。 - 搜索模块:包含搜索文章和评论的功能。 - 友情链接模块:包含友情链接的增删改查功能。 - 管理员模块:包含管理员登录、文章管理、分类管理、标签管理、评论管理等功能。 4. 数据库设计 系统需要存储的数据包括用户信息、文章信息、评论信息、分类信息、标签信息、友情链接信息等。 - 用户表(user):存储用户的基本信息,包括用户ID、用户名、密码、邮箱等字段。 - 文章表(article):存储文章的详细信息,包括文章ID、标题、内容、发布时间、分类ID、标签ID等字段。 - 评论表(comment):存储评论的详细信息,包括评论ID、评论内容、评论时间、文章ID、用户ID等字段。 - 分类表(category):存储文章的分类信息,包括分类ID、分类名称等字段。 - 标签表(tag):存储文章的标签信息,包括标签ID、标签名称等字段。 - 友情链接表(link):存储友情链接的信息,包括链接ID、链接名称、链接地址等字段。 5. API设计 - 注册接口:POST /api/user/register - 登录接口:POST /api/user/login - 文章列表接口:GET /api/article - 文章详情接口:GET /api/article/{id} - 文章发布接口:POST /api/article - 文章更新接口:PUT /api/article/{id} - 文章删除接口:DELETE /api/article/{id} - 评论列表接口:GET /api/comment - 评论详情接口:GET /api/comment/{id} - 评论发布接口:POST /api/comment - 评论更新接口:PUT /api/comment/{id} - 评论删除接口:DELETE /api/comment/{id} - 分类列表接口:GET /api/category - 分类详情接口:GET /api/category/{id} - 分类发布接口:POST /api/category - 分类更新接口:PUT /api/category/{id} - 分类删除接口:DELETE /api/category/{id} - 标签列表接口:GET /api/tag - 标签详情接口:GET /api/tag/{id} - 标签发布接口:POST /api/tag - 标签更新接口:PUT /api/tag/{id} - 标签删除接口:DELETE /api/tag/{id} - 搜索接口:GET /api/search?q={keyword} - 友情链接列表接口:GET /api/link - 友情链接详情接口:GET /api/link/{id} - 友情链接发布接口:POST /api/link - 友情链接更新接口:PUT /api/link/{id} - 友情链接删除接口:DELETE /api/link/{id} 6. 前端页面设计 - 首页:展示最新文章、分类、标签、友情链接等。 - 文章列表页:展示文章列表,支持分页和搜索功能。 - 文章详情页:展示文章详细信息和评论列表,支持评论功能。 - 分类列表页:展示分类列表,支持添加、编辑和删除分类。 - 标签列表页:展示标签列表,支持添加、编辑和删除标签。 - 友情链接页:展示友情链接列表,支持添加、编辑和删除友情链接。 - 登录页:用户登录页面。 - 注册页:用户注册页面。 7. 系统部署 - 后端部署:使用Maven构建Spring Boot项目,打成jar包,然后使用java -jar命令启动项目。 - 前端部署:使用npm安装Vue项目依赖,然后使用npm run build命令打包项目。 - 数据库部署:使用MySQL数据库,将数据库脚本导入数据库即可。 总结 基于Spring Boot和Vue的个人博客系统设计,实现了用户的注册和登录、文章的发布、修改、删除和查看、评论、分类和标签管理、搜索、友情链接、管理员后台管理等功能。该系统采用前后端分离的架构,通过RESTful API进行数据交互,实现系统的高效和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值