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";
    }
}
posted @ 2022-01-04 19:03  T神  阅读(993)  评论(1)    收藏  举报