Commit 5fcbcd61 authored by 陈立彬's avatar 陈立彬

后管系统用户登录

parent b5b2c7ad
...@@ -6,8 +6,14 @@ import cn.breeze.elleai.application.dto.request.PageRequest; ...@@ -6,8 +6,14 @@ import cn.breeze.elleai.application.dto.request.PageRequest;
import cn.breeze.elleai.application.dto.request.UserLoginRequest; import cn.breeze.elleai.application.dto.request.UserLoginRequest;
import cn.breeze.elleai.application.dto.response.PagePermissionResult; import cn.breeze.elleai.application.dto.response.PagePermissionResult;
import cn.breeze.elleai.application.dto.response.UserLoginResult; import cn.breeze.elleai.application.dto.response.UserLoginResult;
import cn.breeze.elleai.domain.sparring.model.response.SysUserResponseModel;
import cn.breeze.elleai.domain.system.service.SysUserService;
import cn.breeze.elleai.exception.InternalException;
import cn.breeze.elleai.util.IkMD5Utils;
import cn.breeze.elleai.util.JwtUtil; import cn.breeze.elleai.util.JwtUtil;
import cn.breeze.elleai.util.UserPrincipal; import cn.breeze.elleai.util.UserPrincipal;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
...@@ -27,14 +33,29 @@ import org.springframework.web.bind.annotation.*; ...@@ -27,14 +33,29 @@ import org.springframework.web.bind.annotation.*;
@RequiredArgsConstructor @RequiredArgsConstructor
public class AuthController { public class AuthController {
private final SysUserService sysUserService;
@Operation(summary = "用户登录") @Operation(summary = "用户登录")
@PostMapping(value = "/oauth/login") @PostMapping(value = "/oauth/login")
public ApiResponse<UserLoginResult> login(@RequestBody UserLoginRequest request) { public ApiResponse<UserLoginResult> login(@RequestBody UserLoginRequest request) {
UserLoginResult result = new UserLoginResult(); UserLoginResult result = new UserLoginResult();
String token = JwtUtil.generateToken(request.getUserName(), request.getPassword());
SysUserResponseModel user = sysUserService.findByUsername(request.getUserName());
if (ObjectUtil.isNull(user)) {
log.error("账号:{},不存在!", request.getUserName());
throw new InternalException(1000, "用户不存在");
}
if (!StrUtil.equals(user.getPassword(), IkMD5Utils.md5(request.getPassword()))) {
throw new InternalException(1000, "账号或密码错误");
}
String token = JwtUtil.generateToken(request.getUserName(), request.getPassword(), user.getId());
result.setToken(token); result.setToken(token);
result.setUserName(request.getUserName()); result.setUserName(request.getUserName());
result.setNickName(user.getNickName());
result.setAvatar(user.getAvatar());
result.setUserId(String.valueOf(user.getId()));
return ApiResponse.ok(result); return ApiResponse.ok(result);
} }
......
package cn.breeze.elleai.domain.sparring.model.response;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class SysUserResponseModel implements Serializable {
private Long id;
/**
* 系统用户账号
*/
private String username;
/**
* 昵称
*/
private String mobile;
/**
* 昵称
*/
private String email;
/**
* 系统用户密码(加密的)
*/
private String password;
/**
* 昵称
*/
private String nickName;
/**
* 头像
*/
private String avatar;
/**
* 系统用户salt
*/
private String salt;
/**
* 系统用户状态 1启用,0禁用
*/
private Integer status;
/**
* 是否删除
*/
private Integer deleted;
/**
* 创建时间
*/
private Date createAt;
/**
* 更新时间
*/
private Date updateAt;
}
package cn.breeze.elleai.domain.system.service;
import cn.breeze.elleai.domain.sparring.model.response.SysUserResponseModel;
import cn.breeze.elleai.infra.entity.KbEntity;
import cn.breeze.elleai.infra.entity.SysUserEntity;
import com.mybatisflex.core.service.IService;
/**
* 服务层。
*
* @author breeze
* @since 2024-10-21
*/
public interface SysUserService extends IService<SysUserEntity> {
SysUserResponseModel findByUsername(String username);
}
package cn.breeze.elleai.domain.system.service;
import cn.breeze.elleai.domain.sparring.model.response.KbVectorResponseModel;
import cn.breeze.elleai.domain.sparring.model.response.SysUserResponseModel;
import cn.breeze.elleai.infra.entity.SysUserEntity;
import cn.breeze.elleai.infra.mapper.SysUserMapper;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import static cn.breeze.elleai.infra.entity.table.SysUserTableDef.SYS_USER_ENTITY;
/**
* 服务层实现。
*
* @author breeze
* @since 2024-10-21
*/
@Service
@RequiredArgsConstructor
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserEntity> implements SysUserService {
private final SysUserMapper sysUserMapper;
@Override
public SysUserResponseModel findByUsername(String username) {
QueryWrapper queryWrapper = QueryWrapper.create()
.where(SYS_USER_ENTITY.USERNAME.eq(username));
return sysUserMapper.selectOneByQueryAs(queryWrapper, SysUserResponseModel.class);
}
}
package cn.breeze.elleai.infra.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 实体类。
*
* @author breeze
* @since 2024-09-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("sys_user")
public class SysUserEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 系统用户账号
*/
private String username;
/**
* 昵称
*/
private String mobile;
/**
* 昵称
*/
private String email;
/**
* 系统用户密码(加密的)
*/
private String password;
/**
* 昵称
*/
private String nickName;
/**
* 头像
*/
private String avatar;
/**
* 系统用户salt
*/
private String salt;
/**
* 系统用户状态 1启用,0禁用
*/
private Integer status;
/**
* 是否删除
*/
private Integer deleted;
/**
* 创建时间
*/
private Date createAt;
/**
* 更新时间
*/
private Date updateAt;
}
package cn.breeze.elleai.infra.entity.table;
import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.table.TableDef;
import java.io.Serial;
/**
* 表定义层。
*
* @author breeze
* @since 2024-09-18
*/
public class SysUserTableDef extends TableDef {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
public static final SysUserTableDef SYS_USER_ENTITY = new SysUserTableDef();
public final QueryColumn ID = new QueryColumn(this, "id");
/**
* 系统用户编号
*/
public final QueryColumn USERNAME = new QueryColumn(this, "username");
/**
* 手机号
*/
public final QueryColumn MOBILE = new QueryColumn(this, "mobile");
/**
* 邮箱
*/
public final QueryColumn EMAIL = new QueryColumn(this, "email");
/**
* 手机号
*/
public final QueryColumn PASSWORD = new QueryColumn(this, "password");
/**
* 昵称
*/
public final QueryColumn NICKNAME = new QueryColumn(this, "nick_name");
/**
* 头像
*/
public final QueryColumn AVATAR = new QueryColumn(this, "avatar");
/**
*
*/
public final QueryColumn SALT = new QueryColumn(this, "salt");
/**
* 状态(0禁用 1启用)
*/
public final QueryColumn STATUS = new QueryColumn(this, "status");
/**
* 是否删除(0否 1是)
*/
public final QueryColumn DELETED = new QueryColumn(this, "deleted");
/**
* 创建时间
*/
public final QueryColumn CREATE_AT = new QueryColumn(this, "create_at");
/**
* 更新时间
*/
public final QueryColumn UPDATE_AT = new QueryColumn(this, "update_at");
/**
* 所有字段。
*/
public final QueryColumn ALL_COLUMNS = new QueryColumn(this, "*");
/**
* 默认字段,不包含逻辑删除或者 large 等字段。
*/
public final QueryColumn[] DEFAULT_COLUMNS = new QueryColumn[]{ID, USERNAME, MOBILE, EMAIL, PASSWORD, NICKNAME, AVATAR, SALT, STATUS, DELETED, CREATE_AT, UPDATE_AT};
public SysUserTableDef() {
super("", "sys_user");
}
private SysUserTableDef(String schema, String name, String alisa) {
super(schema, name, alisa);
}
public SysUserTableDef as(String alias) {
String key = getNameWithSchema() + "." + alias;
return getCache(key, k -> new SysUserTableDef("", "sys_user", alias));
}
}
package cn.breeze.elleai.infra.mapper;
import cn.breeze.elleai.infra.entity.SysUserEntity;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 映射层。
*
* @author breeze
* @since 2024-10-21
*/
@Mapper
public interface SysUserMapper extends BaseMapper<SysUserEntity> {
}
package cn.breeze.elleai.util;
import cn.breeze.elleai.exception.InternalException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class IkMD5Utils {
public static String stringToMD5(String plainText) {
byte[] secretBytes;
try {
secretBytes = MessageDigest.getInstance("md5").digest(
plainText.getBytes(StandardCharsets.UTF_8));
} catch (Exception e) {
throw new InternalException(2000, "转MD5失败,明文={"+plainText+"}错误={"+e+"}");
}
StringBuilder md5code = new StringBuilder(new BigInteger(1, secretBytes).toString(16));
while (md5code.length() < 32) {
md5code.insert(0, "0");
}
return md5code.toString().toUpperCase();
}
public static String md5(String password) {
StringBuilder sb = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] bytes = md.digest();
sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
} catch (NoSuchAlgorithmException e) {
throw new InternalException(2000, "密码MD5失败");
}
return sb.toString();
}
}
...@@ -80,13 +80,13 @@ public class JwtUtil { ...@@ -80,13 +80,13 @@ public class JwtUtil {
})); }));
} }
public static String generateToken(String userName, String password) { public static String generateToken(String userName, String password, Long userId) {
String token = null; String token = null;
Long expireTime = 1000*24 * 60 * 60 * 1000L; Long expireTime = 1000*24 * 60 * 60 * 1000L;
Date expiresAt = new Date(System.currentTimeMillis()+ expireTime); Date expiresAt = new Date(System.currentTimeMillis()+ expireTime);
token = JWT.create() token = JWT.create()
.withIssuer("oss") .withIssuer("oss")
.withClaim("userId", UUID.randomUUID().toString(true)) .withClaim("userId", String.valueOf(userId))
.withClaim("userName",userName) .withClaim("userName",userName)
.withClaim( "position", "") .withClaim( "position", "")
.withClaim("jobTitle","") .withClaim("jobTitle","")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment