From 4f367056ab0e73d044e920d44b1d7dd0c8b65d80 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期二, 12 五月 2026 14:25:28 +0800
Subject: [PATCH] fix:注册流程优化、屏蔽账号密码登录、已登录后token永不过期
---
tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/register/service/AppRegisterServiceTest.java | 112 +++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 90 insertions(+), 22 deletions(-)
diff --git a/tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/register/service/AppRegisterServiceTest.java b/tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/register/service/AppRegisterServiceTest.java
index 5193807..9aa5cc2 100644
--- a/tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/register/service/AppRegisterServiceTest.java
+++ b/tcm-training-admin-backend/src/test/java/com/tcm/training/admin/app/register/service/AppRegisterServiceTest.java
@@ -3,20 +3,23 @@
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.tcm.training.admin.app.auth.service.AppAuthSessionService;
import com.tcm.training.admin.app.auth.service.AppSmsCodeService;
+import com.tcm.training.admin.app.auth.vo.AppLoginResponse;
import com.tcm.training.admin.app.integration.haizhentong.entity.HztAppUser;
import com.tcm.training.admin.app.integration.haizhentong.entity.HztClinic;
import com.tcm.training.admin.app.integration.haizhentong.mapper.HztAppUserMapper;
import com.tcm.training.admin.app.integration.haizhentong.mapper.HztClinicMapper;
+import com.tcm.training.admin.app.register.dto.AppRegisterOperatorCompleteRequest;
import com.tcm.training.admin.app.register.dto.AppRegisterOperatorPrepareRequest;
import com.tcm.training.admin.app.register.dto.AppRegisterUserRequest;
import com.tcm.training.admin.app.register.vo.AppRegisterOperatorPrepareResponse;
-import com.tcm.training.admin.app.register.vo.AppRegisterResultVO;
import com.tcm.training.admin.app.share.service.AppShareService;
import com.tcm.training.admin.live.entity.Clinic;
import com.tcm.training.admin.live.mapper.ClinicMapper;
import com.tcm.training.admin.member.entity.AppUser;
import com.tcm.training.admin.member.mapper.UserMapper;
+import cn.dev33.satoken.stp.SaTokenInfo;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
@@ -28,7 +31,6 @@
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import java.util.concurrent.TimeUnit;
@@ -40,6 +42,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -65,10 +68,10 @@
private ClinicMapper clinicMapper;
@Mock
- private BCryptPasswordEncoder passwordEncoder;
+ private AppSmsCodeService appSmsCodeService;
@Mock
- private AppSmsCodeService appSmsCodeService;
+ private AppAuthSessionService appAuthSessionService;
@Mock
private AppRegisterRegionService appRegisterRegionService;
@@ -99,8 +102,8 @@
appRegisterService = new AppRegisterService(
userMapper,
clinicMapper,
- passwordEncoder,
appSmsCodeService,
+ appAuthSessionService,
appRegisterRegionService,
hztAppUserMapper,
hztClinicMapper,
@@ -118,7 +121,6 @@
AppRegisterUserRequest request = new AppRegisterUserRequest();
request.setPhone("13800138000");
request.setCode("666666");
- request.setPassword("abc123!!");
request.setInviteCode("abc123");
HztAppUser hztAppUser = new HztAppUser();
@@ -133,29 +135,36 @@
clinicUser.setId(88L);
clinicUser.setClinicId(19L);
- when(passwordEncoder.encode("abc123!!")).thenReturn("ENCODED");
+ AppShareService.InviteBindingTarget bindingTarget = new AppShareService.InviteBindingTarget();
+ bindingTarget.setClinicId(19L);
+ bindingTarget.setSuperiorClinicUserId(88L);
+ when(appShareService.resolveInviteBindingTarget("ABC123")).thenReturn(bindingTarget);
when(hztAppUserMapper.selectOne(any())).thenReturn(hztAppUser);
- when(clinicMapper.selectOne(any())).thenReturn(clinic);
- when(userMapper.selectOne(any())).thenReturn(null, clinicUser);
+ when(userMapper.selectOne(any())).thenReturn(null);
doNothing().when(appSmsCodeService).validateRegisterCode("13800138000", "666666");
when(userMapper.insert(any(AppUser.class))).thenAnswer(invocation -> {
AppUser inserted = invocation.getArgument(0);
inserted.setId(1001L);
return 1;
});
+ when(appAuthSessionService.getTokenInfo()).thenReturn(buildTokenInfo("register-token", 7200L));
- AppRegisterResultVO result = appRegisterService.registerUser(request);
+ AppLoginResponse result = appRegisterService.registerUser(request);
verify(userMapper).insert(appUserCaptor.capture());
+ verify(appAuthSessionService).login(1001L);
AppUser inserted = appUserCaptor.getValue();
assertEquals("海诊通昵称", inserted.getNickname());
assertEquals("https://cdn.test/avatar.png", inserted.getAvatar());
assertEquals(Integer.valueOf(0), inserted.getGender());
assertEquals(Long.valueOf(19L), inserted.getClinicId());
assertEquals(Long.valueOf(88L), inserted.getSuperiorClinicUserId());
- assertEquals("ENCODED", inserted.getPassword());
- assertEquals(Long.valueOf(1001L), result.getUserId());
- assertEquals(Integer.valueOf(0), result.getUserType());
+ assertNull(inserted.getPassword());
+ assertEquals("register-token", result.getToken());
+ assertEquals("Bearer", result.getTokenType());
+ assertEquals(7200L, result.getExpiresIn());
+ assertEquals(Long.valueOf(1001L), result.getUser().getId());
+ assertEquals(Integer.valueOf(0), result.getUser().getType());
}
/**
@@ -166,9 +175,7 @@
AppRegisterUserRequest request = new AppRegisterUserRequest();
request.setPhone("13800138123");
request.setCode("666666");
- request.setPassword("abc123!!");
- when(passwordEncoder.encode("abc123!!")).thenReturn("ENCODED");
when(userMapper.selectOne(any())).thenReturn(null);
when(hztAppUserMapper.selectOne(any())).thenReturn(null);
doNothing().when(appSmsCodeService).validateRegisterCode("13800138123", "666666");
@@ -177,16 +184,19 @@
inserted.setId(1002L);
return 1;
});
+ when(appAuthSessionService.getTokenInfo()).thenReturn(buildTokenInfo("fallback-token", 3600L));
- AppRegisterResultVO result = appRegisterService.registerUser(request);
+ AppLoginResponse result = appRegisterService.registerUser(request);
verify(userMapper).insert(appUserCaptor.capture());
+ verify(appAuthSessionService).login(1002L);
AppUser inserted = appUserCaptor.getValue();
assertEquals("138****8123", inserted.getNickname());
assertNull(inserted.getAvatar());
assertNull(inserted.getGender());
- assertEquals(Long.valueOf(1002L), result.getUserId());
- assertEquals(Integer.valueOf(0), result.getUserType());
+ assertNull(inserted.getPassword());
+ assertEquals(Long.valueOf(1002L), result.getUser().getId());
+ assertEquals(Integer.valueOf(0), result.getUser().getType());
}
/**
@@ -197,9 +207,7 @@
AppRegisterOperatorPrepareRequest request = new AppRegisterOperatorPrepareRequest();
request.setPhone("13800138001");
request.setCode("666666");
- request.setPassword("abc123!!");
- when(passwordEncoder.encode("abc123!!")).thenReturn("ENCODED");
when(userMapper.selectOne(any())).thenReturn(null);
when(hztClinicMapper.selectOne(any())).thenReturn(null);
when(stringRedisTemplate.opsForValue()).thenReturn(valueOperations);
@@ -222,7 +230,6 @@
AppRegisterOperatorPrepareRequest request = new AppRegisterOperatorPrepareRequest();
request.setPhone("13800138002");
request.setCode("666666");
- request.setPassword("abc123!!");
HztClinic hztClinic = new HztClinic();
hztClinic.setClinicName("海诊通诊所");
@@ -239,7 +246,6 @@
regionSelection.setDistrictCode("330106");
regionSelection.setDistrictName("西湖区");
- when(passwordEncoder.encode("abc123!!")).thenReturn("ENCODED");
when(userMapper.selectOne(any())).thenReturn(null);
when(hztClinicMapper.selectOne(any())).thenReturn(hztClinic);
when(appRegisterRegionService.resolveRegionSelection(null, "浙江省", null, "杭州市", null, "西湖区")).thenReturn(regionSelection);
@@ -255,4 +261,66 @@
assertEquals("330106", response.getClinicInfo().getDistrictCode());
assertEquals("文三路 1 号", response.getClinicInfo().getDetailAddress());
}
+
+ /**
+ * 经营者第二步完成注册后应直接返回登录响应。
+ */
+ @Test
+ void completeOperatorShouldReturnLoginResponse() throws Exception {
+ AppRegisterOperatorCompleteRequest request = new AppRegisterOperatorCompleteRequest();
+ request.setRegisterTicket("ticket-1");
+ request.setInstitutionName("本地诊所");
+ request.setProvinceName("浙江省");
+ request.setCityName("杭州市");
+ request.setDistrictName("西湖区");
+ request.setDetailAddress("文三路 2 号");
+ request.setBusinessLicenseUrl("https://cdn.test/license.png");
+
+ AppRegisterService.OperatorRegisterDraft draft = new AppRegisterService.OperatorRegisterDraft();
+ draft.setPhone("13800138003");
+ draft.setContactName("负责人");
+
+ Clinic clinicExists = null;
+ when(stringRedisTemplate.opsForValue()).thenReturn(valueOperations);
+ when(valueOperations.get("app:register:operator:ticket-1")).thenReturn(new ObjectMapper().writeValueAsString(draft));
+ when(userMapper.selectOne(any())).thenReturn(null);
+ when(clinicMapper.selectOne(any())).thenReturn(clinicExists);
+ when(clinicMapper.insert(any(Clinic.class))).thenAnswer(invocation -> {
+ Clinic inserted = invocation.getArgument(0);
+ inserted.setId(2001L);
+ inserted.setInviteCode("ABC123");
+ return 1;
+ });
+ when(userMapper.insert(any(AppUser.class))).thenAnswer(invocation -> {
+ AppUser inserted = invocation.getArgument(0);
+ inserted.setId(3001L);
+ return 1;
+ });
+ when(appAuthSessionService.getTokenInfo()).thenReturn(buildTokenInfo("operator-token", 7200L));
+
+ AppLoginResponse response = appRegisterService.completeOperatorRegister(request);
+
+ verify(userMapper).insert(appUserCaptor.capture());
+ verify(appAuthSessionService).login(3001L);
+ AppUser inserted = appUserCaptor.getValue();
+ assertEquals("本地诊所", inserted.getNickname());
+ assertEquals("13800138003", inserted.getPhone());
+ assertNull(inserted.getPassword());
+ assertEquals(Integer.valueOf(1), inserted.getType());
+ assertEquals(Long.valueOf(2001L), inserted.getClinicId());
+ assertEquals("operator-token", response.getToken());
+ assertEquals(Long.valueOf(3001L), response.getUser().getId());
+ assertEquals(Integer.valueOf(1), response.getUser().getType());
+ assertEquals(Long.valueOf(2001L), response.getUser().getClinicId());
+ }
+
+ /**
+ * 构造测试用登录 token 信息。
+ */
+ private SaTokenInfo buildTokenInfo(String tokenValue, long timeout) {
+ SaTokenInfo tokenInfo = new SaTokenInfo();
+ tokenInfo.setTokenValue(tokenValue);
+ tokenInfo.setTokenTimeout(timeout);
+ return tokenInfo;
+ }
}
--
Gitblit v1.7.1