这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
Space项目简介
虽然标题写的是blog,但是因为我更希望他更能承载我更多记忆已经更多的个性化,所以我给他取名Space,而前缀也可以改成《我的个人log》。为什么取名space呢?其实有点qq空间那个味道,我希望我能在这个项目上记录的不仅仅是文字,我希望可以记录更多,比如说图片、语音甚至视频,所以我左思右想,突然想起网页版的qq空间。其实颇为相似,所以取名为Space。
以前一直特别想要拥有自己的个人博客,可以给我自身学习的知识归档总结。但出于某些原因一直没有实施,那今天space,它终于打算立项了。
目前他的短期目标是实现简单的后台文章写入,但是想到之后的目标,对于我这种刚开始工作没多久的同学,还是很有挑战的。最近我也在努力学习前端知识,希望能为这个项目,带来比较好的前端表现。
项目地址
架构
前端:React全家桶
后端:
jdk8 (或许后续会升级到17)
SpringBoot 2.5.6
权限控制SpringSecurity
数据库MySQL
缓存Redis
ORM MyBatis
消息队列Kafka(待学习)
定时任务Quartz(带学习)
ElasticSearch(后续)
项目分包
愿景
目前这个项目不确定的地方还是很多,我希望我能坚持下来,希望至少能帮助学生向实际项目踏出一步。
从项目构架到实际的功能,回答为什么这么做(虽然我不一定能答出来,希望大家一起进步)。
预期为2022年1月之前,做出初步的雏形以及基础功能。
Space(1)
初始化依赖以及配置
我们在项目的主pom文件当中,我们选择spring-boot-starter-parent引入springboot的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
使用<dependencyManagement></dependencyManagement>标签来管理我们整个项目的依赖。
dependencyManagement不像我们在dependency标签中引入的依赖,我们刷新maven之后会立刻引进,而dependencyManagement只相当于声明以及版本管理。
我们在子模块的pom文件中就可以不写版本,它会使用dependencyManagement的版本管理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Q1: 为什么这样做?
A1: 这样是可以避免在多人员的开发中在不同模板引入不同版本的依赖,方便我们整体的管理整个项目中的依赖以及版本号。
注意:这里数据库jdbc依赖,需要根据你的数据库版本选择,我的数据库版本为8.0.27,所以我的依赖为
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency>
我们首先根据项目分层在各个模块中的pom文件加上对应依赖,具体的引入的依赖见可以看看项目文件详情。
之后我选择在starter模块中添加application.yml配置
spring:
profiles:
active: dev # 开启开发环境
以及application-dev.yml配置编写我们现在的配置
server:
port: 2425
servlet:
context-path: /
# 下面的配置不是立刻需求,可以先注释掉
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver # 我使用的数据库版本是 8.0.27 老版本 com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/space #配置你的数据库地址
username: root # 用户名
password: root123 # 密码
druid:
#2.连接池配置
#初始化连接池的连接数量 大小,最小,最大
initial-size: 5
min-idle: 5
max-active: 20
#配置获取连接等待超时的时间
max-wait: 60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 30000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: true
test-on-return: false
# 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filter:
stat:
merge-sql: true
slow-sql-millis: 5000
#3.基础监控配置
web-stat-filter:
enabled: true
url-pattern: /*
#设置不统计哪些URL
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
session-stat-enable: true
session-stat-max-count: 100
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: true
#设置监控页面的登录名和密码
login-username: admin
login-password: admin
allow: 127.0.0.1
#deny: 192.168.1.100
mybatis:
type-aliases-package: com.sou7h.entity
mapper-locations: classpath:mappers/*.xml # 不要写错成config-location
可能有的小伙伴会发现我们有很多个配置文件,application.yml、application-dev.yml以及application-prod.yml
这些个配置分别对应基础配置,开发环境配置以及生产环境配置。在有些公司还会有测试环境的配置application-test.yml
启动环境
按照分层确定好依赖关系后,我们在最底层的core模块增加spring-boot-starter-web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在我们的starter模块下增加启动类SpaceApplication
/**
* @author sou7h
* @description 启动入口
* @date 2021年11月08日 8:22 下午
*/
@SpringBootApplication
public class SpaceApplication {
public static void main(String[] args) {
SpringApplication.run(SpaceApplication.class,args);
}
}
有关IDEA自动生成注解 可以看这篇文章 my.oschina.net/jeecg/blog/…
点击运行我们就可以正常启动了。
写一个Hello接口
我们在web模块中建立如下,文件夹以及HelloController类
我们简单的写一个接口,测试一下
/**
* @author sou7h
* @description Hello Space
* @date 2021年11月14日 12:23 下午
*/
@RestController
public class HelloController {
@GetMapping("/")
public String hello(){
return "Hello Space !";
}
}
成功返回数据。
Q2: @RestController注解和@Controller注解有什么不同
A2: @RestController注解相当于@Controller注解加上@ResponseBody,他们的作用相当于创建RESTful Web服务。
RESTful Web服务控制器只返回对象,对象数据作为JSON / XML直接写入HTTP响应。
而单独的@Controller注解相当于创建传统的Spring MVC控制器,返回一个字符串,对应我们resource/webinfo目录下的html或者jsp页面
而目前的流行的做法,依然是前后端分离的思想。后端只需要返回前端需要的数据就好。