diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java b/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java index 678c546e..29f6b706 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java @@ -69,6 +69,7 @@ public class ShiroConfig { filterMap.put("/captcha", "anon"); filterMap.put("/favicon.ico", "anon"); filterMap.put("/mobile/**", "anon"); + filterMap.put("/user/**", "anon"); filterMap.put("/**", "oauth2"); shiroFilter.setFilterChainDefinitionMap(filterMap); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java index 82051dab..3f549ffb 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java @@ -2,41 +2,37 @@ package xiaozhi.modules.security.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import xiaozhi.common.exception.ErrorCode; -import xiaozhi.common.redis.RedisUtils; -import xiaozhi.common.utils.PropertiesUtils; +import xiaozhi.common.exception.RenException; import xiaozhi.common.utils.Result; import xiaozhi.common.validator.AssertUtils; import xiaozhi.modules.security.dto.LoginDTO; +import xiaozhi.modules.security.password.PasswordUtils; import xiaozhi.modules.security.service.CaptchaService; import xiaozhi.modules.security.service.SysUserTokenService; -import xiaozhi.modules.sys.service.SysParamsService; +import xiaozhi.modules.sys.dto.SysUserDTO; import xiaozhi.modules.sys.service.SysUserService; import java.io.IOException; /** - * 登录 + * 登录控制层 */ +@Tag(name = "登录管理") @AllArgsConstructor @RestController +@RequestMapping("/user") @Tag(name = "登录管理") public class LoginController { private final SysUserService sysUserService; private final SysUserTokenService sysUserTokenService; private final CaptchaService captchaService; - private final RedisUtils redisUtils; - private final SysParamsService sysParamsService; - private final PropertiesUtils propertiesUtils; - @GetMapping("captcha") + + @GetMapping("/captcha") @Operation(summary = "验证码") public void captcha(HttpServletResponse response, String uuid) throws IOException { //uuid不能为空 @@ -46,10 +42,45 @@ public class LoginController { captchaService.create(response, uuid); } - @PostMapping("login") + @PostMapping("/login") @Operation(summary = "登录") - public Result login(HttpServletRequest request, @RequestBody LoginDTO login) { - return sysUserTokenService.createToken(1L); + public Result login( @RequestBody LoginDTO login) { + // 验证是否正确输入验证码 + boolean validate = captchaService.validate(login.getCaptchaId(), login.getCaptcha()); + if (!validate) { + throw new RenException("验证码错误,请重新获取"); + } + // 按照用户名获取用户 + SysUserDTO userDTO = sysUserService.getByUsername(login.getMobile()); + // 判断用户是否存在 + if (userDTO == null) { + throw new RenException("请检测用户和密码是否输入错误"); + } + // 判断密码是否正确,不一样则进入if + if (!PasswordUtils.matches(login.getPassword(), userDTO.getPassword())) { + throw new RenException("请检测用户和密码是否输入错误"); + } + return sysUserTokenService.createToken(userDTO.getId()); + } + + @PostMapping("/register") + @Operation(summary = "注册") + public Result register(@RequestBody LoginDTO login) { + // 验证是否正确输入验证码 + boolean validate = captchaService.validate(login.getCaptchaId(), login.getCaptcha()); + if (!validate) { + throw new RenException("验证码错误,请重新获取"); + } + // 按照用户名获取用户 + SysUserDTO userDTO = sysUserService.getByUsername(login.getMobile()); + if (userDTO != null){ + throw new RenException("此手机号码已经注册过"); + } + userDTO = new SysUserDTO(); + userDTO.setUsername(login.getMobile()); + userDTO.setPassword(login.getPassword()); + sysUserService.save(userDTO); + return new Result(); } } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/dto/LoginDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/security/dto/LoginDTO.java index 67f50f19..076324ef 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/dto/LoginDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/dto/LoginDTO.java @@ -13,9 +13,9 @@ import java.io.Serializable; @Schema(description = "登录表单") public class LoginDTO implements Serializable { - @Schema(description = "用户名", required = true) + @Schema(description = "手机号码") @NotBlank(message = "{sysuser.username.require}") - private String username; + private String mobile; @Schema(description = "密码") @NotBlank(message = "{sysuser.password.require}") @@ -27,6 +27,6 @@ public class LoginDTO implements Serializable { @Schema(description = "唯一标识") @NotBlank(message = "{sysuser.uuid.require}") - private String uuid; + private String captchaId; } \ No newline at end of file diff --git a/main/manager-api/src/main/resources/application.yml b/main/manager-api/src/main/resources/application.yml index 0b0e6281..967f610e 100644 --- a/main/manager-api/src/main/resources/application.yml +++ b/main/manager-api/src/main/resources/application.yml @@ -7,7 +7,7 @@ server: min-spare: 30 port: 8002 servlet: - context-path: /xiaozhi-esp32-api + context-path: /xiaozhi-esp32-api/api/v1 session: cookie: http-only: true diff --git a/main/manager-api/src/main/resources/db/changelog/202503101631.sql b/main/manager-api/src/main/resources/db/changelog/202503101631.sql new file mode 100644 index 00000000..4055cad5 --- /dev/null +++ b/main/manager-api/src/main/resources/db/changelog/202503101631.sql @@ -0,0 +1,2 @@ +-- 给用户表添加一个创建者 +ALTER TABLE sys_user ADD COLUMN creator BIGINT COMMENT '创建者'; \ No newline at end of file diff --git a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml index 73d916fa..563858cc 100755 --- a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml @@ -8,4 +8,11 @@ databaseChangeLog: changes: - sqlFile: encoding: utf8 - path: classpath:db/changelog/001create_sys.sql \ No newline at end of file + path: classpath:db/changelog/001create_sys.sql + - changeSet: + id: 202503101631 + author: zjy + changes: + - sqlFile: + encoding: utf8 + path: classpath:db/changelog/202503101631.sql