SpringBoot+Mybatis-Plus+sa-token
实现功能:
1.使用springBoot框架实现登录功能的后端实现,使用了sa-token,mybatis-plus;
2.进行跨域的设置连接前端;
数据表mp sql查询语句:
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50735
Source Host : localhost:3306
Source Database : mp
Target Server Type : MYSQL
Target Server Version : 50735
File Encoding : 65001
Date: 2022-01-04 19:13:56
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '姓名',
`password` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '邮箱',
`version` int(11) DEFAULT '1',
`deleted` int(11) DEFAULT '0',
`create_time` timestamp NULL DEFAULT NULL COMMENT '\r\n',
`update_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'user', '123456', '25', 'u123423432@qq.com', '1', '0', null, null);
INSERT INTO `user` VALUES ('5', 'Billie', 'b123456', '10', 'test5@baomidou.com', '1', '0', '2021-12-30 09:00:52', '2021-12-30 09:00:52');
INSERT INTO `user` VALUES ('6', 'tang', 't123456', '23', 't18893822485@outlook.com', '1', '0', '2021-12-30 09:00:52', '2021-12-30 09:00:52');
INSERT INTO `user` VALUES ('7', 'tangwuling', 't123456', '24', '2352456346@qq.com', '5', '0', '2021-12-30 09:00:52', '2022-01-04 17:25:16');
INSERT INTO `user` VALUES ('10', 'wnager', 'w123456', '11', 't18893822485@outlook.com', '1', '0', '2021-12-30 01:28:54', '2021-12-30 01:28:54');
INSERT INTO `user` VALUES ('11', 'zhangsan', 'z123456', '12', 't18893822485@outlook.com', '1', '0', '2021-12-30 01:30:52', '2021-12-30 01:30:52');
导入所需依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>tang</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>tang</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.28.0</version>
</dependency>
<!-- Sa-Token 整合 Redis (使用jackson序列化方式) -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis-jackson</artifactId>
<version>1.28.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yml文件进行配置
server:
port: 8081
sa-token:
# token名称 (同时也是cookie名称)
token-name: satoken
# token有效期,单位s 默认30天, -1代表永不过期
timeout: 2592000
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# token风格
token-style: uuid
# 是否输出操作日志
is-log: false
# 端口
spring:
profiles:
active: dev #设置为开发环境
#数据库连接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
# redis配置
redis:
# Redis数据库索引(默认为0)
database: 1
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
# password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
mail:
#配置mail文件
username: *******
password: *******
host: smtp.qq.com
properties.mail.smtp.ssl.enable: true
#配置日志,查看sql语句执行过程
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#配置逻辑删除
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
对于时间更新的操作类,创建时间,更新时间
package com.example.tang.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component //将处理器加到IOC容器中
//对于时间更新的操作类,创建时间,更新时间
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
//插入时的填充策略
public void insertFill(MetaObject metaObject) {
log.info("insert fill ...");
this.setFieldValByName("createTime", new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
运行主类
ackage com.example.tang;
import cn.dev33.satoken.SaManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableAsync //开启异步注解功能
@EnableScheduling //开启定时功能的注解
@SpringBootApplication
public class TangApplication {
public static void main(String[] args){
SpringApplication.run(TangApplication.class, args);
System.out.println("启动成功:Sa-Token配置如下:" + SaManager.getConfig());
}
}
Config层(进行设置)
1.插件配置:
package com.example.tang.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement //自动管理事务
@MapperScan("com.example.tang.mapper")
@Configuration //配置类
public class MyBatisPlusConfig {
//注册乐观锁
@Bean
public MybatisPlusInterceptor MybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
//分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//能够添加很多拦截器实现
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
}
2.跨域配置:
package com.example.tang.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Override
/**
* 争对跨域问题:
* 1. 跨域路径
* 2. 请求来源
* 3. 跨域方法
* 4. 最大响应时间
* 5. 允许携带数据
*/
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080", "null")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.maxAge(3600)
.allowCredentials(true);
}
}
entity层(实体类)
package com.example.tang.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
// public enum IdType {
// AUTO(0), //数据库id自增
// NONE(1), //未设置主键
// INPUT(2), //手动输入
// ASSIGN_ID(3), //默认的去全局id
// ASSIGN_UUID(4); //ID_Worker
// }
@TableId(type = IdType.AUTO)
private long id;
private String name;
private Integer age;
private String email;
@Version //乐观锁的注解
private Integer version;
@TableLogic //逻辑删除
private Integer deleted;
//更新数据表中的时间
@TableField(fill= FieldFill.INSERT)
private Date createTime;
@TableField(fill=FieldFill.INSERT_UPDATE)
private Date updateTime;
}
Mapper 层(数据库相关管理)
package com.example.tang.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.tang.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User> {
}
service层(服务层)
package com.example.tang.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
}
package com.example.tang.service;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
//实现定时任务
@Service
public class ScheduledService {
//cron 字符串,设置执行时间
//秒 分 时 日 月 周几~
@Scheduled(cron = "30 3 14 * * ?")
public void hello(){
System.out.println("这个时间开始执行");
}
}
controller 层(业务实现)
package com.example.tang.controller;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.tang.entity.User;
import com.example.tang.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/")
public class Usercontroller {
@Autowired
private UserMapper userMapper;
@RequestMapping("doLogin")
public String doLogin(String username, String password){
String str = "error";
Map<String, Object> map = new HashMap<>();
map.put("name",username);
map.put("password",password);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.allEq(map);
User user = userMapper.selectOne(wrapper);
if(user!=null){
StpUtil.login(user.getId());
str = "ok";
return str;
}
return str;
}
@RequestMapping("isLogin")
public String isLogin(){
return "当前会话是否登录:"+StpUtil.isLogin();
}
@RequestMapping("getLoginId")
public String getLoginId(){
return "当前会话账号ID:"+StpUtil.getLoginIdDefaultNull();
}
//token 的信息
@RequestMapping("tokenInfo")
public SaResult tokenInfo() {
return SaResult.data("当前token信息:"+StpUtil.getTokenInfo());
}
// 测试注销 ---- http://localhost:8081/user/logout
@RequestMapping("logout")
public SaResult logout() {
StpUtil.logout();
return SaResult.ok("注销成功");
}
@RequestMapping("disable")
public String disable(){
StpUtil.disable(10001, 30);
return "已被封禁30S";
}
}

浙公网安备 33010602011771号