【项目精选】Spring Boot开发小而美的个人博客_springboot企业级开发教程个人博客

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

  • Maven 3
  • JDK 8
  • Axure RP 8

课程内容模块:

  • 需求分析与功能规划
  • 页面设计与开发
  • 技术框架搭建
  • 后端管理功能实现
  • 前端管理功能实现

你能学得什么?

  • 基于Spring Boot的完整全栈式的开发套路
  • Semantic UI框架的使用
  • 一套博客系统的源代码与设计

1、需求与功能

1.1 用户故事

用户故事是敏捷框架中的一种开发方法。可以帮助开发者转换视角,以用户的角度更好的把握需求,从而实现具有商业价值的功能。

用户故事最好是用户团队编写

用户故事模板

  • As a (role of user), I want (some feature) so that (some business value).
  • 作为一个(某个角色) 使用者,我可以做(某个功能) 事情,如此可以有(某个商业价值) 的好处

关键点:角色、功能、商业价值

举例

  • 作为一个招聘网站注册用户,我想查看最近3天发布的招聘信息,以便于了解最新的招聘信息
  • 作为公司,可以张贴新工作。

个人博客系统的用户故事:

角色:普通访客管理员(我)

  • 访客,可以分页查看所有的博客
  • 访客,可以快速查看博客数最多的6个分类
  • 访客,可以查看所有的分类
  • 访客,可以查看某个分类下的博客列表
  • 访客,可以快速查看标记博客最多的10个标签
  • 访客,可以查看所有的标签
  • 访客,可以查看某个标签下的博客列表
  • 访客,可以根据年度时间线查看博客列表
  • 访客,可以快速查看最新的推荐博客
  • 访客,可以用关键字全局搜索博客
  • 访客,可以查看单个博客内容
  • 访客,可以对博客内容进行评论
  • 访客,可以赞赏博客内容
  • 访客,可以微信扫码阅读博客内容
  • 访客,可以在首页扫描公众号二维码关注我
  • 我,可以用户名和密码登录后台管理
  • 我,可以管理博客
    • 我,可以发布新博客
    • 我,可以对博客进行分类
    • 我,可以对博客打标签
    • 我,可以修改博客
    • 我,可以删除博客
    • 我,可以根据标题,分类,标签查询博客
  • 我,可以管理博客分类
    • 我,可以新增一个分类
    • 我,可以修改一个分类
    • 我,可以删除一个分类
    • 我,可以根据分类名称查询分类
  • 我,可以管理标签
    • 我,可以新增一个标签
    • 我,可以修改一个标签
    • 我,可以删除一个标签
    • 我,可以根据名称查询标签
1.2 功能规划

在这里插入图片描述

2、页面设计与开发

2.1 设计

页面规划:

前端展示:首页、详情页、分类、标签、归档、关于我

后台管理:模板页

2.2 页面开发

Semantic UI官网

Semantic UI中文官网

WebStorm下载与破解

背景图片资源

2.3 插件集成

编辑器 Markdown

内容排版 typo.css

动画 animate.css

代码高亮 prism

目录生成 Tocbot

滚动侦测 waypoints

平滑滚动 jquery.scrollTo

二维码生成 qrcode.js

3、框架搭建

IDEA下载 https://www.jetbrains.com/idea/

3.1 构建与配置

1、引入Spring Boot模块:

  • web
  • Thymeleaf
  • JPA
  • MySQL
  • Aspects
  • DevTools

2、application.yml配置

  • 使用 thymeleaf 3

pom.xml:

<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>

application.yml:

spring:
  thymeleaf:
    mode: HTML

  • 数据库连接配置
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

  • 日志配置

application.yml:

logging:
  level:
    root: info
    com.imcoding: debug
  file: log/imcoding.log

​ logback-spring.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--包含Spring boot对logback日志的默认配置-->
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG\_FILE" value="${LOG\_FILE:-${LOG\_PATH:-${LOG\_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

    <!--重写了Spring Boot框架 org/springframework/boot/logging/logback/file-appender.xml 配置-->
    <appender name="TIME\_FILE"
 class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <!--保留历史日志一个月的时间-->
            <maxHistory>30</maxHistory>
            <!--
 Spring Boot默认情况下,日志文件10M时,会切分日志文件,这样设置日志文件会在100M时切分日志
 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>

        </rollingPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="TIME\_FILE" />
    </root>

</configuration>
<!--
 1、继承Spring boot logback设置(可以在appliaction.yml或者application.properties设置logging.\*属性)
 2、重写了默认配置,设置日志文件大小在100MB时,按日期切分日志,切分后目录:

 my.2017-08-01.0 80MB
 my.2017-08-01.1 10MB
 my.2017-08-02.0 56MB
 my.2017-08-03.0 53MB
 ......
-->

  • 生产环境与开发环境配置
    • application-dev.yml
    • application-pro.yml
3.2 异常处理

1、定义错误页面

  • 404
  • 500
  • error

2、全局处理异常

统一处理异常:

@ControllerAdvice
public class ControllerExceptionHandler {

    private final Logger logger = LoggerFactory.getLogger(ControllerExceptionHandler.class);
    /\*\*
 \* 异常处理
 \* @param request
 \* @param e
 \* @return
 \*/
    @ExceptionHandler({Exception.class})
    public ModelAndView handleException(HttpServletRequest request, Exception e) throws Exception {

        logger.error("Request URL : {} , Exception : {}", request.getRequestURL(), e);

        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
            throw e;
        }
        ModelAndView mav = new ModelAndView();
        mav.addObject("url", request.getRequestURL());
        mav.addObject("exception", e);
        mav.setViewName("error/error");

        return mav;
    }
}

错误页面异常信息显示处理:

<div>
    <div th:utext="'&lt;!--'" th:remove="tag"></div>
    <div th:utext="'Failed Request URL : ' + ${url}" th:remove="tag"></div>
    <div th:utext="'Exception message : ' + ${exception.message}" th:remove="tag"></div>
    <ul th:remove="tag">
        <li th:each="st : ${exception.stackTrace}" th:remove="tag"><span th:utext="${st}" th:remove="tag"></span></li>
    </ul>
    <div th:utext="'--&gt;'" th:remove="tag"></div>
</div>

3、资源找不到异常

@ResponseStatus(HttpStatus.NOT\_FOUND)
public class NotFoundExcepiton extends RuntimeException {

    public NotFoundExcepiton() {
    }

    public NotFoundExcepiton(String message) {
        super(message);
    }

    public NotFoundExcepiton(String message, Throwable cause) {
        super(message, cause);
    }
}

3.3 日志处理

1、记录日志内容

  • 请求 url
  • 访问者 ip
  • 调用方法 classMethod
  • 参数 args
  • 返回内容

2、记录日志类:

@Aspect
@Component
public class LogAspect {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /\*\*
 \* 定义切面
 \*/
    @Pointcut("execution(\* com.imcoding.web.\*.\*(..))")
    public void log() {
    }

    @Before("log()")
    public void doBefore(JoinPoint joinPoint) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
        ReqeustLog reqeustLog = new ReqeustLog(
                request.getRequestURL().toString(),
                request.getRemoteAddr(),
                classMethod,
                joinPoint.getArgs()
        );
        logger.info("Rquest ----- {}",reqeustLog);
    }

    @After("log()")
    public void doAfter() {
        //logger.info("---------- doAfter 2 ----------");
    }

    @AfterReturning(returning = "result",pointcut = "log()")
    public void doAtfertRturning(Object result) {
        logger.info("Return ------ {}",result );
    }


    private class ReqeustLog {
        private String url;
        private String ip;
        private String classMethod;
        private Object[] args;

        public ReqeustLog(String url, String ip, String classMethod, Object[] args) {
            this.url = url;
            this.ip = ip;
            this.classMethod = classMethod;
            this.args = args;
        }


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/cd713a0e12b90ba3cb393d8363359ddd.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

      public ReqeustLog(String url, String ip, String classMethod, Object[] args) {
            this.url = url;
            this.ip = ip;
            this.classMethod = classMethod;
            this.args = args;
        }


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-07oLPNeZ-1713364794055)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值