package com.alatus.service.impl;import com.alatus.constant.Constants;import com.alatus.mapper.TUserMapper;import com.alatus.model.TUser;import com.alatus.query.UserQuery;import com.alatus.util.JWTUtils;import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;import jakarta.annotation.Resource;import org.springframework.beans.BeanUtils;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.security.crypto.password.PasswordEncoder;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.Date;@Servicepublic class UserServiceImpl implements com.alatus.service.UserService {@Resourceprivate TUserMapper tUserMapper;//注入一个密码加密器@Resourceprivate PasswordEncoder passwordEncoder;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {TUser tUser = tUserMapper.selectByLoginAct(username);if(tUser == null){throw new UsernameNotFoundException("登陆账号不存在");}return tUser;}@Overridepublic PageInfo getUserByPage(Integer current) {//设置PageHelper和分页情况PageHelper.startPage(current, Constants.PAGE_SIZE);//查询ArrayList list = tUserMapper.selectUserByPage();//封装分页到PageInfo中PageInfo info = new PageInfo(list);return info;}@Overridepublic TUser getUserById(Integer id) {return tUserMapper.selectDetailByPrimaryKey(id);}@Overridepublic int saveUser(UserQuery userQuery) {TUser tUser = new TUser();//把query对象的数据复制到user对象里面//这个工具类的复制要求是两个对象的属性名要相同,属性要相同BeanUtils.copyProperties(userQuery,tUser);tUser.setLoginPwd(passwordEncoder.encode(userQuery.getLoginPwd()));//创建时间tUser.setCreateTime(new Date());//通过token解析出的用户获取ID作为创建者的IDInteger loginId = JWTUtils.parseUserFromJWT(userQuery.getToken()).getId();tUser.setCreateBy(loginId);return tUserMapper.insertSelective(tUser);}}
package com.alatus.service.impl;import com.alatus.constant.Constants;import com.alatus.mapper.TUserMapper;import com.alatus.model.TUser;import com.alatus.query.UserQuery;import com.alatus.util.JWTUtils;import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;import jakarta.annotation.Resource;import org.springframework.beans.BeanUtils;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.core.userdetails.UsernameNotFoundException;import org.springframework.security.crypto.password.PasswordEncoder;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.Date;@Servicepublic class UserServiceImpl implements com.alatus.service.UserService {@Resourceprivate TUserMapper tUserMapper;//注入一个密码加密器@Resourceprivate PasswordEncoder passwordEncoder;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {TUser tUser = tUserMapper.selectByLoginAct(username);if(tUser == null){throw new UsernameNotFoundException("登陆账号不存在");}return tUser;}@Overridepublic PageInfo getUserByPage(Integer current) {//设置PageHelper和分页情况PageHelper.startPage(current, Constants.PAGE_SIZE);//查询ArrayList list = tUserMapper.selectUserByPage();//封装分页到PageInfo中PageInfo info = new PageInfo(list);return info;}@Overridepublic TUser getUserById(Integer id) {return tUserMapper.selectDetailByPrimaryKey(id);}@Overridepublic int saveUser(UserQuery userQuery) {TUser tUser = new TUser();//把query对象的数据复制到user对象里面//这个工具类的复制要求是两个对象的属性名要相同,属性要相同BeanUtils.copyProperties(userQuery,tUser);tUser.setLoginPwd(passwordEncoder.encode(userQuery.getLoginPwd()));//创建时间tUser.setCreateTime(new Date());//通过token解析出的用户获取ID作为创建者的IDInteger loginId = JWTUtils.parseUserFromJWT(userQuery.getToken()).getId();tUser.setCreateBy(loginId);return tUserMapper.insertSelective(tUser);}}
package com.alatus.config.filter;import com.alatus.constant.Constants;import com.alatus.model.TUser;import com.alatus.result.R;import com.alatus.service.RedisService;import com.alatus.util.JSONUtils;import com.alatus.util.JWTUtils;import com.alatus.util.ResponseUtils;import com.alatus.result.CodeEnum;import jakarta.annotation.Resource;import jakarta.servlet.FilterChain;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;import org.springframework.web.filter.OncePerRequestFilter;import java.io.IOException;import java.util.concurrent.TimeUnit;import static com.alatus.result.CodeEnum.TOKEN_IS_EXPIRED;@Componentpublic class TokenVerifyFilter extends OncePerRequestFilter {@Resourceprivate RedisService redisService;@Resource//springboot框架提供的线程池,ioc容器内已经存在private ThreadPoolTaskExecutor threadPoolTaskExecutor;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {if (request.getRequestURI().equals(Constants.LOGIN_URI)) { //如果是登录请求,此时还没有生成jwt,那不需要对登录请求进行jwt验证//验证jwt通过了 ,让Filter链继续执行,也就是继续执行下一个FilterfilterChain.doFilter(request, response);} else {String token = request.getHeader("Authorization");if(!StringUtils.hasText("Authorization")){//没拿到token,将失败这个枚举传回去,解析并取出常量拼接R result = R.FAIL(CodeEnum.TOKEN_IS_EMPTY);//封装String resultJSON = JSONUtils.toJSON(result);//返回ResponseUtils.write(response,resultJSON);return;}//验证token有没有被篡改过,也是验证token合法性if (!(JWTUtils.verifyJWT(token))){//token不合法R result = R.FAIL(CodeEnum.TOKEN_IS_NONE_MATCH);//封装String resultJSON = JSONUtils.toJSON(result);//返回ResponseUtils.write(response,resultJSON);return;}TUser tUser = JWTUtils.parseUserFromJWT(token);String redisToken = (String) redisService.getValue(Constants.REDIS_JWT_KEY + tUser.getId());if(!StringUtils.hasText(redisToken)){//没有获取到内容说明token过期了R fail = R.FAIL(TOKEN_IS_EXPIRED);String json = JSONUtils.toJSON(fail);ResponseUtils.write(response,json);return;}if (!redisToken.equals(token)) {//登陆失败token错误R result = R.FAIL(CodeEnum.TOKEN_IS_ERROR);//把R对象转为JSONString json = JSONUtils.toJSON(result);ResponseUtils.write(response,json);return;}//jwt验证通过了UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(tUser,tUser.getLoginPwd(),tUser.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authenticationToken);//刷新一下token//做异步执行//new Thread(new Runnable() {//@Override//public void run() {这里刷新token即可从请求头中获取//String rememberMe = request.getHeader("rememberMe");//if (!Boolean.parseBoolean(rememberMe)) {//redisService.expire(Constants.REDIS_JWT_KEY + tUser.getId(), Constants.DEFAULT_EXPIRE_TIME, TimeUnit.SECONDS);//}//}//}).start();//最好使用线程池的方式去执行threadPoolTaskExecutor.execute(() -> {//这里刷新token即可//从请求头中获取String rememberMe = request.getHeader("rememberMe");if (!Boolean.parseBoolean(rememberMe)) {redisService.expire(Constants.REDIS_JWT_KEY + tUser.getId(), Constants.DEFAULT_EXPIRE_TIME, TimeUnit.SECONDS);}});//验证jwt通过了,让filter链继续执行filterChain.doFilter(request,response);}}}
package com.alatus.config.filter;import com.alatus.constant.Constants;import com.alatus.model.TUser;import com.alatus.result.R;import com.alatus.service.RedisService;import com.alatus.util.JSONUtils;import com.alatus.util.JWTUtils;import com.alatus.util.ResponseUtils;import com.alatus.result.CodeEnum;import jakarta.annotation.Resource;import jakarta.servlet.FilterChain;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;import org.springframework.web.filter.OncePerRequestFilter;import java.io.IOException;import java.util.concurrent.TimeUnit;import static com.alatus.result.CodeEnum.TOKEN_IS_EXPIRED;@Componentpublic class TokenVerifyFilter extends OncePerRequestFilter {@Resourceprivate RedisService redisService;@Resource//springboot框架提供的线程池,ioc容器内已经存在private ThreadPoolTaskExecutor threadPoolTaskExecutor;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {if (request.getRequestURI().equals(Constants.LOGIN_URI)) { //如果是登录请求,此时还没有生成jwt,那不需要对登录请求进行jwt验证//验证jwt通过了 ,让Filter链继续执行,也就是继续执行下一个FilterfilterChain.doFilter(request, response);} else {String token = request.getHeader("Authorization");if(!StringUtils.hasText("Authorization")){//没拿到token,将失败这个枚举传回去,解析并取出常量拼接R result = R.FAIL(CodeEnum.TOKEN_IS_EMPTY);//封装String resultJSON = JSONUtils.toJSON(result);//返回ResponseUtils.write(response,resultJSON);return;}//验证token有没有被篡改过,也是验证token合法性if (!(JWTUtils.verifyJWT(token))){//token不合法R result = R.FAIL(CodeEnum.TOKEN_IS_NONE_MATCH);//封装String resultJSON = JSONUtils.toJSON(result);//返回ResponseUtils.write(response,resultJSON);return;}TUser tUser = JWTUtils.parseUserFromJWT(token);String redisToken = (String) redisService.getValue(Constants.REDIS_JWT_KEY + tUser.getId());if(!StringUtils.hasText(redisToken)){//没有获取到内容说明token过期了R fail = R.FAIL(TOKEN_IS_EXPIRED);String json = JSONUtils.toJSON(fail);ResponseUtils.write(response,json);return;}if (!redisToken.equals(token)) {//登陆失败token错误R result = R.FAIL(CodeEnum.TOKEN_IS_ERROR);//把R对象转为JSONString json = JSONUtils.toJSON(result);ResponseUtils.write(response,json);return;}//jwt验证通过了UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(tUser,tUser.getLoginPwd(),tUser.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authenticationToken);//刷新一下token//做异步执行//new Thread(new Runnable() {//@Override//public void run() {这里刷新token即可从请求头中获取//String rememberMe = request.getHeader("rememberMe");//if (!Boolean.parseBoolean(rememberMe)) {//redisService.expire(Constants.REDIS_JWT_KEY + tUser.getId(), Constants.DEFAULT_EXPIRE_TIME, TimeUnit.SECONDS);//}//}//}).start();//最好使用线程池的方式去执行threadPoolTaskExecutor.execute(() -> {//这里刷新token即可//从请求头中获取String rememberMe = request.getHeader("rememberMe");if (!Boolean.parseBoolean(rememberMe)) {redisService.expire(Constants.REDIS_JWT_KEY + tUser.getId(), Constants.DEFAULT_EXPIRE_TIME, TimeUnit.SECONDS);}});//验证jwt通过了,让filter链继续执行filterChain.doFilter(request,response);}}}
id, login_act, login_pwd, `name`, phone, email, account_no_expired, credentials_no_expired, account_no_locked, account_enabled, create_time, create_by, edit_time, edit_by, last_login_timeselectfrom t_userwhere login_act = #{username,jdbcType=VARCHAR}select from t_userwhere id = #{id,jdbcType=INTEGER}selecttu.*,tu2.id createById, tu2.name createByName,tu3.id editById, tu3.name editNamefrom t_user tu left join t_user tu2 on tu.create_by = tu2.id left join t_user tu3 on tu.edit_by = tu3.idwhere tu.id = #{id, jdbcType=INTEGER}selectfrom t_userdelete from t_userwhere id = #{id,jdbcType=INTEGER}insert into t_user (login_act, login_pwd, `name`, phone, email, account_no_expired,credentials_no_expired, account_no_locked, account_enabled, create_time, create_by, edit_time, edit_by, last_login_time)values (#{loginAct,jdbcType=VARCHAR}, #{loginPwd,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{accountNoExpired,jdbcType=INTEGER}, #{credentialsNoExpired,jdbcType=INTEGER}, #{accountNoLocked,jdbcType=INTEGER}, #{accountEnabled,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, #{createBy,jdbcType=INTEGER}, #{editTime,jdbcType=TIMESTAMP}, #{editBy,jdbcType=INTEGER}, #{lastLoginTime,jdbcType=TIMESTAMP})insert into t_userlogin_act,login_pwd,`name`,phone,email,account_no_expired,credentials_no_expired,account_no_locked,account_enabled,create_time,create_by,edit_time,edit_by,last_login_time,#{loginAct,jdbcType=VARCHAR},#{loginPwd,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR},#{phone,jdbcType=VARCHAR},#{email,jdbcType=VARCHAR},#{accountNoExpired,jdbcType=INTEGER},#{credentialsNoExpired,jdbcType=INTEGER},#{accountNoLocked,jdbcType=INTEGER},#{accountEnabled,jdbcType=INTEGER},#{createTime,jdbcType=TIMESTAMP},#{createBy,jdbcType=INTEGER},#{editTime,jdbcType=TIMESTAMP},#{editBy,jdbcType=INTEGER},#{lastLoginTime,jdbcType=TIMESTAMP},update t_userlogin_act = #{loginAct,jdbcType=VARCHAR},login_pwd = #{loginPwd,jdbcType=VARCHAR},`name` = #{name,jdbcType=VARCHAR},phone = #{phone,jdbcType=VARCHAR},email = #{email,jdbcType=VARCHAR},account_no_expired = #{accountNoExpired,jdbcType=INTEGER},credentials_no_expired = #{credentialsNoExpired,jdbcType=INTEGER},account_no_locked = #{accountNoLocked,jdbcType=INTEGER},account_enabled = #{accountEnabled,jdbcType=INTEGER},create_time = #{createTime,jdbcType=TIMESTAMP},create_by = #{createBy,jdbcType=INTEGER},edit_time = #{editTime,jdbcType=TIMESTAMP},edit_by = #{editBy,jdbcType=INTEGER},last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},where id = #{id,jdbcType=INTEGER}update t_userset login_act = #{loginAct,jdbcType=VARCHAR},login_pwd = #{loginPwd,jdbcType=VARCHAR},`name` = #{name,jdbcType=VARCHAR},phone = #{phone,jdbcType=VARCHAR},email = #{email,jdbcType=VARCHAR},account_no_expired = #{accountNoExpired,jdbcType=INTEGER},credentials_no_expired = #{credentialsNoExpired,jdbcType=INTEGER},account_no_locked = #{accountNoLocked,jdbcType=INTEGER},account_enabled = #{accountEnabled,jdbcType=INTEGER},create_time = #{createTime,jdbcType=TIMESTAMP},create_by = #{createBy,jdbcType=INTEGER},edit_time = #{editTime,jdbcType=TIMESTAMP},edit_by = #{editBy,jdbcType=INTEGER},last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP}where id = #{id,jdbcType=INTEGER}
id, login_act, login_pwd, `name`, phone, email, account_no_expired, credentials_no_expired, account_no_locked, account_enabled, create_time, create_by, edit_time, edit_by, last_login_timeselectfrom t_userwhere login_act = #{username,jdbcType=VARCHAR}select from t_userwhere id = #{id,jdbcType=INTEGER}selecttu.*,tu2.id createById, tu2.name createByName,tu3.id editById, tu3.name editNamefrom t_user tu left join t_user tu2 on tu.create_by = tu2.id left join t_user tu3 on tu.edit_by = tu3.idwhere tu.id = #{id, jdbcType=INTEGER}selectfrom t_userdelete from t_userwhere id = #{id,jdbcType=INTEGER}insert into t_user (login_act, login_pwd, `name`, phone, email, account_no_expired,credentials_no_expired, account_no_locked, account_enabled, create_time, create_by, edit_time, edit_by, last_login_time)values (#{loginAct,jdbcType=VARCHAR}, #{loginPwd,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{accountNoExpired,jdbcType=INTEGER}, #{credentialsNoExpired,jdbcType=INTEGER}, #{accountNoLocked,jdbcType=INTEGER}, #{accountEnabled,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, #{createBy,jdbcType=INTEGER}, #{editTime,jdbcType=TIMESTAMP}, #{editBy,jdbcType=INTEGER}, #{lastLoginTime,jdbcType=TIMESTAMP})insert into t_userlogin_act,login_pwd,`name`,phone,email,account_no_expired,credentials_no_expired,account_no_locked,account_enabled,create_time,create_by,edit_time,edit_by,last_login_time,#{loginAct,jdbcType=VARCHAR},#{loginPwd,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR},#{phone,jdbcType=VARCHAR},#{email,jdbcType=VARCHAR},#{accountNoExpired,jdbcType=INTEGER},#{credentialsNoExpired,jdbcType=INTEGER},#{accountNoLocked,jdbcType=INTEGER},#{accountEnabled,jdbcType=INTEGER},#{createTime,jdbcType=TIMESTAMP},#{createBy,jdbcType=INTEGER},#{editTime,jdbcType=TIMESTAMP},#{editBy,jdbcType=INTEGER},#{lastLoginTime,jdbcType=TIMESTAMP},update t_userlogin_act = #{loginAct,jdbcType=VARCHAR},login_pwd = #{loginPwd,jdbcType=VARCHAR},`name` = #{name,jdbcType=VARCHAR},phone = #{phone,jdbcType=VARCHAR},email = #{email,jdbcType=VARCHAR},account_no_expired = #{accountNoExpired,jdbcType=INTEGER},credentials_no_expired = #{credentialsNoExpired,jdbcType=INTEGER},account_no_locked = #{accountNoLocked,jdbcType=INTEGER},account_enabled = #{accountEnabled,jdbcType=INTEGER},create_time = #{createTime,jdbcType=TIMESTAMP},create_by = #{createBy,jdbcType=INTEGER},edit_time = #{editTime,jdbcType=TIMESTAMP},edit_by = #{editBy,jdbcType=INTEGER},last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},where id = #{id,jdbcType=INTEGER}update t_userset login_act = #{loginAct,jdbcType=VARCHAR},login_pwd = #{loginPwd,jdbcType=VARCHAR},`name` = #{name,jdbcType=VARCHAR},phone = #{phone,jdbcType=VARCHAR},email = #{email,jdbcType=VARCHAR},account_no_expired = #{accountNoExpired,jdbcType=INTEGER},credentials_no_expired = #{credentialsNoExpired,jdbcType=INTEGER},account_no_locked = #{accountNoLocked,jdbcType=INTEGER},account_enabled = #{accountEnabled,jdbcType=INTEGER},create_time = #{createTime,jdbcType=TIMESTAMP},create_by = #{createBy,jdbcType=INTEGER},edit_time = #{editTime,jdbcType=TIMESTAMP},edit_by = #{editBy,jdbcType=INTEGER},last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP}where id = #{id,jdbcType=INTEGER}
package com.alatus.model;import java.io.Serializable;import java.util.ArrayList;import java.util.Collection;import java.util.Date;import java.util.List;import com.fasterxml.jackson.annotation.JsonIgnore;import lombok.Data;import org.springframework.security.core.GrantedAuthority;import org.springframework.security.core.authority.SimpleGrantedAuthority;import org.springframework.security.core.userdetails.UserDetails;/** * 用户表 * t_user */@Datapublic class TUser implements UserDetails,Serializable {/** * 主键,自动增长,用户ID */private Integer id;/** * 登录账号 */private String loginAct;/** * 登录密码 */private String loginPwd;/** * 用户姓名 */private String name;/** * 用户手机 */private String phone;/** * 用户邮箱 */private String email;/** * 账户是否没有过期,0已过期 1正常 */private Integer accountNoExpired;/** * 密码是否没有过期,0已过期 1正常 */private Integer credentialsNoExpired;/** * 账号是否没有锁定,0已锁定 1正常 */private Integer accountNoLocked;/** * 账号是否启用,0禁用 1启用 */private Integer accountEnabled;/** * 创建时间 */private Date createTime;/** * 创建人 */private Integer createBy;/** * 编辑时间 */private Date editTime;/** * 编辑人 */private Integer editBy;/** * 最近登录时间 */private Date lastLoginTime;/** * 一对一关联:创建人 */private TUser createByPO;/** * 一对一关联:编辑人 */private TUser editByPO;private static final long serialVersionUID = 1L;//角色的Listprivate List roleList;//权限标识符Listprivate List permissionList;//让以下的都JSON忽略,不然会报异常,而且也用不着他们@JsonIgnore@Overridepublic Collection getAuthorities() {List list = new ArrayList();//角色列表遍历,做非空判断避免空指针if(this.getRoleList() != null){this.getRoleList().forEach(role -> {list.add(new SimpleGrantedAuthority(role));});}//权限标识符if(this.getPermissionList() != null){this.getPermissionList().forEach(permission -> {list.add(new SimpleGrantedAuthority(permission));});}return list;}@JsonIgnore@Overridepublic String getPassword() {return this.getLoginPwd();}@JsonIgnore@Overridepublic String getUsername() {return this.getLoginAct();}//以下的设计都是为1可用,为0不可用@JsonIgnore@Overridepublic boolean isAccountNonExpired() {return this.getAccountNoExpired() == 1;}@JsonIgnore@Overridepublic boolean isAccountNonLocked() {return this.getAccountNoLocked() == 1;}@JsonIgnore@Overridepublic boolean isCredentialsNonExpired() {return this.getCredentialsNoExpired() == 1;}@JsonIgnore@Overridepublic boolean isEnabled() {return this.getAccountEnabled() == 1;}}
package com.alatus.model;import java.io.Serializable;import java.util.ArrayList;import java.util.Collection;import java.util.Date;import java.util.List;import com.fasterxml.jackson.annotation.JsonIgnore;import lombok.Data;import org.springframework.security.core.GrantedAuthority;import org.springframework.security.core.authority.SimpleGrantedAuthority;import org.springframework.security.core.userdetails.UserDetails;/** * 用户表 * t_user */@Datapublic class TUser implements UserDetails,Serializable {/** * 主键,自动增长,用户ID */private Integer id;/** * 登录账号 */private String loginAct;/** * 登录密码 */private String loginPwd;/** * 用户姓名 */private String name;/** * 用户手机 */private String phone;/** * 用户邮箱 */private String email;/** * 账户是否没有过期,0已过期 1正常 */private Integer accountNoExpired;/** * 密码是否没有过期,0已过期 1正常 */private Integer credentialsNoExpired;/** * 账号是否没有锁定,0已锁定 1正常 */private Integer accountNoLocked;/** * 账号是否启用,0禁用 1启用 */private Integer accountEnabled;/** * 创建时间 */private Date createTime;/** * 创建人 */private Integer createBy;/** * 编辑时间 */private Date editTime;/** * 编辑人 */private Integer editBy;/** * 最近登录时间 */private Date lastLoginTime;/** * 一对一关联:创建人 */private TUser createByPO;/** * 一对一关联:编辑人 */private TUser editByPO;private static final long serialVersionUID = 1L;//角色的Listprivate List roleList;//权限标识符Listprivate List permissionList;//让以下的都JSON忽略,不然会报异常,而且也用不着他们@JsonIgnore@Overridepublic Collection getAuthorities() {List list = new ArrayList();//角色列表遍历,做非空判断避免空指针if(this.getRoleList() != null){this.getRoleList().forEach(role -> {list.add(new SimpleGrantedAuthority(role));});}//权限标识符if(this.getPermissionList() != null){this.getPermissionList().forEach(permission -> {list.add(new SimpleGrantedAuthority(permission));});}return list;}@JsonIgnore@Overridepublic String getPassword() {return this.getLoginPwd();}@JsonIgnore@Overridepublic String getUsername() {return this.getLoginAct();}//以下的设计都是为1可用,为0不可用@JsonIgnore@Overridepublic boolean isAccountNonExpired() {return this.getAccountNoExpired() == 1;}@JsonIgnore@Overridepublic boolean isAccountNonLocked() {return this.getAccountNoLocked() == 1;}@JsonIgnore@Overridepublic boolean isCredentialsNonExpired() {return this.getCredentialsNoExpired() == 1;}@JsonIgnore@Overridepublic boolean isEnabled() {return this.getAccountEnabled() == 1;}}
package com.alatus.mapper;import com.alatus.model.TUser;import java.util.ArrayList;public interface TUserMapper {int deleteByPrimaryKey(Integer id);int insert(TUser record);int insertSelective(TUser record);TUser selectByPrimaryKey(Integer id);int updateByPrimaryKeySelective(TUser record);int updateByPrimaryKey(TUser record);TUser selectByLoginAct(String username);ArrayList selectUserByPage();TUser selectDetailByPrimaryKey(Integer id);}
package com.alatus.mapper;import com.alatus.model.TUser;import java.util.ArrayList;public interface TUserMapper {int deleteByPrimaryKey(Integer id);int insert(TUser record);int insertSelective(TUser record);TUser selectByPrimaryKey(Integer id);int updateByPrimaryKeySelective(TUser record);int updateByPrimaryKey(TUser record);TUser selectByLoginAct(String username);ArrayList selectUserByPage();TUser selectDetailByPrimaryKey(Integer id);}
package com.alatus.service;import com.alatus.model.TUser;import com.alatus.query.UserQuery;import com.github.pagehelper.PageInfo;import org.springframework.security.core.userdetails.UserDetailsService;public interface UserService extends UserDetailsService {PageInfo getUserByPage(Integer current);TUser getUserById(Integer id);int saveUser(UserQuery userQuery);}
package com.alatus.service;import com.alatus.model.TUser;import com.alatus.query.UserQuery;import com.github.pagehelper.PageInfo;import org.springframework.security.core.userdetails.UserDetailsService;public interface UserService extends UserDetailsService {PageInfo getUserByPage(Integer current);TUser getUserById(Integer id);int saveUser(UserQuery userQuery);}
package com.alatus.web;import com.alatus.model.TUser;import com.alatus.query.UserQuery;import com.alatus.result.R;import com.alatus.service.UserService;import com.github.pagehelper.PageInfo;import jakarta.annotation.Resource;import org.springframework.security.core.Authentication;import org.springframework.web.bind.annotation.*;@RestControllerpublic class UserController {@Resourceprivate UserService userService;//获取登录信息@GetMapping(value = "/api/login/info")public R loginInfo(Authentication authentication){TUser tUser = (TUser) authentication.getPrincipal();return R.OK(tUser);}//免登录验证//因为发送的请求过来首先会过filter那一关,能到这说明token验证都通过了,我们直接返回200即可@GetMapping(value = "/api/login/free")public R freeLogin(){return R.OK();}//查询用户列表@GetMapping(value = "/api/users")//传递参数current,可传可不传,public R userPage(@RequestParam(value = "current",required = false) Integer current){if(current == null){current = 1;}//返回结果为PageInfoPageInfo userByPage = userService.getUserByPage(current);return R.OK(userByPage);}@GetMapping(value = "/api/user/{id}")public R userDetail(@PathVariable(value = "id")Integer id){TUser tUser = userService.getUserById(id);return R.OK(tUser);}@PostMapping(value = "/api/user/add")public R addUser(UserQuery userQuery,@RequestHeader(value = "Authorization")String token){userQuery.setToken(token);int save = userService.saveUser(userQuery);return save >= 1 ? R.OK() : R.FAIL();}}
package com.alatus.web;import com.alatus.model.TUser;import com.alatus.query.UserQuery;import com.alatus.result.R;import com.alatus.service.UserService;import com.github.pagehelper.PageInfo;import jakarta.annotation.Resource;import org.springframework.security.core.Authentication;import org.springframework.web.bind.annotation.*;@RestControllerpublic class UserController {@Resourceprivate UserService userService;//获取登录信息@GetMapping(value = "/api/login/info")public R loginInfo(Authentication authentication){TUser tUser = (TUser) authentication.getPrincipal();return R.OK(tUser);}//免登录验证//因为发送的请求过来首先会过filter那一关,能到这说明token验证都通过了,我们直接返回200即可@GetMapping(value = "/api/login/free")public R freeLogin(){return R.OK();}//查询用户列表@GetMapping(value = "/api/users")//传递参数current,可传可不传,public R userPage(@RequestParam(value = "current",required = false) Integer current){if(current == null){current = 1;}//返回结果为PageInfoPageInfo userByPage = userService.getUserByPage(current);return R.OK(userByPage);}@GetMapping(value = "/api/user/{id}")public R userDetail(@PathVariable(value = "id")Integer id){TUser tUser = userService.getUserById(id);return R.OK(tUser);}@PostMapping(value = "/api/user/add")public R addUser(UserQuery userQuery,@RequestHeader(value = "Authorization")String token){userQuery.setToken(token);int save = userService.saveUser(userQuery);return save >= 1 ? R.OK() : R.FAIL();}}
package com.alatus.query;import lombok.Data;@Datapublic class BaseQuery {//这里是JWTprivate String token;}
package com.alatus.query;import lombok.Data;@Datapublic class BaseQuery {//这里是JWTprivate String token;}
package com.alatus.query;import lombok.Data;@Datapublic class UserQuery extends BaseQuery{/** * 主键,自动增长,用户ID */private Integer id;/** * 登录账号 */private String loginAct;/** * 登录密码 */private String loginPwd;/** * 用户姓名 */private String name;/** * 用户手机 */private String phone;/** * 用户邮箱 */private String email;/** * 账户是否没有过期,0已过期 1正常 */private Integer accountNoExpired;/** * 密码是否没有过期,0已过期 1正常 */private Integer credentialsNoExpired;/** * 账号是否没有锁定,0已锁定 1正常 */private Integer accountNoLocked;/** * 账号是否启用,0禁用 1启用 */private Integer accountEnabled;}
package com.alatus.query;import lombok.Data;@Datapublic class UserQuery extends BaseQuery{/** * 主键,自动增长,用户ID */private Integer id;/** * 登录账号 */private String loginAct;/** * 登录密码 */private String loginPwd;/** * 用户姓名 */private String name;/** * 用户手机 */private String phone;/** * 用户邮箱 */private String email;/** * 账户是否没有过期,0已过期 1正常 */private Integer accountNoExpired;/** * 密码是否没有过期,0已过期 1正常 */private Integer credentialsNoExpired;/** * 账号是否没有锁定,0已锁定 1正常 */private Integer accountNoLocked;/** * 账号是否启用,0禁用 1启用 */private Integer accountEnabled;}