基于spring的博客系统(一)

news2024/12/23 16:09:22

         通过前⾯课程的学习, 我们掌握了Spring框架和MyBatis的基本使⽤, 并完成了图书管理系统的常规功能 开发, 接下来我们系统的从0到1完成⼀个项⽬的开发;

1. 项⽬介绍

使⽤SSM框架实现⼀个简单的博客系统 共5个⻚⾯

        1. 用户登录

        2. 博客发表⻚

        3. 博客编辑⻚

        4. 博客列表⻚

        5. 博客详情⻚

1.1 功能描述

        ⽤⼾登录成功后, 可以查看所有⼈的博客. 点击 《查看原文》 可以查看该博客的正⽂内容;

         如果该博客作者为当前登录⽤⼾, 可以完成博客的修改和删除操作, 以及发表新博客 ;

1.2 ⻚⾯预览

        登录页面:

        博客列表和博客详情⻚:

 博客发表和更新页:

2.  准备工作

2.1 数据准备

创建user表和blog表;

create database if not exists spring_blog_240908 charset utf8mb4;
use spring_blog_240908;
drop table if exists user;

create table user (
    `id` INT NOT NULL AUTO_INCREMENT,
     `user_name` VARCHAR ( 128 ) NOT NULL,
     `password` VARCHAR ( 128 ) NOT NULL,
     `github_url` VARCHAR ( 128 ) NULL,
     `delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,
     `create_time` DATETIME DEFAULT now(),
     `update_time` DATETIME DEFAULT now(),
     PRIMARY KEY ( id ),
    UNIQUE INDEX user_name_UNIQUE ( user_name ASC ))
    ENGINE = INNODB DEFAULT
    CHARACTER set = utf8mb4 comment = '用户表';

drop table if exists blog;
CREATE TABLE blog (
 `id` INT NOT NULL AUTO_INCREMENT,
 `title` VARCHAR(200) NULL,
 `content` TEXT NULL,
 `user_id` INT(11) NULL,
 `delete_flag` TINYINT(4) NULL DEFAULT 0,
 `create_time` DATETIME DEFAULT now(),
 `update_time` DATETIME DEFAULT now(),
 PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';


insert into user (user_name,password,github_url)values("shenmengyao","111111","https://gitee.com/smollye/projects");
insert into user (user_name,password,github_url)values("yuanyiqi","222222","https://gitee.com/smollye/projects");
insert into blog (title,content,user_id) values("第⼀篇博客","我是神喵我是神喵我是神喵",1);
insert into blog (title,content,user_id) values("第⼆篇博客","我是小黑我是小黑我是小黑",2);

数据库信息如下所示:

2.2 创建项⽬

        创建SpringBoot项⽬, 添加Spring MVC 和MyBatis对应依赖

2.3 准备前端页面

        把课博客系统静态⻚⾯拷⻉到static⽬录下

2.4 配置配置⽂件

server:
  port: 8087
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring_blog_240908?characterEncoding=utf8&useSSL=false
    username: root
    password: ******
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  configuration:
    map-underscore-to-camel-case: true #配置驼峰自动转换
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印Sql语句
  mapper-locations: classpath:mapper/**Mapper.xml
# 设置日志路径
logging:
  file:
    name: spring_blog_240908.log

2.5 测试

        访问前端⻚⾯:

        前端⻚⾯可以正确显⽰, 说明项⽬初始化成功;

3. 项⽬公共模块

        项⽬分为控制层(Controller), 服务层(Service), 持久层(Mapper). 各层之间的调⽤关系如下: 

        先根据需求完成实体类和公共层代码的编写;

3.1 实体类

@Data
public class Blog {
    private Integer id;
    private String title;
    private String content;
    private Integer userId;
    private String deleteFlag;
    private Date createTime;
    private Date updateTime;
}
@Data
public class User {
    private Integer id;
    private String userName;
    private String password;
    private String githubUrl;
    private Byte deleteFlag;
    private Date createTime;
    private Date updateTime;
}

3.2 公共层

3.2.1  统⼀返回结果实体类

 a. code: 业务状态码 

          200: 业务处理成功

         -1 : 业务处理失败

         -2 : ⽤户未登录

         后续有其他异常信息, 可以再补充.

b. msg: 业务处理失败时, 返回的错误信息         

c. data: 业务返回数据

业务状态码设置代码如下:

public class Constant {
    //返回业务的状态码设置
    public  final  static  Integer SUCCESS_CODE = 200;
    public final static Integer FAIL_CODE = -1;
    public final static Integer UNLOGIN_CODE = -2;
}

 返回结果实体类设置代码:

package com.example.spring_blog_24_9_8.model;

import com.example.spring_blog_24_9_8.constants.Constant;
import lombok.Data;

@Data
public class Result {
    private int code;
    private String msg;
    private Object data;

    /**
     * 业务成功时执行的方法
     */
    public static Result success(Object data){
        Result result = new Result();
        result.setCode(Constant.SUCCESS_CODE);
        result.setMsg("");
        result.setData(data);
        return result;
    }

    /**
     *  业务执⾏失败时返回的⽅法
     */
    public  static  Result fail(int code, String msg){
        Result result = new Result();
        result.setCode(Constant.FAIL_CODE);
        result.setMsg(msg);
        result.setData("");
        return result;
    }

    /**
     * ⽤⼾未登录时返回的⽅法
     */
    public static Result unlogin(int code,String msg,Object data){
        Result result = new Result();
        result.setCode(Constant.UNLOGIN_CODE);
        result.setMsg("用户未登录");
        result.setData(data);
        return result;
    }
}

3.2.2. 统⼀返回结果

package com.example.spring_blog_24_9_8.config;

import com.example.spring_blog_24_9_8.model.Result;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

    @ControllerAdvice
    public class ResponseAdvice implements ResponseBodyAdvice {
       //哪个接口执行统一结果返回
        @Override
        public boolean supports(MethodParameter returnType, Class converterType) {
            return true;
      }

        @SneakyThrows
        @Override
        //统一结果返回的具体逻辑
        public Object beforeBodyWrite(Object body, MethodParameter returnType,
                      MediaType selectedContentType, Class selectedConverterType,
                       ServerHttpRequest request, ServerHttpResponse response) {
               if (body instanceof Result){
                       return body;
                }
                 //对String 类型单独处理
                if (body instanceof String){
                    ObjectMapper mapper = new ObjectMapper();
                    return mapper.writeValueAsString(Result.success(body));
                }
                return Result.success(body);
            }
    }

3.3.3. 统⼀异常处理

@ControllerAdvice
@ResponseBody
public class ExceptionAdvice {
    @ExceptionHandler(Exception.class)
    public Result  exceptionAdvice(Exception e){
        return Result.fail(-1,e.getMessage());
    }
}

ps:本文就到这里结束了,该项目未完待续,谢谢观看;

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

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

相关文章

【Java算法】模拟

🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🧣 一.模拟算法 模拟算法和传统的算法有一些不同之处,更多的是对题目要求的理解,通过代码的方式去模拟实现一道题目在现实中的实现方法…

接口基础知识4概念纠正与补充说明

​接口基础知识4 1 请求方法的幂等性 幂等性的理解是没有问题的。但是请求方法和幂等性没有直接的关联。 在 REST API 设计中,幂等性非常重要,因为它保证了在重复请求的情况下,资源的状态始终保持一致,不会因为重复请求而发生副…

量化交易backtrader实践(一)_数据获取篇(1)_数据准备

我们需要使用backtrader来做量化交易回测,先解决一些前置问题: 需要回测哪几支股票,或者即时选取股票即时选取股票以什么形式,代码还是名称这些数据的格式是怎么样的,backtrader如何接收 在解决这些前置问题的过程中…

如何抽取一个特定页面从devExpress的例程集合中

https://download.csdn.net/download/haoyujie/89729356https://download.csdn.net/download/haoyujie/89729356相关资源。 devExpress界面库的例程的设计是有必要来吐槽的。其紧耦合和大捆绑,我认为是devExpress很重要的不友好,导致可用性差和学习曲线…

让AI算算国庆中秋,你究竟多休了几天

最近,2024年中秋和国庆的放假调休安排火速登上热搜: “上6休3,上3休2,上5休1,上2休7,再上5休1。” 是不是看着眼花缭乱?其实不仅你懵了,广大网友也集体抓狂:“这比高考…

Spring介绍和Log4j2

目录 一、模块组成二、基本用例-Spring框架基本使用、原理三、启用日志框架 Spring 有两个最核心模块: IoC 和 AOP。 IoC:Inverse of Control 的简写,译为“控制反转”,指把创建对象过程交给 Spring 进行管理。AOP:Asp…

python爬虫代理ip池搭建

最近大量爬取数据的时候总会遇到被封ip的情况,所有打算自己搭建一个代理ip池来使用。本次使用的是开源的ip代理池项目ProxyPool 1.下载redis数据库 redis安装 这里我选择直接下载redis的解压包形式,方便安装。下载地址:发布 TPORADOWSKI/RED…

Linux网络协议栈的实现

网络协议栈是操作系统核心的一个重要组成部分,负责管理网络通信中的数据包处理。在 Linux 操作系统中,网络协议栈(Network Stack)负责实现 TCP/IP 协议簇,处理应用程序发起的网络请求并与底层的网络硬件进行交互。本文…

关于ansible自动化运维工具

成长路上不孤单😊【14后,C爱好者,持续分享所学,如有需要欢迎收藏转发😊😊😊😊😊😊😊!!!!&#xff…

空间工作记忆策略在控制网络和默认模式网络中的激活差异

摘要 空间位置可以通过不同的表征方式和策略在工作记忆中进行编码和维持。精细的表征方式提供了详细的刺激信息,但对认知要求较高,并且容易出现不准确的情况。精细表征中的不确定性可以通过使用粗略但稳健的类别表征来补偿。本研究采用个体差异法来识别…

如何将java文件导入idea中运行和推送到Gitee仓库问题

(注意:如果不上传到Gitee平台,就请忽略最后每个方法的最后一步) 另外如果导入的是Maven文件,先要指定好自己本地的Maven库的位置和Setting 文件,然后重新加载一下maven即可。 第一种方法 : 1、导入Java文…

C语言——将一个字符串中的元音字母复制到另一个字符串,然后输出。

写一函数,将一个字符串中的元音字母复制到另一个字符串,然后输出。 注意,字符串b必须以\0为结束标志,C 语言中的字符串必须以 \0(空字符)结束,否则输出函数(如 puts)无法…

精益生产现场管理和改善的实战路径

精益生产,作为制造业的革新利器,不仅能够帮助企业降低成本、提升质量,还能大幅度提高生产效率。但如何将这一理念从理论转化为实际行动,真正落地于生产现场,成为许多管理者面临的难题。今天,就让天行健咨询…

【前端】探索webpack3项目build速度优化, 优化个p

文章目录 背景uglifyjs-webpack-pluginwebpack3 压缩混淆js 优化踩坑。结论 背景 webpack3 babel7 uglifyjs-webpack-plugin的项目,build起来是什么体验。 大抵是写了两个月后,发现build时间从120s激增到400s。而这400秒中,有50多秒是Ugli…

批量创建文件夹和文件——excel VBA实现

当需要创建大量文件夹及文件时,可借助excel vba 实现,如下图: 批量创建文件名为1-10的文件夹,每个文件夹内有个与文件名相同的txt文件,txt文件内的数字也跟文件名相同。 附代码: Sub CreateFoldersAndFile…

iphone13 不升级IOS使用广电卡

iPhone13的信号📶,15系统刷高版本iPCC,本帖以后不再更新!!! 自从知道可以通过刷iPCC的方式改善信号(不更新iOS大版本的情况下),尝试了各种版本。 我自己用下来总结 - 移动联通48、49、50 &…

62.以太网数据回环实验(5)

(1)UDP顶层模块代码: module udp (input wire gmii_txc ,input wire gmii_rxc ,input wire reset_n ,input wire gmii_rx_dv ,input wi…

使用FastJson2将对象转成JSON字符串时,小数转换出错

maven坐标 <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.40</version> </dependency> 问题现象&#xff1a; 问题原因&#xff1a; IOUtils.write…

RabbitMQ 高级特性——消息确认

文章目录 前言消息确认机制SpringBoot 实现消息确认NONEAUTOMANUAL 前言 前面我们学习了 SpringBoot 整合 RabbitMQ&#xff0c;并且使用 RabbitMQ 实现了几种工作模式&#xff0c;接下来我们将学习关于 RabbitMQ 的高级特性——消息确认机制&#xff0c;持久化和发送方确认。…

99.WEB渗透测试-信息收集-网络空间搜索引擎shodan(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;98.WEB渗透测试-信息收集-Google语法&#xff08;12&#xff09; 信息收集方向-网络空间…