diff --git a/fund-admin/package-lock.json b/fund-admin/package-lock.json index 0bc8542..b9b5810 100644 --- a/fund-admin/package-lock.json +++ b/fund-admin/package-lock.json @@ -12,6 +12,7 @@ "axios": "^1.13.5", "echarts": "^6.0.0", "element-plus": "^2.13.2", + "js-md5": "^0.8.3", "pinia": "^3.0.4", "vue": "^3.5.25", "vue-router": "^5.0.2" @@ -2484,6 +2485,12 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/js-md5": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz", + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==", + "license": "MIT" + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", diff --git a/fund-admin/src/api/auth.ts b/fund-admin/src/api/auth.ts index c657f24..4a7d31a 100644 --- a/fund-admin/src/api/auth.ts +++ b/fund-admin/src/api/auth.ts @@ -1,8 +1,13 @@ import { request } from './request' // 登录 -export function login(data: { username: string; password: string }) { - return request.post('/auth/login', data) +export function login(data: { username: string; password: string, tenantId?: number }) { + // 如果没有传递 tenantId,使用默认值 1 + const requestData = { + ...data, + tenantId: data.tenantId || 1 + } + return request.post('/auth/login', requestData) } // 登出 diff --git a/fund-admin/src/views/login/index.vue b/fund-admin/src/views/login/index.vue index ccca43a..b10057f 100644 --- a/fund-admin/src/views/login/index.vue +++ b/fund-admin/src/views/login/index.vue @@ -78,7 +78,7 @@ const handleLogin = async () => { await formRef.value.validate() loading.value = true - // 密码先进行 MD5 加密 + // 密码先进行 MD5 加密(使用默认导出) const encryptedPassword = md5(form.password) await userStore.loginAction(form.username, encryptedPassword) diff --git a/fund-mobile/package-lock.json b/fund-mobile/package-lock.json index 7347493..c72adf7 100644 --- a/fund-mobile/package-lock.json +++ b/fund-mobile/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "dependencies": { "axios": "^1.6.0", + "js-md5": "^0.8.3", "pinia": "^2.1.7", "vant": "^4.9.22", "vue": "^3.4.0", @@ -1690,6 +1691,12 @@ "node": ">=0.12.0" } }, + "node_modules/js-md5": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz", + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==", + "license": "MIT" + }, "node_modules/local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", diff --git a/fund-mobile/src/api/index.ts b/fund-mobile/src/api/index.ts index a8fc613..5ffd08b 100644 --- a/fund-mobile/src/api/index.ts +++ b/fund-mobile/src/api/index.ts @@ -2,8 +2,13 @@ import request from './request' // ===================== 用户认证 ===================== -export function login(data: { username: string; password: string }) { - return request.post('/auth/login', data) +export function login(data: { username: string; password: string, tenantId?: number }) { + // 如果没有传递 tenantId,使用默认值 1 + const requestData = { + ...data, + tenantId: data.tenantId || 1 + } + return request.post('/auth/login', requestData) } export function getUserInfo() { diff --git a/fund-sys/src/test/java/com/fundplatform/sys/controller/AuthControllerIntegrationTest.java b/fund-sys/src/test/java/com/fundplatform/sys/controller/AuthControllerIntegrationTest.java new file mode 100644 index 0000000..c76cfe1 --- /dev/null +++ b/fund-sys/src/test/java/com/fundplatform/sys/controller/AuthControllerIntegrationTest.java @@ -0,0 +1,78 @@ +package com.fundplatform.sys.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fundplatform.common.core.Result; +import com.fundplatform.sys.dto.LoginRequestDTO; +import com.fundplatform.sys.vo.LoginVO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +/** + * 认证控制器集成测试 + * 模拟真实的用户登录场景 + * + * 注意:本测试需要在数据库中存在测试用户才能通过 + * 如果没有初始化数据,请使用 AuthServiceImplTest 进行单元测试 + */ +@SpringBootTest +@AutoConfigureMockMvc +class AuthControllerIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @BeforeEach + void setUp() { + // 每个测试前可以做一些准备工作 + } + + @Test + @DisplayName("集成测试:演示登录请求格式(需要数据库支持)") + void testLoginRequestFormat() throws Exception { + // 准备登录请求数据(前端传来的 MD5 密码) + LoginRequestDTO request = new LoginRequestDTO(); + request.setUsername("admin"); + // MD5("admin123") = "0192023a7bbd73250516f069df18b500" + request.setPassword("0192023a7bbd73250516f069df18b500"); + request.setTenantId(1L); // 添加租户 ID + + System.out.println("=== 发送登录请求 ==="); + System.out.println("请求 JSON: " + objectMapper.writeValueAsString(request)); + System.out.println("说明:此测试需要数据库中存在对应用户,否则会返回'用户名或密码错误'"); + + // 发送登录请求(即使数据库中不存在用户,也可以验证请求格式和响应格式) + MvcResult result = mockMvc.perform(post("/api/v1/auth/login") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isOk()) + .andReturn(); + + // 解析响应(Result 包装类型) + String responseBody = result.getResponse().getContentAsString(); + System.out.println("=== 登录响应 ==="); + System.out.println("响应 JSON: " + responseBody); + + // 验证响应格式正确(即使登录失败也能验证格式) + assertNotNull(responseBody); + assertTrue(responseBody.contains("\"code\"")); + assertTrue(responseBody.contains("\"message\"")); + + System.out.println("\n✅ 登录接口调用成功!响应格式正确。"); + System.out.println("💡 提示:如果要测试登录成功场景,请在数据库中创建用户 admin,密码为 MD5(admin123)"); + } +}