一、创建SpringBoot项目

二、添加依赖(pom.xml)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
三、编写配置文件(application.properties)
server.port=8001
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3308/tokenlogin?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
mybatis-plus.mapper-locations=classpath:com/sise/wangzhan/mapper/xml/*.xml
四、数据库创建表

创建语句
create table member
(
id bigint not null comment '会员id'
primary key,
openid varchar(128) charset utf8mb4 null comment '微信openid',
mobile varchar(11) charset utf8mb4 default '' null comment '手机号',
password varchar(255) charset utf8mb4 null comment '密码',
nickname varchar(50) charset utf8mb4 null comment '昵称',
sex tinyint(2) unsigned null comment '性别 1 女,2 男',
age tinyint unsigned null comment '年龄',
avatar varchar(255) charset utf8mb4 null comment '用户头像',
sign varchar(100) charset utf8mb4 null comment '用户签名',
is_disabled tinyint(1) default 0 not null comment '是否禁用 1(true)已禁用, 0(false)未禁用',
is_deleted tinyint(1) default 0 not null comment '逻辑删除 1(true)已删除, 0(false)未删除',
gmt_create datetime not null comment '创建时间',
gmt_modified datetime not null comment '更新时间'
);
五、使用MyBatis-plus自动生成代码

生成代码
package com.sise.wangzhan;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;
public class CodeGenerator {
@Test
public void codeGeneratorTest(){
AutoGenerator mpg = new AutoGenerator();
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir("\\token_login_demo" + "/src/main/java");
gc.setAuthor("wangzhan");
gc.setOpen(false);
gc.setFileOverride(false);
gc.setServiceName("%sService");
gc.setIdType(IdType.AUTO);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3308/wang?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
PackageConfig pc = new PackageConfig();
pc.setParent("com.sise");
pc.setModuleName("wangzhan");
pc.setController("controller");
pc.setEntity("entity");
pc.setService("service");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("member");
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setTablePrefix(pc.getModuleName() + "_");
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true);
mpg.setStrategy(strategy);
mpg.execute();
}
}
需要注意的地方(需要改成自己的配置)
1、项目路径的修改

2、数据源的配置

3、包的配置

4、数据库中表名的填写

执行前效果

执行后效果

六、Mybatis-plus自动填充时间
1、注解填充字段

2、实现元对象处理器接口

代码如下
package com.sise.wangzhan.servicebase.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("modifiedTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("modifiedTime", new Date(), metaObject);
}
}
七、需要使用swagger进行配合测试
编写配置类
package com.sise.wangzhan.config;
import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket webApiConfig(){
return new Docket(DocumentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build();
}
private ApiInfo webApiInfo(){
return new ApiInfoBuilder()
.title("网站-测试API文档")
.description("本文档没有什么描述")
.version("1.0")
.contact(new Contact("java", "http://atguigu.com", "1123@qq.com"))
.build();
}
}
八、添加JWT工具类

代码如下
package com.sise.wangzhan.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
public class JwtUtils {
public static final long EXPIRE = 1000 * 60 * 60 * 24;
public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";
public static String getJwtToken(BigInteger id, String nickname){
String JwtToken = Jwts.builder()
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
.setSubject("onlineCourse-user")
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
.claim("id", id)
.claim("nickname", nickname)
.signWith(SignatureAlgorithm.HS256, APP_SECRET)
.compact();
return JwtToken;
}
public static boolean checkToken(String jwtToken) {
if(StringUtils.isEmpty(jwtToken)) return false;
try {
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public static boolean checkToken(HttpServletRequest request) {
try {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return false;
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public static String getMemberIdByJwtToken(HttpServletRequest request) {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return "";
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
Claims claims = claimsJws.getBody();
return (String)claims.get("id");
}
}
需要注意这里

九、编写代码
controller层
package com.sise.wangzhan.controller;
import com.sise.wangzhan.entity.Member;
import com.sise.wangzhan.service.MemberService;
import com.sise.wangzhan.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/wangzhan/member")
public class MemberController {
@Autowired
private MemberService memberService;
@PostMapping(value = "addMember")
public String addMember(@RequestBody Member member){
if (member == null || StringUtils.isEmpty(member.getNickname()) ||
StringUtils.isEmpty(member.getPassword()) ||
StringUtils.isEmpty(member.getMobile())){
return "传过来的参数为空";
}
int count = memberService.saveMember(member);
if (count == 1){
return "添加成功";
}else {
return "添加失败";
}
}
@PostMapping(value = "/login")
public String login(@RequestBody Member member){
if (member == null || StringUtils.isEmpty(member.getNickname()) ||
StringUtils.isEmpty(member.getPassword())){
return "传过来的用户名或密码为空";
}
Member loginMember = memberService.getMemberByNicknameAndPassword(member);
System.out.println("查到的数据::::::" + loginMember);
if (loginMember == null){
return "用户名或密码错误";
}else if (loginMember != null){
System.out.println("=========" + String.valueOf(member.getId()));
String jwtToken = JwtUtils.getJwtToken(String.valueOf(member.getId()), member.getNickname());
return jwtToken;
}
return null;
}
}
2、service层
package com.sise.wangzhan.service;
import com.sise.wangzhan.entity.Member;
import com.baomidou.mybatisplus.extension.service.IService;
public interface MemberService extends IService<Member> {
Member getMemberByNicknameAndPassword(Member member);
int saveMember(Member member);
}
package com.sise.wangzhan.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sise.wangzhan.entity.Member;
import com.sise.wangzhan.mapper.MemberMapper;
import com.sise.wangzhan.service.MemberService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
@Override
public Member getMemberByNicknameAndPassword(Member member) {
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("nickname", member.getNickname());
wrapper.eq("password", member.getPassword());
return baseMapper.selectOne(wrapper);
}
@Override
public int saveMember(Member member) {
int count = baseMapper.insert(member);
return count;
}
}
十、swagger测试结果
用户名为空

返回成功的token

十一、根据前端返回的token获取用户信息
对应的id类型要修改

然后再根据id这个条件查数据就行