前言
各位读者好久不见,一转眼就过去了一个多月,由于之前忙于复习和考试就没有更新博客,原本说好写一个Sentinel 对集群流控的文章,但是实验室刚上大二的弟弟妹妹们开始学习SpringBoot了,苦于没有一个比较简单且便于入门的练手项目,于是乎帮他们构思并实现了一个简单的SpringBoot前后端分离项目。
tips:本文所需前置知识如下
- JavaSE基础
- 会使用Maven
- 了解过redis
- 会编写简单的SQL语句
温馨提示:由于是入门的练手小项目,项目在架构以及编写的有些部分并不完整或不够严谨甚至存在严重的安全问题,并不表示真正的生产环境
项目使用到的框架或技术
- Spring Boot
- Spring Security
- Mybatis
- redis
pom文件截取
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.7.RELEASE</version>
<relativePath/>
</parent>
<!-- 统一管理版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>8.0.16</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>2.1.2</mybatis.spring.boot.version>
</properties>
<dependencies>
<!--SpringBoot起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 安全验证相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Spring测试相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!-- mysql连接驱动以及数据库连接池 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<!-- PageHelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 日志及lombok -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<!-- jwt相关 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- SpringConfiguration相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 邮件功能 -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- swagger2.0 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!-- 验证码所需工具 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
项目的需求及架构
由于是练手项目,并不会采用过于高深的技术
项目主要分为三个部分:
- 游客注册登录后可以填写一份申请表并提交给实验室管理员进行审核
- 注册用户可以在讨论区发布问题以及编写回答
- 管理员可以选定实验室成员发布任务
*至于增删查改等基本需求是肯定要完成的。
项目采用前后端分离的模式,使用Redis对验证码进行缓存,使用MySQL数据库对数据进行持久化,我所在小组的学弟学妹负责Java后台编写,本系列文章也会着重于后台部分,前端部分则会整合到GitHub仓库中,如有需要请自行查阅。
数据库脚本
/*
SQLyog Professional v12.09 (64 bit)
MySQL - 8.0.21 : Database - EchoMemberManager
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`EchoMemberManager` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `EchoMemberManager`;
/*Table structure for table `tb_answer` */
DROP TABLE IF EXISTS `tb_answer`;
CREATE TABLE `tb_answer` (
`id` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'UUID',
`uid` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复者id',
`question_id` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '问题id',
`parentid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '父主题id',
`answer_field` text COLLATE utf8mb4_general_ci COMMENT '回复内容',
`popcount` bigint DEFAULT '0' COMMENT '点赞数',
`addtime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '添加时间',
PRIMARY KEY (`id`),
KEY `uid` (`uid`,`question_id`,`parentid`,`addtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*Table structure for table `tb_applicationform` */
DROP TABLE IF EXISTS `tb_applicationform`;
CREATE TABLE `tb_applicationform` (
`id` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请表id',
`uid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户id',
`name` varchar(15) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
`email` varchar(25) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱',
`phone` varchar(15) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '电话',
`gender` varchar(5) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别',
`age` varchar(3) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '年龄',
`college` varchar(15) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '学院',
`grade` varchar(5) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '哪一级',
`classes` varchar(8) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '班级',
`selfintroduce` text COLLATE utf8mb4_general_ci COMMENT '自我介绍',
`preexp` text COLLATE utf8mb4_general_ci COMMENT '项目或比赛经验',
`addtime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请时间',
`status` int NOT NULL DEFAULT '0' COMMENT '申请状态(0面试时间待定,1待面试,2拒绝,3面试结束,4通过)',
`otherLab` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否参加了别的社团',
`admin_id` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '审核人员id',
PRIMARY KEY (`id`,`uid`,`status`,`admin_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*Table structure for table `tb_question` */
DROP TABLE IF EXISTS `tb_question`;
CREATE TABLE `tb_question` (
`id` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'UUID',
`uid` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '提问者id',
`question_title` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '问题的标题',
`question_field` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '问题的内容',
`answer_count` bigint DEFAULT '0' COMMENT '该问题的回答数',
`popcount` bigint DEFAULT '0' COMMENT '该问题的点赞数',
`addtime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '添加时间',
`lastupdatetime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最后回答时间',
PRIMARY KEY (`id`),
KEY `normalIndex` (`uid`,`question_title`,`addtime`,`answer_count`,`popcount`,`lastupdatetime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*Table structure for table `tb_role` */
DROP TABLE IF EXISTS `tb_role`;
CREATE TABLE `tb_role` (
`uid` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
`rolename` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'MEMBER',
KEY `uid` (`uid`,`rolename`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*Table structure for table `tb_task` */
DROP TABLE IF EXISTS `tb_task`;
CREATE TABLE `tb_task` (
`id` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'UUID',
`task_boss_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '颁发任务的用户id',
`task_member_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '被分配的用户id',
`task_name` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '任务名',
`task_field` text COLLATE utf8mb4_general_ci COMMENT '任务详情',
`task_start_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '任务开始时间',
`task_final_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '任务结束时间',
`task_addtime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '任务添加时间',
`task_status` int DEFAULT '1' COMMENT '任务状态(开启0,关闭2,已完成1)',
KEY `nomalIndex` (`id`,`task_boss_id`,`task_member_id`,`task_name`,`task_start_time`,`task_final_time`,`task_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*Table structure for table `tb_user` */
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'UUID',
`username` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户登录名',
`password` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户密码',
`email` varchar(25) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮件地址',
`nickname` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '昵称',
`phone` varchar(15) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机号',
`age` varchar(5) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '年龄',
`gender` varchar(5) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别',
`college` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '学院',
`grade` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '年级',
`classes` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '班级',
`popcount` bigint DEFAULT '0' COMMENT '被点赞数量',
`question_count` int DEFAULT '0' COMMENT '提问数',
`answer_count` int DEFAULT '0' COMMENT '回答数',
`task_count` int DEFAULT '0' COMMENT '待做任务数',
`addtime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '加入时间',
`enable` int DEFAULT '0' COMMENT '0待激活或1开启或2封禁',
PRIMARY KEY (`username`),
KEY `normalIndex` (`username`,`college`,`grade`,`classes`,`email`,`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
正式开始
创建项目
笔者推荐使用idea进行项目的编写。言归正传,开始我们的项目编写。
首先使用IDEA创建一个空项目,在pom.xml中粘贴上文写到的相应依赖,然后点击如图所示的按钮刷新项目所用的依赖。
如果你已经正确的配置了Maven和idea,那么这时候可以看到相应的依赖已经被引入