mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-22 15:21:53 +08:00
完成 user-admin-server 的用户手机 + 密码登录
This commit is contained in:
parent
03ef1fc764
commit
028c99aa10
@ -88,7 +88,7 @@
|
|||||||
| `yudao-admin-ui` | 管理后台的 UI 界面 |
|
| `yudao-admin-ui` | 管理后台的 UI 界面 |
|
||||||
| `yudao-user-server` | 用户前台的服务端 |
|
| `yudao-user-server` | 用户前台的服务端 |
|
||||||
| `yudao-user-ui` | 用户前台的 UI 界面 |
|
| `yudao-user-ui` | 用户前台的 UI 界面 |
|
||||||
| `yudao-core-service` | 通用服务,提供共享逻辑 |
|
| `yudao-core-service` | 公共服务,提供共享逻辑 |
|
||||||
|
|
||||||
> 友情提示:`yudao-admin-server` 和 `yudao-user-server` 会存在需要复用的逻辑,通过 `yudao-core-service` 实现。
|
> 友情提示:`yudao-admin-server` 和 `yudao-user-server` 会存在需要复用的逻辑,通过 `yudao-core-service` 实现。
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"local": {
|
"local": {
|
||||||
"baseUrl": "http://127.0.0.1:48080/api",
|
"baseUrl": "http://127.0.0.1:48080/api",
|
||||||
|
"userServerUrl": "http://127.0.0.1:28080/api",
|
||||||
"token": "test1"
|
"token": "test1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
<druid.version>1.2.4</druid.version>
|
<druid.version>1.2.4</druid.version>
|
||||||
<mybatis-plus.version>3.4.2</mybatis-plus.version>
|
<mybatis-plus.version>3.4.2</mybatis-plus.version>
|
||||||
<dynamic-datasource.version>3.3.2</dynamic-datasource.version>
|
<dynamic-datasource.version>3.3.2</dynamic-datasource.version>
|
||||||
<redisson.version>3.15.1</redisson.version>
|
<redisson.version>3.16.3</redisson.version>
|
||||||
<!-- Config 配置中心相关 -->
|
<!-- Config 配置中心相关 -->
|
||||||
<apollo.version>1.7.0</apollo.version>
|
<apollo.version>1.7.0</apollo.version>
|
||||||
<!-- Job 定时任务相关 -->
|
<!-- Job 定时任务相关 -->
|
||||||
|
@ -9,9 +9,4 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
|
|||||||
*/
|
*/
|
||||||
public interface MbrErrorCodeConstants {
|
public interface MbrErrorCodeConstants {
|
||||||
|
|
||||||
// ========== AUTH 模块 1004000000 ==========
|
|
||||||
ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1004000000, "登录失败,账号密码不正确");
|
|
||||||
ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1004000001, "登录失败,账号被禁用");
|
|
||||||
ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1004000002, "登录失败"); // 登录失败的兜底,未知原因
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
package cn.iocoder.yudao.userserver.modules.member.service;
|
@ -0,0 +1,8 @@
|
|||||||
|
### 请求 /login 接口 => 成功
|
||||||
|
POST {{userServerUrl}}/login
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"mobile": "15601691300",
|
||||||
|
"password": "admin123"
|
||||||
|
}
|
@ -1,8 +1,8 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.*;
|
import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.service.auth.MbrAuthService;
|
import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
import io.swagger.annotations.ApiImplicitParams;
|
import io.swagger.annotations.ApiImplicitParams;
|
||||||
@ -23,14 +23,14 @@ import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUse
|
|||||||
@RequestMapping("/")
|
@RequestMapping("/")
|
||||||
@Validated
|
@Validated
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class MbrAuthController {
|
public class SysAuthController {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private MbrAuthService authService;
|
private SysAuthService authService;
|
||||||
|
|
||||||
@PostMapping("/login")
|
@PostMapping("/login")
|
||||||
@ApiOperation("使用手机 + 密码登录")
|
@ApiOperation("使用手机 + 密码登录")
|
||||||
public CommonResult<MbrAuthLoginRespVO> login(@RequestBody @Valid MbrAuthLoginReqVO reqVO) {
|
public CommonResult<MbrAuthLoginRespVO> login(@RequestBody @Valid SysAuthLoginReqVO reqVO) {
|
||||||
String token = authService.login(reqVO, getClientIP(), getUserAgent());
|
String token = authService.login(reqVO, getClientIP(), getUserAgent());
|
||||||
// 返回结果
|
// 返回结果
|
||||||
return success(MbrAuthLoginRespVO.builder().token(token).build());
|
return success(MbrAuthLoginRespVO.builder().token(token).build());
|
||||||
@ -38,7 +38,7 @@ public class MbrAuthController {
|
|||||||
|
|
||||||
@PostMapping("/sms-login")
|
@PostMapping("/sms-login")
|
||||||
@ApiOperation("使用手机 + 验证码登录")
|
@ApiOperation("使用手机 + 验证码登录")
|
||||||
public CommonResult<MbrAuthLoginRespVO> smsLogin(@RequestBody @Valid MbrAuthLoginReqVO reqVO) {
|
public CommonResult<MbrAuthLoginRespVO> smsLogin(@RequestBody @Valid SysAuthLoginReqVO reqVO) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ public class MbrAuthController {
|
|||||||
|
|
||||||
@PostMapping("/reset-password")
|
@PostMapping("/reset-password")
|
||||||
@ApiOperation(value = "重置密码", notes = "用户忘记密码时使用")
|
@ApiOperation(value = "重置密码", notes = "用户忘记密码时使用")
|
||||||
public CommonResult<Boolean> resetPassword(@RequestBody @Valid MbrAuthResetPasswordReqVO reqVO) {
|
public CommonResult<Boolean> resetPassword(@RequestBody @Valid SysAuthResetPasswordReqVO reqVO) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.validation.Mobile;
|
import cn.iocoder.yudao.framework.common.validation.Mobile;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
@ -21,4 +21,4 @@ public class MbrAuthSendSmsReqVO {
|
|||||||
@NotNull(message = "发送场景不能为空")
|
@NotNull(message = "发送场景不能为空")
|
||||||
private Integer scene;
|
private Integer scene;
|
||||||
|
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.validation.Mobile;
|
import cn.iocoder.yudao.framework.common.validation.Mobile;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
|
import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
|
import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
|
import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
|
import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.validation.Mobile;
|
import cn.iocoder.yudao.framework.common.validation.Mobile;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
@ -16,7 +16,7 @@ import javax.validation.constraints.NotEmpty;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
public class MbrAuthLoginReqVO {
|
public class SysAuthLoginReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "手机号", required = true, example = "15601691300")
|
@ApiModelProperty(value = "手机号", required = true, example = "15601691300")
|
||||||
@NotEmpty(message = "手机号不能为空")
|
@NotEmpty(message = "手机号不能为空")
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
|
package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
@ -16,7 +16,7 @@ import javax.validation.constraints.Pattern;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
public class MbrAuthResetPasswordReqVO {
|
public class SysAuthResetPasswordReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "新密码", required = true, example = "buzhidao")
|
@ApiModelProperty(value = "新密码", required = true, example = "buzhidao")
|
||||||
@NotEmpty(message = "新密码不能为空")
|
@NotEmpty(message = "新密码不能为空")
|
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* 占位
|
||||||
|
*/
|
||||||
|
package cn.iocoder.yudao.userserver.modules.system.controller;
|
@ -1,9 +1,10 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.convert.user;
|
package cn.iocoder.yudao.userserver.modules.system.convert.auth;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
|
import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
|
||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.Mapping;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
@ -11,6 +12,7 @@ public interface MbrAuthConvert {
|
|||||||
|
|
||||||
MbrAuthConvert INSTANCE = Mappers.getMapper(MbrAuthConvert.class);
|
MbrAuthConvert INSTANCE = Mappers.getMapper(MbrAuthConvert.class);
|
||||||
|
|
||||||
|
@Mapping(source = "mobile", target = "username")
|
||||||
LoginUser convert0(MbrUserDO bean);
|
LoginUser convert0(MbrUserDO bean);
|
||||||
|
|
||||||
default LoginUser convert(MbrUserDO bean) {
|
default LoginUser convert(MbrUserDO bean) {
|
@ -0,0 +1,17 @@
|
|||||||
|
package cn.iocoder.yudao.userserver.modules.system.enums;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* System 错误码枚举类
|
||||||
|
*
|
||||||
|
* system 系统,使用 1-005-000-000 段
|
||||||
|
*/
|
||||||
|
public interface SysErrorCodeConstants {
|
||||||
|
|
||||||
|
// ========== AUTH 模块 1005000000 ==========
|
||||||
|
ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1005000000, "登录失败,账号密码不正确");
|
||||||
|
ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1005000001, "登录失败,账号被禁用");
|
||||||
|
ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1005000002, "登录失败"); // 登录失败的兜底,未知原因
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.service.auth;
|
package cn.iocoder.yudao.userserver.modules.system.service.auth;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
|
import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.MbrAuthLoginReqVO;
|
import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthLoginReqVO;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
|
||||||
@ -12,7 +12,7 @@ import javax.validation.Valid;
|
|||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
public interface MbrAuthService extends SecurityAuthFrameworkService {
|
public interface SysAuthService extends SecurityAuthFrameworkService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 手机 + 密码登录
|
* 手机 + 密码登录
|
||||||
@ -22,6 +22,6 @@ public interface MbrAuthService extends SecurityAuthFrameworkService {
|
|||||||
* @param userAgent 用户 UA
|
* @param userAgent 用户 UA
|
||||||
* @return 身份令牌,使用 JWT 方式
|
* @return 身份令牌,使用 JWT 方式
|
||||||
*/
|
*/
|
||||||
String login(@Valid MbrAuthLoginReqVO reqVO, String userIp, String userAgent);
|
String login(@Valid SysAuthLoginReqVO reqVO, String userIp, String userAgent);
|
||||||
|
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.userserver.modules.member.service.auth.impl;
|
package cn.iocoder.yudao.userserver.modules.system.service.auth.impl;
|
||||||
|
|
||||||
import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
|
import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
|
||||||
import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
|
import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
|
||||||
@ -6,10 +6,10 @@ import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLo
|
|||||||
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
||||||
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.MbrAuthLoginReqVO;
|
import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthLoginReqVO;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.convert.user.MbrAuthConvert;
|
import cn.iocoder.yudao.userserver.modules.system.convert.auth.MbrAuthConvert;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
|
import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.service.auth.MbrAuthService;
|
import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService;
|
||||||
import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
|
import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
|
||||||
import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum;
|
import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum;
|
||||||
import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
|
import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
|
||||||
@ -30,7 +30,7 @@ import javax.annotation.Resource;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants.*;
|
import static cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Auth Service 实现类
|
* Auth Service 实现类
|
||||||
@ -39,7 +39,7 @@ import static cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConst
|
|||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class MbrAuthServiceImpl implements MbrAuthService {
|
public class SysAuthServiceImpl implements SysAuthService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
@Lazy // 延迟加载,因为存在相互依赖的问题
|
@Lazy // 延迟加载,因为存在相互依赖的问题
|
||||||
@ -64,7 +64,7 @@ public class MbrAuthServiceImpl implements MbrAuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String login(MbrAuthLoginReqVO reqVO, String userIp, String userAgent) {
|
public String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent) {
|
||||||
// 使用手机 + 密码,进行登录。
|
// 使用手机 + 密码,进行登录。
|
||||||
LoginUser loginUser = this.login0(reqVO.getMobile(), reqVO.getPassword());
|
LoginUser loginUser = this.login0(reqVO.getMobile(), reqVO.getPassword());
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
package cn.iocoder.yudao.userserver.modules.system.service;
|
1
更新日志.md
1
更新日志.md
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
* 新增管理后台的企业微信、钉钉等社交登录
|
* 新增管理后台的企业微信、钉钉等社交登录
|
||||||
* 新增用户前台(例如说,用户使用的小程序)的后端项目 `yudao-user-server`
|
* 新增用户前台(例如说,用户使用的小程序)的后端项目 `yudao-user-server`
|
||||||
|
* 新增公共服务 `yudao-core-service` 项目,通过 Jar 包的方式,提供 `yudao-user-server` 和 `yudao-admin-server` 的共享逻辑的复用。
|
||||||
* 新增用户前台的手机登录、验证码登录、TODO
|
* 新增用户前台的手机登录、验证码登录、TODO
|
||||||
* 修复管理后台的用户头像上传 404 的问题
|
* 修复管理后台的用户头像上传 404 的问题
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user