diff --git a/RuoYi-Vue/ruoyi-admin/pom.xml b/RuoYi-Vue/ruoyi-admin/pom.xml
index d357be8..2750133 100644
--- a/RuoYi-Vue/ruoyi-admin/pom.xml
+++ b/RuoYi-Vue/ruoyi-admin/pom.xml
@@ -61,6 +61,18 @@
ruoyi-generator
+
+ junit
+ junit
+ test
+
+
+
+ org.mockito
+ mockito-core
+ test
+
+
@@ -93,4 +105,4 @@
${project.artifactId}
-
\ No newline at end of file
+
diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/front/FrontAuthController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/front/FrontAuthController.java
new file mode 100644
index 0000000..0851074
--- /dev/null
+++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/front/FrontAuthController.java
@@ -0,0 +1,61 @@
+package com.ruoyi.web.controller.front;
+
+import org.springframework.beans.factory.annotation.Autowired;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.generator.domain.front.dto.FrontLoginBody;
+import com.ruoyi.generator.domain.front.dto.FrontRegisterBody;
+import com.ruoyi.generator.service.front.IFrontUserService;
+import com.ruoyi.web.service.front.FrontAuthService;
+
+@RestController
+@RequestMapping("/front/auth")
+public class FrontAuthController extends BaseController
+{
+ @Autowired
+ private FrontAuthService frontAuthService;
+
+ @Autowired
+ private IFrontUserService frontUserService;
+
+ @Autowired
+ private TokenService tokenService;
+
+ @PostMapping("/register")
+ public AjaxResult register(@RequestBody FrontRegisterBody body)
+ {
+ return toAjax(frontUserService.register(body));
+ }
+
+ @PostMapping("/login")
+ public AjaxResult login(@RequestBody FrontLoginBody body)
+ {
+ AjaxResult ajax = AjaxResult.success();
+ String token = frontAuthService.login(body.getUsername(), body.getPassword());
+ ajax.put(Constants.TOKEN, token);
+ return ajax;
+ }
+
+ @GetMapping("/profile")
+ public AjaxResult profile()
+ {
+ return AjaxResult.success(frontUserService.selectById(SecurityUtils.getUserId()));
+ }
+
+ @PostMapping("/logout")
+ public AjaxResult logout()
+ {
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ tokenService.delLoginUser(loginUser.getToken());
+ return AjaxResult.success();
+ }
+}
diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/service/front/FrontAuthService.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/service/front/FrontAuthService.java
new file mode 100644
index 0000000..846aecd
--- /dev/null
+++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/service/front/FrontAuthService.java
@@ -0,0 +1,58 @@
+package com.ruoyi.web.service.front;
+
+import java.util.Collections;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.enums.UserStatus;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.generator.domain.front.FrontUser;
+import com.ruoyi.generator.service.front.IFrontUserService;
+
+@Component
+public class FrontAuthService
+{
+ @Autowired
+ private IFrontUserService frontUserService;
+
+ @Autowired
+ private TokenService tokenService;
+
+ public String login(String username, String password)
+ {
+ FrontUser frontUser = frontUserService.selectByUsername(username);
+ if (frontUser == null)
+ {
+ throw new ServiceException("前台账号或密码错误");
+ }
+ if (UserStatus.DISABLE.getCode().equals(frontUser.getStatus()))
+ {
+ throw new ServiceException("前台账号已停用");
+ }
+ if (UserStatus.DELETED.getCode().equals(frontUser.getDelFlag()))
+ {
+ throw new ServiceException("前台账号已删除");
+ }
+ if (!SecurityUtils.matchesPassword(password, frontUser.getPassword()))
+ {
+ throw new ServiceException("前台账号或密码错误");
+ }
+
+ SysUser tokenUser = new SysUser();
+ tokenUser.setUserId(frontUser.getUserId());
+ tokenUser.setUserName(frontUser.getUsername());
+ tokenUser.setNickName(StringUtils.nvl(frontUser.getNickname(), frontUser.getUsername()));
+ tokenUser.setPassword(frontUser.getPassword());
+
+ LoginUser loginUser = new LoginUser(frontUser.getUserId(), null, tokenUser, Collections.emptySet());
+ loginUser.setLoginType(Constants.LOGIN_TYPE_FRONT);
+ String token = tokenService.createToken(loginUser);
+ frontUserService.updateLastLoginTime(frontUser.getUserId());
+ return token;
+ }
+}
diff --git a/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/service/front/FrontAuthServiceTest.java b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/service/front/FrontAuthServiceTest.java
new file mode 100644
index 0000000..1aeaf83
--- /dev/null
+++ b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/service/front/FrontAuthServiceTest.java
@@ -0,0 +1,72 @@
+package com.ruoyi.web.service.front;
+
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.generator.domain.front.FrontUser;
+import com.ruoyi.generator.service.front.IFrontUserService;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.lang.reflect.Field;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class FrontAuthServiceTest
+{
+ private FrontAuthService frontAuthService;
+
+ @Mock
+ private IFrontUserService frontUserService;
+
+ @Mock
+ private TokenService tokenService;
+
+ @Before
+ public void setUp() throws Exception
+ {
+ frontAuthService = new FrontAuthService();
+ setField("frontUserService", frontUserService);
+ setField("tokenService", tokenService);
+ }
+
+ @Test
+ public void loginCreatesFrontToken()
+ {
+ FrontUser user = new FrontUser();
+ user.setUserId(100L);
+ user.setUsername("demo");
+ user.setNickname("Demo");
+ user.setPassword(SecurityUtils.encryptPassword("admin123"));
+ user.setStatus("0");
+ user.setDelFlag("0");
+
+ when(frontUserService.selectByUsername("demo")).thenReturn(user);
+ when(tokenService.createToken(any(LoginUser.class))).thenAnswer(invocation -> {
+ LoginUser loginUser = invocation.getArgument(0);
+ assertEquals(Constants.LOGIN_TYPE_FRONT, loginUser.getLoginType());
+ assertEquals(Long.valueOf(100L), loginUser.getUserId());
+ return "front-token";
+ });
+
+ String token = frontAuthService.login("demo", "admin123");
+
+ assertEquals("front-token", token);
+ verify(frontUserService).updateLastLoginTime(100L);
+ }
+
+ private void setField(String name, Object value) throws Exception
+ {
+ Field field = FrontAuthService.class.getDeclaredField(name);
+ field.setAccessible(true);
+ field.set(frontAuthService, value);
+ }
+}
diff --git a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/FrontUserServiceImpl.java b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/FrontUserServiceImpl.java
index b8ef1d5..3b50bc6 100644
--- a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/FrontUserServiceImpl.java
+++ b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/FrontUserServiceImpl.java
@@ -5,9 +5,9 @@ import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.generator.domain.front.FrontUser;
-import com.ruoyi.generator.domain.front.dto.FrontLoginBody;
import com.ruoyi.generator.domain.front.dto.FrontRegisterBody;
import com.ruoyi.generator.mapper.front.FrontUserMapper;
@@ -18,55 +18,71 @@ public class FrontUserServiceImpl implements IFrontUserService
private FrontUserMapper frontUserMapper;
@Override
- public FrontUser login(FrontLoginBody loginBody)
+ public FrontUser selectByUsername(String username)
{
- if (loginBody == null || StringUtils.isEmpty(loginBody.getUsername()) || StringUtils.isEmpty(loginBody.getPassword()))
- {
- throw new ServiceException("用户名或密码不能为空");
- }
- FrontUser user = frontUserMapper.selectFrontUserByUsername(loginBody.getUsername());
- if (user == null || !StringUtils.equals(user.getPassword(), loginBody.getPassword()))
- {
- throw new ServiceException("用户名或密码错误");
- }
- user.setLastLoginTime(new Date());
- frontUserMapper.updateFrontUser(user);
- return user;
+ return frontUserMapper.selectFrontUserByUsername(username);
}
@Override
- public FrontUser register(FrontRegisterBody registerBody)
- {
- if (registerBody == null || StringUtils.isEmpty(registerBody.getUsername()) || StringUtils.isEmpty(registerBody.getPassword()))
- {
- throw new ServiceException("用户名或密码不能为空");
- }
- if (frontUserMapper.selectFrontUserByUsername(registerBody.getUsername()) != null)
- {
- throw new ServiceException("用户名已存在");
- }
- FrontUser user = new FrontUser();
- user.setUsername(registerBody.getUsername());
- user.setPassword(registerBody.getPassword());
- user.setNickname(registerBody.getNickname());
- user.setEmail(registerBody.getEmail());
- user.setPhone(registerBody.getPhone());
- user.setStatus("0");
- user.setDelFlag("0");
- frontUserMapper.insertFrontUser(user);
- return user;
- }
-
- @Override
- public FrontUser selectFrontUserById(Long userId)
+ public FrontUser selectById(Long userId)
{
return frontUserMapper.selectFrontUserById(userId);
}
+ @Override
+ public int register(FrontRegisterBody body)
+ {
+ if (body == null || StringUtils.isEmpty(body.getUsername()))
+ {
+ throw new ServiceException("用户名不能为空");
+ }
+ if (body.getUsername().length() < 2 || body.getUsername().length() > 50)
+ {
+ throw new ServiceException("用户名长度必须在2到50个字符之间");
+ }
+ if (StringUtils.isEmpty(body.getPassword()))
+ {
+ throw new ServiceException("密码不能为空");
+ }
+ if (body.getPassword().length() < 5 || body.getPassword().length() > 50)
+ {
+ throw new ServiceException("密码长度必须在5到50个字符之间");
+ }
+ if (frontUserMapper.selectFrontUserByUsername(body.getUsername()) != null)
+ {
+ throw new ServiceException("前台账号已存在");
+ }
+
+ FrontUser user = new FrontUser();
+ user.setUsername(body.getUsername());
+ user.setPassword(SecurityUtils.encryptPassword(body.getPassword()));
+ user.setNickname(StringUtils.isEmpty(body.getNickname()) ? body.getUsername() : body.getNickname());
+ user.setEmail(body.getEmail());
+ user.setPhone(body.getPhone());
+ user.setStatus("0");
+ user.setDelFlag("0");
+ return frontUserMapper.insertFrontUser(user);
+ }
+
+ @Override
+ public int updateLastLoginTime(Long userId)
+ {
+ FrontUser user = new FrontUser();
+ user.setUserId(userId);
+ user.setLastLoginTime(new Date());
+ return frontUserMapper.updateFrontUser(user);
+ }
+
+ @Override
+ public FrontUser selectFrontUserById(Long userId)
+ {
+ return selectById(userId);
+ }
+
@Override
public FrontUser selectFrontUserByUsername(String username)
{
- return frontUserMapper.selectFrontUserByUsername(username);
+ return selectByUsername(username);
}
@Override
diff --git a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/IFrontUserService.java b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/IFrontUserService.java
index dffebbb..693e593 100644
--- a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/IFrontUserService.java
+++ b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/IFrontUserService.java
@@ -2,13 +2,14 @@ package com.ruoyi.generator.service.front;
import java.util.List;
import com.ruoyi.generator.domain.front.FrontUser;
-import com.ruoyi.generator.domain.front.dto.FrontLoginBody;
import com.ruoyi.generator.domain.front.dto.FrontRegisterBody;
public interface IFrontUserService
{
- public FrontUser login(FrontLoginBody loginBody);
- public FrontUser register(FrontRegisterBody registerBody);
+ public FrontUser selectByUsername(String username);
+ public FrontUser selectById(Long userId);
+ public int register(FrontRegisterBody body);
+ public int updateLastLoginTime(Long userId);
public FrontUser selectFrontUserById(Long userId);
public FrontUser selectFrontUserByUsername(String username);
public List selectFrontUserList(FrontUser frontUser);