SpringBoot新闻头条

SpringBoot新闻头条

1. 框架的搭建

  • 创建项目
    在这里插入图片描述

  • 依赖引入

    • web
      在这里插入图片描述

    • Thymeleaf
      在这里插入图片描述

    • SpringDataJPG

    • MySQL Mysql驱动包

    在这里插入图片描述

  • 配置信息

    将application.properties改成application.yml,并配置application.yml,必须严格按照格式进行缩进,否则会出错

    spring:
      thymeleaf:
        mode:HTML5
      #配置数据源
      datasource:
        #在运行项目之前,需要创建本项目需要的数据库myspringdatabase
        url: jdbc:mysql://localhost:3306/myspringdatabase?serverTimezone=Asia/Shanghai&characterEnconding=utf-8
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        #改成自己的密码
        password: *******
    server:
    #端口号
      port:8080
    logging:
      level:
        root: info
      file:
        path: log/blog
    

2. 处理错误面

由于SpringBoot 自动装配 : 会将templates/errror文件夹下的 404.html 500.html 应用到 404 500错误中,所以我们只有自己写入对于的404.html和500.html就行

3. 日志管理

  • 定义切面类

    在目录com…myspringboot.demo目录下创建aspects目录,并创建LogAspect类

    package com.myspringboot.demo.aspects;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.Arrays;
    
    
    @Aspect
    @Component
    public class LogAspect {
        // 日志记录器
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        /*
            @Aspect 表示该类是一个切面类
        */
    
        @Pointcut("execution(* com.XXXXX.web.*.*(..))")
        public void log() {
           //切点方法
        }
    
        @Before("log()")
        //在切点之前需要执行的方法
        public void doBefore(JoinPoint joinPoint) {
            System.out.println("-----------doBefore----------");
            // 将 用户访问的url  ip  调用的方法  传递的参数
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            String url = request.getRequestURL().toString();
            String ip = request.getRemoteAddr();
            String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
            Object[] args = joinPoint.getArgs();
            RequestLog requestLog = new RequestLog(url, ip, classMethod, args);
            logger.info("Result: {}", requestLog);
        }
    
        @After("log()")
        //在切点之后,需要执行的方法
        public void doAfter() {
            System.out.println("-----------doAfter----------");
        }
    
        @AfterReturning(returning = "result", pointcut = "log()")
        public void doAfterReturn(Object result) {
            logger.info("Result:{}", result);
        }
        //内置类,记录日志信息
        private class RequestLog {
            private String url;
            private String ip;
            private String classMethod;
            private Object[] args;
    
            public RequestLog() {
            }
    
            public RequestLog(String url, String ip, String classMethod, Object[] args) {
                this.url = url;
                this.ip = ip;
                this.classMethod = classMethod;
                this.args = args;
            }
    
            public String getUrl() {
                return url;
            }
    
            public void setUrl(String url) {
                this.url = url;
            }
    
            public String getIp() {
                return ip;
            }
    
            public void setIp(String ip) {
                this.ip = ip;
            }
    
            public String getClassMethod() {
                return classMethod;
            }
    
            public void setClassMethod(String classMethod) {
                this.classMethod = classMethod;
            }
    
            public Object[] getArgs() {
                return args;
            }
    
            public void setArgs(Object[] args) {
                this.args = args;
            }
    
            @Override
            public String toString() {
                return "RequestLog{" +
                        "url='" + url + '\'' +
                        ", ip='" + ip + '\'' +
                        ", classMethod='" + classMethod + '\'' +
                        ", args=" + Arrays.toString(args) +
                        '}';
            }
        }
    
    }
    
    
    

4. 页面处理

  • 创建web控制器

    在com.myspringboot.demo目录下创建web目录,并创建Controll控制类

    package com.myspringboot.demo.web;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Controller
    public class Controll {
        @GetMapping("/index")
        public String index2() {
            return "index";
        }
    
    }
    
  • 引入模板片段

    • 我们就一些模板片段放在_fragments.html中,

      例如:_fragments.html中head标签片段,片段名名为:head,其中title为参数

      <head th:fragment="head(title)">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title th:replace="${title}">新闻详情</title>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.4/semantic.min.css">
        <link rel="stylesheet" href="../static/css/typo.css" th:href="@{/css/typo.css}">
        <link rel="stylesheet" href="../static/css/animate.css" th:href="@{/css/animate.css}">
        <link rel="stylesheet" href="../static/lib/prism/prism.css" th:href="@{/lib/prism/prism.css}">
        <link rel="stylesheet" href="../static/lib/tocbot/tocbot.css" th:href="@{/lib/tocbot/tocbot.css}">
        <link rel="stylesheet" href="../static/css/me.css" th:href="@{/css/me.css}">
      </head>
      
    • 在index.html引用

      th:replace=“html文件名:: 片段名(~{::标签名})”

      <head th:replace="_fragments :: head(~{::title})">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>新闻</title>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.4/semantic.min.css" >
        <link rel="stylesheet" href="../static/css/me.css" th:href="@{/css/me.css}" >
      </head>
      
  1. 设计类

    在目录com.myspringboot.demo下创建entity目录,并在创建Comment,News,Tage,Type,User类

    User:(其他类就不一一举出)

    package com.zhongruan.entity;
    
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    @Entity
    @Table(name = "t_user")
    public class User {
        @Id
        @GeneratedValue
        private Long id;
        private String nickname;    // 昵称
        private String username;    // 用户名
        private String password;    // 密码
        private String email;       // 邮箱
        private String avatar;      // 头像的url
        private Integer type;       // 用户激活状态
        // 由于数据库不能存储java对象  所用通过@Temporal 注解 Date对象转换成 时间戳 存储到数据库中
        @Temporal(TemporalType.TIMESTAMP)
        private Date createTime;    // 用户创建时间
    
        @Temporal(TemporalType.TIMESTAMP)
        private Date updateTime;    // 用户的更新时间
    
        @OneToMany(mappedBy = "user")
        private List<News> newsList = new ArrayList<>();    // 新闻
    
        public User() {
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getNickname() {
            return nickname;
        }
    
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getAvatar() {
            return avatar;
        }
    
        public void setAvatar(String avatar) {
            this.avatar = avatar;
        }
    
        public Integer getType() {
            return type;
        }
    
        public void setType(Integer type) {
            this.type = type;
        }
    
        public Date getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
    
        public Date getUpdateTime() {
            return updateTime;
        }
    
        public void setUpdateTime(Date updateTime) {
            this.updateTime = updateTime;
        }
    
    
        public List<News> getNewsList() {
            return newsList;
        }
    
        public void setNewsList(List<News> newsList) {
            this.newsList = newsList;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", nickname='" + nickname + '\'' +
                    ", username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    ", email='" + email + '\'' +
                    ", avatar='" + avatar + '\'' +
                    ", type=" + type +
                    ", createTime=" + createTime +
                    ", updateTime=" + updateTime +
                    '}';
        }
    }
    
    
  2. 运行结果:

后台运行结果在这里插入图片描述在这里插入图片描述

错误页面
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第01讲-软件安装 第02讲-数据库设计1 第03讲-数据库设计2 第04讲-界面模拟图设计 第05讲-数据表操作类设计 第06讲-编写SQLHelper 第07讲-编写类别表操作类 第08讲-重构SQLHelper 第09讲-浅入浅出SQL注入 第10讲-建立新闻类别实体类 第11讲-浅入浅出SQL触发器 第12讲-编写新闻评论类 第13讲-浅入浅出存储过程 第14讲-重构SQLHelper2 第15讲-编写剩下的存储过程 第16讲-完成新闻表操作类 第17讲-编写BLL层 第18讲-界面制作必备软件 第19讲-CSS简介 第20讲-CSS核心内容 第21讲-制作首页1 第22讲-制作首页2 第23讲-制作首页3 第24讲-首页制作4 第25讲-首页制作5 第26讲-制作母版页  第27讲-其他页面制作1 第28讲-其他页面制作2 第29讲-带边框的圆角框制作1 第30讲-带边框的圆角框制作2 第31讲-制作出错页 第32讲-可变宽度的圆角框制作1 第33讲-可变宽度的圆角框制作2 第34讲-完成类别管理页面制作 第35讲-完成界面制作 第36讲-整合首页1 第37讲-整合首页2 第38讲-整合新闻列表页 第39讲-整合搜索页 第40讲-整合新闻内容页1 第41讲-整合新闻内容页2 第42讲-整合新闻内容页3 第43讲-前台页面除错 第44讲-整合登陆页 第45讲-整合类别管理页1 第46讲-整合类别管理页2 第47讲-整合类别管理页3 第48讲-整合类别管理页4 第49讲-整合类别管理页5 第50讲-整合类别管理页6 第51讲-整合类别管理页7 第52讲-整合类别管理页8 第53讲-整合类别管理页9 第54讲-整合类别管理页10 第55讲-整合类别管理页11 第56讲-整合新闻管理页1 第57讲-整合新闻管理页2 第58讲-整合新闻管理页3 第59讲-整合添加新闻页1 第60讲-整合添加新闻页2 第61讲-尾声 第62讲-尾声续 第63讲-尾声最后续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值