个人博客系统项目总结

项目的简单介绍

首先,因为我个人有写博客的习惯,所以我就仿造 CSDN 简单实现了一个自己的个人博客系统。该项目由用户模块,博客模块,评论模块组成。用户模块主要负责的是用户的注册和登录,用户头像的修改等。博客模块主要是博客的发布,删除,修改,点赞,浏览等功能。评论模块包含博客的评论,回复等。

项目具有下面几个亮点:

首先是将 Session 存储到了 Redis 中,实现了 Session 的共享,使得其在分布式环境下可以使用。

然后我对密码进行了一个加盐加密操作,保证了密码的安全性。

我使用 Redis 实现了点赞功能,因为 Redis 的写入和读取速度非常快,很适合点赞这种高频率操作。

然后就是我对博客展示列表页面增加了一个分页功能。

目前就是我项目的介绍,老师您如果您有哪些想详细了解的可以指出来。


1.密码加盐加密

MD5密码是一种数字摘要算法,它可以将任意长度的字符串转换成一个128位的散列值,也就是一个16字节的数字。

为什么要使用加盐加密呢? 首先如果只是单纯使用 MD5 加密,由于 MD5 加密每次生成的值都是相同的,很容易通过暴力枚举的方式进行破解。而加盐加密通过生成随机 32 位盐值,每次生成的密码都是不同的,增加密码安全性。

加密功能
  • 先使用 UUID 生成一个随机的 32 位的盐值,并用 String 的 replace 方法替换掉其中的横杠。
  • 将盐值和输入的密码相加,并使用 DigestUtils 对其进行 MD5 加密。生成一个最终密码。
  • 最后将盐值加上最终密码返回。

解密功能

  • 首先,从数据库中获取存取的加密过的密码,获取密码的前 32 位盐值。
  • 使用盐值加上输入的密码使用 DigestUtils 对其进行 MD5 加密。
  • 判断加密后的密码是否与数据库中的密码相等。
/**
     * 对密码进行加密
     * @param password
     * @return
     */
    public static String encrypt(String password){
        // 随机生成不同的 32 位的盐值
        String salt = UUID.randomUUID().toString().replace("-","");//替换“-”为空
        // 生成最终密码 (盐值 + 密码) 进行加密
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        return salt + finalPassword;
    }

    /**
     * 解密验证密码正确性
     * @param password 待验证的密码
     * @param finalPassword 数据库中饭加密了的密码
     * @return
     */
    public static boolean decrypt(String password,String finalPassword){
        // 获得前面 32 位的盐值
        String salt = finalPassword.substring(0,32);
        // 通过待验证密码 + 盐值生成最终待确认密码
        String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        return finalPassword.equals(salt + securityPassword);
    }

2.分页功能

初始化当前总页面数量函数实现。

  • 首先从前端获取到每页的大小。
  • 然后通过 MyBatisPlus 的 list() 获取到总博客数量。
  • 用博客数量 / 每页大小就得到总页数。如果结果是小数,如 3.5,则页数为 4,其它同理。
 /* 初始化总页数 */
    @Override
    public Object initTotalPage(Integer pageSize) {
        List<Blog> blogs = list();
        if(blogs != null) {
            // Math.ceil: 如果是  2.x 结果为 3
            return (int) Math.ceil(blogs.size() * 1.0 / pageSize);
        }
        return 0;
    }

初始化博客列表函数实现。

  • 首先先判断传入的 pageIndex 和 pageSize 是否为空。
  • 通过页面大小和当前页面索引计算偏移量。
  • 通过 MyBatis 进行数据库查询到该页面的博客。
 public List<Blog> initBlogs(Integer pageIndex, Integer pageSize){
        if(pageIndex != null && pageSize != null && pageIndex > 0 && pageSize > 0) {
            Integer offset = pageSize * (pageIndex - 1);
            return mapper.initBlogs(pageSize,offset);
        }
        return null;
    }
    <select id="initBlogs" resultType="com.example.demo.entity.Blog">
        select * from blog_info limit #{pageSize} offset #{offset}
    </select>

3.点赞功能

  • 首先获取到当前的用户对象。
  • 使用字符串结合被点赞的的博客 id 作为 Redis 的 key。
  • 通过当 key 和前用户 id 查询 Redis 中的数据,判断是否已经点赞过。
  • 如果没有点赞过,则将点赞记录加入到 Redis 和数据库中,数据库中的点赞数 -1。
  • 如果点赞过,则将 Redis 和数据库中的点赞记录清除,数据库中的点赞数 + 1。

Redis 中的点赞记录是存储在 Set 中的,每一个 Set 代表一个博客,存储的是给博客点赞过的用户 id。

而数据库中的点赞记录表如下图所示:使用了 blog_id 和 user_id 保证每条记录的唯一性。

    @Transactional
    public Object likeBlog(HttpServletRequest request,String likedBlogId) {
        // 得到当前用户对象
        User curUser = SessionUnit.getLoginUser(request);
        if(curUser == null) {
            return AjaxResult.fail(-1,"当前用户对象为空");
        }
        // 创建 Redis key: RedisKey + 博客ID
        String key = RedisKeyUtils.BLOG_LIKED_KEY + likedBlogId;
        // 判断当前用户是否点赞过
        /* 这里返回的是一个 Boolean, 可能为空, 这样可以防止空指针异常 */
        /**/

        boolean liked = Boolean.TRUE.equals(stringRedisTemplate.opsForSet().isMember(key,curUser.getId().toString()));
        // 如果该用户已经点赞过
        if(liked) {
            /* 数据库操作 */
            // 点赞数量 - 1
            boolean isSuccess = blogService.update().setSql("like_count = like_count - 1").eq("id",likedBlogId).update();
            if(!isSuccess) {
                return AjaxResult.fail(-1,"数据库更新失败");
            }
            // 移除数据库中该条记录
            QueryWrapper<BlogLike> wrapper = new QueryWrapper<>();
            wrapper.eq("blog_id",likedBlogId);
            wrapper.eq("user_id",curUser.getId());
            remove(wrapper);

            /* Redis 操作 */
            // 移除 set 中的该条记录
            stringRedisTemplate.opsForSet().remove(key,curUser.getId().toString());
        } else {
            // 用户没有点赞过
            // 点赞数量 + 1
            boolean isSuccess = blogService.update().setSql("like_count = like_count + 1").eq("id",likedBlogId).update();
            if(!isSuccess) {
                return AjaxResult.fail(-1,"数据库更新失败");
            }
            // 新增一条点赞记录
            /* 这里一直报类型错误,暂时不知道什么原因,用传统的  MyBatis 好了 */
            // BlogLike blogLike = new BlogLike(Integer.valueOf(likedBlogId),curUser.getId());
            // save(blogLike);
            mapper.saveLike(likedBlogId,curUser.getId().toString());


            /* Redis 操作 */
            // 新增 set 一条记录
            stringRedisTemplate.opsForSet().add(key,curUser.getId().toString());
        }
        return AjaxResult.success(1,"用户点赞成功");
    }
测试用例设计

功能测试:

  • 能否正常点赞和取消点赞。(这里没有实现,是商铺点评系统项目的:点赞后的用户是否按照时间顺序排序)。
  • 多个用户点赞同一篇博客点,是否记录了每个用户的点赞。

性能测试:

  • 点赞的响应是否够迅速。
  • 多用户某一时间段同时点赞同一篇博客的响应速度。
  • 在点赞数据量非常大的时候的响应速度。

界面测试:

  • 点赞的按钮是否美观。
  • 按钮的布局是否合理。

安全性测试:

  • 用户在未登录的情况下是否可以点赞。

易用性测试:

  • 点赞按钮是否容易被用户找到。
  • 点赞后成功的反馈是否直观。

兼容性测试:

  • 在不同浏览器下能否兼容。
  • 在不同的设备能否兼容。如手机,电脑,平板。

如果是按照接口测试来设计的话:

  • 正常和异常情况的测试
  • 接口方法:更换不同的方法进行测试,如 Post,Delete 等。
  • 参数:更改参数的类型,顺序等进行测试。
  • 业务逻辑:对该方法的业务逻辑进行测试,检查 Redis,MySQL 中是否有数据。

项目的部署

修改前后端内容并打包

前端:

修改 Axios 的路径 Url,路径记得加 http://,不然拦截器配置即使排除还是会拦截。

// axios.defaults.baseURL = "http://localhost:9090"
axios.defaults.baseURL = "Your own host + Port"

修改完前端配置后,将其打包生成 dist 文件夹:

npm run build

后端:

修改上传图片的文件路径:

    // 保存头像的文件路径
    // public static final String AVATAR_FILE_PATH = "D:/IDEA Project/MyProject(Github)/MyBlogSystem-III/vue/public/img/avatar/";

    // Linux 中存放图片的文件路径
    public static final String AVATAR_FILE_PATH = "/home/mycnblog-pplus/vue/dist/img/avatar/";

修改配置文件 application.yml 和 application.properties

修改 Redis 的库序号( database )

# Redis Configuration
spring.redis.host="Your own host"
spring.redis.password="Your own password"
spring.redis.port=6379
spring.redis.database=4
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

修改 MySQL 的密码,如果没有密码则设置为空:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mycnblog_pplus?characterEncoding=utf8&useSSL=false
    username: root
    #如果要部署到云服务器这里密码要更改(没有密码则为空)
    password: "Your own password"
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 配置数据源类型
    type: com.zaxxer.hikari.HikariDataSource

修改完成后,双击 package 即可将项目打成 Jar 包

在 target 文件夹中找到已经打包好的 Jar 包

部署项目

Vue 项目部署:可以看这篇博客,讲的很详细 VUE项目部署-CSDN博客

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
个人博客系统源码下载个人博客系统源码下载 本项目基于ssh2+Oracle三大框架开发 项目需求概述 1.1. 概述 随着计算机技术的发展和普及,blog 得到了极大的发展。Blog,是 Weblog 的简称。blog 是一种新的生活方式、新的工作方式、新的学习方式和交流方式。本需求说明书的编写目的, 是为了描述本项目的需求背景,总结项目需要完成的开发任务,从而便于系统分析人员和 开发人员在此基础上进行总体设计和详细设计,便于手册编写人员以此为指导编写用户手 册。 本需求说明书的预期读者为 SmartBlog 开发人员和测试人员。 1.2. 主要功能 SmartBlog 博客系统是一个简单的博客系统,实现部分功能。主要提供管理用户(博主) 能够在指定分类下发表日志、对日志进行编辑和删除等功能。一般用户能够浏览日志,对日 志进行评论。日志管理和显示都需要提供分页功能。主要的功能划分为:首页模块、日志评 论模块、登录模块、后台管理模块,以下是各个模块的功能介绍: 序号 模块名称 主要功能 1 首页模块 显示博客的 LOGO 信息和主菜单,包括首页的链接, 登录(已登录用户显示后台管理和退出) 分页页显示 Java 分类下日志 提供日志评论功能 2 日志评论模块 对文章进行评论和评论显示 3 用户登录模块 提供用户登录功能,随机生成验证码验证 4 后台管理模块 提供日志的查询、删除、修改、新增功能 提供分页功能 1.3. 运行环境 1. 软件环境 分类 名称 版本 语种 操作系统 Windows XP 简体中文 数据库平台 Oracle10g 简体中文 北京阿博泰克北大青鸟信息技术有限公司 应用平台 Tomcat5.5 简体中文 客户端软件 动漫阅读器 APK 简体中文 Java 开发工具 Eclipse3.4 以上 框架 Spring+Struts2+Hibernate3 2. 硬件环境 开发电脑 最低配置 推荐配置 CPU:P4 2.0G  CPU:P4 2.8G 以上 内存:1G 内存:2G
本校园博客系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据校园博客系统的现状来进行开发的,具体根据现实的需求来实现校园博客系统网络化的管理,各类信息有序地进行存储,进入校园博客系统页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人中心、博主管理、文章分类管理、文章信息管理、举报投诉管理、系统管理,博主;首页、个人中心、文章信息管理、举报投诉管理、我的收藏管理,前台首页;首页、文章信息、系统公告、个人中心、后台管理、在线客服等功能。 本论文主要讲述了校园博客系统开发背景,该系统它主要是对需求分析和功能需求做了介绍,并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的校园博客系统状况,提高管理效率。 关键词:校园博客系统;Spring Boot框架,mysql数据库 本校园博客系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据校园博客系统的现状来进行开发的,具体根据现实的需求来实现校园博客系统网络化的管理,各类信息有序地进行存储,进入校园博客系统页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人中心、博主管理、文章分类管理、文章信息管理、举报投诉管理、系统管理,博主;首页、个人中心、文章信息管理、举报投诉管理、我的收藏管理,前台首页;首页、文章信息、系统公告、个人中心、后台管理、在线客服等功能。 本论文主要讲述了校园博客系统开发背景,该系统它主要是对需求分析和功能需求做了介绍,并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的校园博客系统状况,提高管理效率。 关键词:校园博客系统;Spring Boot框架,mysql数据库 本校园博客系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据校园博客系统的现状来进行开发的,具体根据现实的需求来实现校园博客系统网络化的管理,各类信息有序地进行存储,进入校园博客系统页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人中心、博主管理、文章分类管理、文章信息管理、举报投诉管理、系统管理,博主;首页、个人中心、文章信息管理、举报投诉管理、我的收藏管理,前台首页;首页、文章信息、系统公告、个人中心、后台管理、在线客服等功能。 本论文主要讲述了校园博客系统开发背景,该系统它主要是对需求分析和功能需求做了介绍,并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的校园博客系统状况,提高管理效率。 关键词:校园博客系统;Spring Boot框架,mysql数据库
摘 要 i Abstract ii 第1章 引言 1 1.1 系统的开发背景 1 1.2 系统开发的意义 1 1.3 系统实现的目标 2 第2章 开发技术和开发工具简介 3 2.1 开发技术简介 3 2.1.1 ASP.NET技术 3 2.1.2 C#语言 4 2.1.3 SQL 4 2.1.4 Javascript语言 4 2.1.5 Jquery 5 2.1.6 AJAX 5 2.1.7 CSS+DIV 6 2.2 开发工具简介 6 2.2.1 Microsoft Visual Studio 2010 6 2.2.2 SQL SERVER 2008 6 第3章 系统的需求分析 7 3.1 可行性分析 7 3.2 需求分析 7 3.3 系统业务流程分析 8 3.4 系统功能模块设计 8 第4章 系统数据库设计 10 4.1 数据库概念结构设计 10 4.2 数据库逻辑结构设计 13 第5章 系统的详细设计 17 5.1 系统用例图 17 5.2 登录功能设计 17 5.3 注册功能设计 18 5.4 管理博文功能设计 19 5.4.1 新增博文 19 5.4.2 编辑博文 19 5.4.3 删除博文 20 5.5 管理个人信息功能设计 20 5.5.1 修改头像功能 21 5.5.2 修改个人基本信息功能 21 5.5.3 修改密码功能 22 5.6 修改版面样式功能设计 23 5.7 私信功能设计 23 5.8 关注他人、取消关注他人功能设计 24 5.9 找回密码功能设计 24 5.10 退出登录功能设计 24 第6章 系统的功能界面与实现 25 6.1 登录功能 25 6.2 注册功能 28 6.3 个人信息管理功能 31 6.4 博文管理功能 33 6.5 私信管理功能 36 6.6 版面样式设置功能 37 6.7 朋友圈管理功能 39 6.8 博客主页 39 6.9 访问统计 40 6.10 找回密码 40 第7章 系统测试 41 7.1. 系统的功能测试 41 7.2. 其他非功能性的测试 41 7.3. 存在的缺陷 41 7.4. 主要问题和风险 41 7.5. 总体质量评估 42 总结 43 参考文献 44 致谢 45
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、付费专栏及课程。

余额充值