diff --git a/backend/src/main/java/com/imeeting/controller/android/AndroidAuthController.java b/backend/src/main/java/com/imeeting/controller/android/AndroidAuthController.java index 7f5f4e7..98b9789 100644 --- a/backend/src/main/java/com/imeeting/controller/android/AndroidAuthController.java +++ b/backend/src/main/java/com/imeeting/controller/android/AndroidAuthController.java @@ -5,6 +5,7 @@ import com.unisbase.dto.LoginRequest; import com.unisbase.dto.RefreshRequest; import com.unisbase.dto.TokenResponse; import com.unisbase.service.AuthService; +import com.imeeting.support.AndroidRequestLogHelper; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.Operation; @@ -12,6 +13,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/android/auth") @RequiredArgsConstructor +@Slf4j public class AndroidAuthController { private final AuthService authService; @@ -37,6 +40,7 @@ public class AndroidAuthController { }) @PostMapping("/login") public ApiResponse login(@Valid @RequestBody LoginRequest request) { + AndroidRequestLogHelper.logRequest(log, "Android认证", "登录接口", "request", request); return ApiResponse.ok(authService.login(request, true)); } @@ -52,6 +56,10 @@ public class AndroidAuthController { public ApiResponse refresh(@RequestBody(required = false) RefreshRequest request, @RequestHeader(value = "Authorization", required = false) String authorization, @RequestHeader(value = "X-Android-Access-Token", required = false) String androidAccessToken) { + AndroidRequestLogHelper.logRequest(log, "Android认证", "刷新令牌接口", + "request", request, + "authorization", authorization, + "androidAccessToken", androidAccessToken); return ApiResponse.ok(authService.refresh(resolveRefreshToken(request, authorization, androidAccessToken))); } diff --git a/backend/src/main/java/com/imeeting/controller/android/AndroidClientController.java b/backend/src/main/java/com/imeeting/controller/android/AndroidClientController.java index cada2ad..e51d19b 100644 --- a/backend/src/main/java/com/imeeting/controller/android/AndroidClientController.java +++ b/backend/src/main/java/com/imeeting/controller/android/AndroidClientController.java @@ -1,6 +1,7 @@ package com.imeeting.controller.android; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.imeeting.support.AndroidRequestLogHelper; import com.imeeting.entity.biz.ClientDownload; import com.imeeting.service.android.AndroidAuthService; import com.imeeting.service.biz.ClientDownloadService; @@ -41,6 +42,10 @@ public class AndroidClientController { @RequestParam(value = "platform_code", required = false) String platformCode, @RequestParam(value = "platform_type", required = false) String platformType, @RequestParam(value = "platform_name", required = false) String platformName) { + AndroidRequestLogHelper.logRequest(log, "Android客户端", "查询平台最新客户端接口", + "platformCode", platformCode, + "platformType", platformType, + "platformName", platformName); androidAuthService.authenticateHttp(request); if ((platformCode == null || platformCode.isBlank()) && ((platformType == null || platformType.isBlank()) || (platformName == null || platformName.isBlank()))) { diff --git a/backend/src/main/java/com/imeeting/controller/android/AndroidExternalAppController.java b/backend/src/main/java/com/imeeting/controller/android/AndroidExternalAppController.java index ab0a35c..fd5dc18 100644 --- a/backend/src/main/java/com/imeeting/controller/android/AndroidExternalAppController.java +++ b/backend/src/main/java/com/imeeting/controller/android/AndroidExternalAppController.java @@ -1,5 +1,6 @@ package com.imeeting.controller.android; +import com.imeeting.support.AndroidRequestLogHelper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.imeeting.entity.biz.ExternalApp; import com.imeeting.service.android.AndroidAuthService; @@ -13,6 +14,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -24,6 +26,7 @@ import java.util.List; @RestController @RequestMapping("/api/android/external-apps") @RequiredArgsConstructor +@Slf4j public class AndroidExternalAppController { private final AndroidAuthService androidAuthService; @@ -40,6 +43,7 @@ public class AndroidExternalAppController { @GetMapping("/active") public ApiResponse> active(HttpServletRequest request, @RequestParam(value = "is_active", required = false) Integer ignoredIsActive) { + AndroidRequestLogHelper.logRequest(log, "Android外部应用", "查询启用外部应用接口", "isActive", ignoredIsActive); androidAuthService.authenticateHttp(request); List apps = externalAppService.list(new LambdaQueryWrapper() .eq(ExternalApp::getStatus, 1) diff --git a/backend/src/main/java/com/imeeting/controller/android/AndroidLlmModelController.java b/backend/src/main/java/com/imeeting/controller/android/AndroidLlmModelController.java index f8ba007..c4bb869 100644 --- a/backend/src/main/java/com/imeeting/controller/android/AndroidLlmModelController.java +++ b/backend/src/main/java/com/imeeting/controller/android/AndroidLlmModelController.java @@ -4,6 +4,7 @@ import com.imeeting.dto.android.AndroidAuthContext; import com.imeeting.dto.biz.AiModelVO; import com.imeeting.service.android.AndroidAuthService; import com.imeeting.service.biz.AiModelService; +import com.imeeting.support.AndroidRequestLogHelper; import com.unisbase.common.ApiResponse; import com.unisbase.dto.PageResult; import com.unisbase.security.LoginUser; @@ -15,6 +16,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -25,6 +27,7 @@ import java.util.List; @RestController @RequestMapping("/api/android/llm-models") @RequiredArgsConstructor +@Slf4j public class AndroidLlmModelController { private final AndroidAuthService androidAuthService; @@ -40,6 +43,7 @@ public class AndroidLlmModelController { }) @GetMapping("/active") public ApiResponse> activeModels(HttpServletRequest request) { + AndroidRequestLogHelper.logRequest(log, "Android模型", "查询启用大模型列表接口"); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); LoginUser loginUser = AndroidLoginUserSupport.requireLoginUser(authContext); PageResult> result = aiModelService.pageModels(1, 1000, null, "LLM", loginUser.getTenantId()); diff --git a/backend/src/main/java/com/imeeting/controller/android/AndroidMeetingController.java b/backend/src/main/java/com/imeeting/controller/android/AndroidMeetingController.java index 9f88502..ed341bd 100644 --- a/backend/src/main/java/com/imeeting/controller/android/AndroidMeetingController.java +++ b/backend/src/main/java/com/imeeting/controller/android/AndroidMeetingController.java @@ -23,6 +23,7 @@ import com.imeeting.entity.biz.Meeting; import com.imeeting.entity.biz.PromptTemplate; import com.imeeting.service.android.AndroidAuthService; import com.imeeting.service.android.legacy.LegacyMeetingAdapterService; +import com.imeeting.support.AndroidRequestLogHelper; import com.imeeting.service.biz.*; import com.imeeting.service.biz.impl.RedisOnlyMeetingProgressServiceAdapter; import com.unisbase.common.ApiResponse; @@ -41,6 +42,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.DeleteMapping; @@ -68,6 +70,7 @@ import java.util.stream.Collectors; @Tag(name = "Android会议接口") @RestController @RequestMapping("/api/android/meetings") +@Slf4j public class AndroidMeetingController { private static final String STAGE_DATA_INITIALIZATION = "data_initialization"; @@ -164,6 +167,7 @@ public class AndroidMeetingController { @PostMapping @Log(value = "新增Android会议", type = "Android会议管理") public ApiResponse create(HttpServletRequest request, @RequestBody LegacyMeetingCreateRequest command) { + AndroidRequestLogHelper.logRequest(log, "Android会议", "创建离线会议接口", "request", command); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); LoginUser loginUser = AndroidLoginUserSupport.requireLoginUser(authContext); return ApiResponse.ok(legacyMeetingAdapterService.createMeeting(command, loginUser)); @@ -184,6 +188,12 @@ public class AndroidMeetingController { @RequestParam(value = "model_code", required = false) String modelCode, @RequestParam(value = "force_replace", defaultValue = "false") boolean forceReplace, @RequestParam("audio_file") MultipartFile audioFile) throws IOException { + AndroidRequestLogHelper.logRequest(log, "Android会议", "上传会议音频接口", + "meetingId", meetingId, + "promptId", promptId, + "modelCode", modelCode, + "forceReplace", forceReplace, + "audioFile", audioFile); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); LoginUser loginUser = AndroidLoginUserSupport.requireLoginUser(authContext); return ApiResponse.ok(legacyMeetingAdapterService.uploadAndTriggerOfflineProcess( @@ -210,6 +220,11 @@ public class AndroidMeetingController { @RequestParam(defaultValue = "1") Integer page, @RequestParam(value = "page_size", defaultValue = "10") Integer pageSize, @RequestParam(required = false) String title) { + AndroidRequestLogHelper.logRequest(log, "Android会议", "分页查询会议接口", + "userId", ignoredUserId, + "page", page, + "pageSize", pageSize, + "title", title); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); LoginUser loginUser = AndroidLoginUserSupport.requireLoginUser(authContext); return ApiResponse.ok(meetingQueryService.pageMeetings( @@ -235,6 +250,7 @@ public class AndroidMeetingController { }) @GetMapping("/{meetingId}/preview-data") public ApiResponse previewData(HttpServletRequest request, @PathVariable Long meetingId) { + AndroidRequestLogHelper.logRequest(log, "Android会议", "查询会议预览数据接口", "meetingId", meetingId); androidAuthService.authenticateHttp(request); LegacyMeetingPreviewResult result = buildPreviewResult(meetingId); return new ApiResponse<>(result.getCode(), result.getMessage(), result.getData()); @@ -253,6 +269,9 @@ public class AndroidMeetingController { public ApiResponse updateAccessPassword(HttpServletRequest request, @PathVariable Long meetingId, @RequestBody(required = false) LegacyMeetingAccessPasswordRequest command) { + AndroidRequestLogHelper.logRequest(log, "Android会议", "更新会议访问密码接口", + "meetingId", meetingId, + "request", command); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); LoginUser loginUser = AndroidLoginUserSupport.requireLoginUser(authContext); Meeting meeting = meetingAccessService.requireMeeting(meetingId); @@ -277,6 +296,7 @@ public class AndroidMeetingController { @DeleteMapping("/{meetingId}") @Log(value = "删除Android会议", type = "Android会议管理") public ApiResponse delete(HttpServletRequest request, @PathVariable Long meetingId) { + AndroidRequestLogHelper.logRequest(log, "Android会议", "删除会议接口", "meetingId", meetingId); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); LoginUser loginUser = AndroidLoginUserSupport.requireLoginUser(authContext); Meeting meeting = meetingAccessService.requireMeeting(meetingId); @@ -288,6 +308,7 @@ public class AndroidMeetingController { @Log(value = "获取会议配置", type = "Android会议管理") @Operation(summary = "获取会议配置") public ApiResponse config(HttpServletRequest request) { + AndroidRequestLogHelper.logRequest(log, "Android会议", "获取会议配置接口"); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); LoginUser loginUser = AndroidLoginUserSupport.requireLoginUser(authContext); AndroidMeetingConfigVo resultVo = new AndroidMeetingConfigVo(); diff --git a/backend/src/main/java/com/imeeting/controller/android/AndroidMeetingRealtimeController.java b/backend/src/main/java/com/imeeting/controller/android/AndroidMeetingRealtimeController.java index 1c24ef5..00c8691 100644 --- a/backend/src/main/java/com/imeeting/controller/android/AndroidMeetingRealtimeController.java +++ b/backend/src/main/java/com/imeeting/controller/android/AndroidMeetingRealtimeController.java @@ -19,6 +19,7 @@ import com.imeeting.service.biz.MeetingCommandService; import com.imeeting.service.biz.MeetingQueryService; import com.imeeting.service.biz.MeetingRuntimeProfileResolver; import com.imeeting.service.biz.RealtimeMeetingSessionStateService; +import com.imeeting.support.AndroidRequestLogHelper; import com.unisbase.common.ApiResponse; import com.unisbase.common.annotation.Log; import io.swagger.v3.oas.annotations.Operation; @@ -29,6 +30,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -44,6 +46,7 @@ import java.util.List; @RestController @RequestMapping("/api/android/meeting") @RequiredArgsConstructor +@Slf4j public class AndroidMeetingRealtimeController { private static final DateTimeFormatter TITLE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @@ -69,6 +72,7 @@ public class AndroidMeetingRealtimeController { @Log(value = "新增Android实时会议", type = "Android实时会议") public ApiResponse createRealtimeMeeting(HttpServletRequest request, @RequestBody(required = false) AndroidCreateRealtimeMeetingCommand command) { + AndroidRequestLogHelper.logRequest(log, "Android实时会议", "创建实时会议接口", "command", command); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); meetingAuthorizationService.assertCanCreateMeeting(authContext); RealtimeMeetingRuntimeProfile runtimeProfile = meetingRuntimeProfileResolver.resolve( @@ -125,6 +129,7 @@ public class AndroidMeetingRealtimeController { }) @GetMapping("/{id}/realtime/session-status") public ApiResponse getRealtimeSessionStatus(@PathVariable Long id, HttpServletRequest request) { + AndroidRequestLogHelper.logRequest(log, "Android实时会议", "查询实时会议状态接口", "meetingId", id); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); Meeting meeting = meetingAccessService.requireMeeting(id); meetingAuthorizationService.assertCanManageRealtimeMeeting(meeting, authContext); @@ -141,6 +146,7 @@ public class AndroidMeetingRealtimeController { }) @GetMapping("/{id}/transcripts") public ApiResponse> getTranscripts(@PathVariable Long id, HttpServletRequest request) { + AndroidRequestLogHelper.logRequest(log, "Android实时会议", "查询会议转写接口", "meetingId", id); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); Meeting meeting = meetingAccessService.requireMeeting(id); meetingAuthorizationService.assertCanViewMeeting(meeting, authContext); @@ -157,6 +163,7 @@ public class AndroidMeetingRealtimeController { }) @PostMapping("/{id}/realtime/pause") public ApiResponse pauseRealtimeMeeting(@PathVariable Long id, HttpServletRequest request) { + AndroidRequestLogHelper.logRequest(log, "Android实时会议", "暂停实时会议接口", "meetingId", id); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); Meeting meeting = meetingAccessService.requireMeeting(id); meetingAuthorizationService.assertCanControlRealtimeMeeting(meeting, authContext, MeetingConstants.SOURCE_ANDROID); @@ -175,6 +182,7 @@ public class AndroidMeetingRealtimeController { public ApiResponse completeRealtimeMeeting(@PathVariable Long id, HttpServletRequest request, @RequestBody(required = false) RealtimeMeetingCompleteDTO dto) { + AndroidRequestLogHelper.logRequest(log, "Android实时会议", "完成实时会议接口", "meetingId", id, "request", dto); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); Meeting meeting = meetingAccessService.requireMeeting(id); meetingAuthorizationService.assertCanControlRealtimeMeeting(meeting, authContext, MeetingConstants.SOURCE_ANDROID); diff --git a/backend/src/main/java/com/imeeting/controller/android/AndroidPromptController.java b/backend/src/main/java/com/imeeting/controller/android/AndroidPromptController.java index 0131b97..9a7a6bf 100644 --- a/backend/src/main/java/com/imeeting/controller/android/AndroidPromptController.java +++ b/backend/src/main/java/com/imeeting/controller/android/AndroidPromptController.java @@ -4,6 +4,7 @@ import com.imeeting.dto.android.AndroidAuthContext; import com.imeeting.dto.biz.PromptTemplateVO; import com.imeeting.service.android.AndroidAuthService; import com.imeeting.service.biz.PromptTemplateService; +import com.imeeting.support.AndroidRequestLogHelper; import com.unisbase.common.ApiResponse; import com.unisbase.dto.PageResult; import com.unisbase.security.LoginUser; @@ -15,6 +16,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -26,6 +28,7 @@ import java.util.List; @RestController @RequestMapping("/api/android/prompts") @RequiredArgsConstructor +@Slf4j public class AndroidPromptController { private static final String LEGACY_MEETING_SCENE = "MEETING_TASK"; @@ -43,6 +46,7 @@ public class AndroidPromptController { }) @GetMapping("/active/{scene}") public ApiResponse> activePrompts(HttpServletRequest request, @PathVariable String scene) { + AndroidRequestLogHelper.logRequest(log, "Android提示词", "查询场景提示词接口", "scene", scene); if (!LEGACY_MEETING_SCENE.equals(scene)) { return ApiResponse.error("scene 仅支持 MEETING_TASK"); } diff --git a/backend/src/main/java/com/imeeting/controller/android/AndroidScreenSaverController.java b/backend/src/main/java/com/imeeting/controller/android/AndroidScreenSaverController.java index 042bd6a..f4baa15 100644 --- a/backend/src/main/java/com/imeeting/controller/android/AndroidScreenSaverController.java +++ b/backend/src/main/java/com/imeeting/controller/android/AndroidScreenSaverController.java @@ -6,6 +6,7 @@ import com.imeeting.dto.android.AndroidScreenSaverItemVO; import com.imeeting.dto.biz.ScreenSaverSelectionResult; import com.imeeting.service.android.AndroidAuthService; import com.imeeting.service.biz.ScreenSaverService; +import com.imeeting.support.AndroidRequestLogHelper; import com.imeeting.support.TaskSecurityContextRunner; import com.unisbase.common.ApiResponse; import io.swagger.v3.oas.annotations.media.Content; @@ -15,6 +16,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/android/screensavers") @RequiredArgsConstructor +@Slf4j public class AndroidScreenSaverController { private final AndroidAuthService androidAuthService; @@ -39,6 +42,7 @@ public class AndroidScreenSaverController { }) @GetMapping("/active") public ApiResponse active(HttpServletRequest request) { + AndroidRequestLogHelper.logRequest(log, "Android屏保", "获取当前生效屏保接口"); AndroidAuthContext authContext = androidAuthService.authenticateHttp(request); ScreenSaverSelectionResult selection = querySelection(authContext); AndroidScreenSaverCatalogVO vo = new AndroidScreenSaverCatalogVO(); diff --git a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyAuthController.java b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyAuthController.java index 71bdd8a..a7dff0a 100644 --- a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyAuthController.java +++ b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyAuthController.java @@ -5,6 +5,7 @@ import com.imeeting.dto.android.legacy.LegacyApiResponse; import com.imeeting.dto.android.legacy.LegacyLoginResponse; import com.imeeting.dto.android.legacy.LegacyLoginUserResponse; import com.imeeting.dto.android.legacy.LegacyRefreshTokenResponse; +import com.imeeting.support.AndroidRequestLogHelper; import com.unisbase.dto.LoginRequest; import com.unisbase.dto.RefreshRequest; import com.unisbase.dto.SysRoleDTO; @@ -15,6 +16,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; @@ -28,6 +30,7 @@ import java.util.List; @RestController @RequestMapping("/api/auth") @RequiredArgsConstructor +@Slf4j public class LegacyAuthController { private final AuthService authService; @@ -35,6 +38,7 @@ public class LegacyAuthController { @Operation(summary = "兼容登录") @PostMapping("/login") public LegacyApiResponse login(@Valid @RequestBody LoginRequest request) { + AndroidRequestLogHelper.logRequest(log, "兼容认证", "登录接口", "request", request); TokenResponse tokenResponse = null; try { tokenResponse = authService.login(request, true); @@ -58,6 +62,10 @@ public class LegacyAuthController { public LegacyApiResponse refresh(@RequestBody(required = false) RefreshRequest request, @RequestHeader(value = "Authorization", required = false) String authorization, @RequestHeader(value = "X-Android-Access-Token", required = false) String androidAccessToken) { + AndroidRequestLogHelper.logRequest(log, "兼容认证", "刷新令牌接口", + "request", request, + "authorization", authorization, + "androidAccessToken", androidAccessToken); TokenResponse tokenResponse = null; try { tokenResponse = authService.refresh(resolveRefreshToken(request, authorization, androidAccessToken)); diff --git a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyClientController.java b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyClientController.java index 9a0d6a9..16fa65e 100644 --- a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyClientController.java +++ b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyClientController.java @@ -3,9 +3,11 @@ package com.imeeting.controller.android.legacy; import com.imeeting.dto.android.legacy.LegacyApiResponse; import com.imeeting.dto.android.legacy.LegacyClientDownloadResponse; import com.imeeting.service.android.legacy.LegacyCatalogAdapterService; +import com.imeeting.support.AndroidRequestLogHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/clients") @RequiredArgsConstructor +@Slf4j public class LegacyClientController { private final LegacyCatalogAdapterService legacyCatalogAdapterService; @@ -24,6 +27,10 @@ public class LegacyClientController { public LegacyApiResponse latestByPlatform(@RequestParam(value = "platform_code", required = false) String platformCode, @RequestParam(value = "platform_type", required = false) String platformType, @RequestParam(value = "platform_name", required = false) String platformName) { + AndroidRequestLogHelper.logRequest(log, "兼容客户端", "查询平台最新客户端接口", + "platformCode", platformCode, + "platformType", platformType, + "platformName", platformName); if ((platformCode == null || platformCode.isBlank()) && ((platformType == null || platformType.isBlank()) || (platformName == null || platformName.isBlank()))) { return LegacyApiResponse.error("400", "请提供 platform_code 参数"); diff --git a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyExternalAppController.java b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyExternalAppController.java index 1646491..d945c62 100644 --- a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyExternalAppController.java +++ b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyExternalAppController.java @@ -3,9 +3,11 @@ package com.imeeting.controller.android.legacy; import com.imeeting.dto.android.legacy.LegacyApiResponse; import com.imeeting.dto.android.legacy.LegacyExternalAppItemResponse; import com.imeeting.service.android.legacy.LegacyCatalogAdapterService; +import com.imeeting.support.AndroidRequestLogHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -17,6 +19,7 @@ import java.util.List; @RestController @RequestMapping("/api/external-apps") @RequiredArgsConstructor +@Slf4j public class LegacyExternalAppController { private final LegacyCatalogAdapterService legacyCatalogAdapterService; @@ -24,6 +27,7 @@ public class LegacyExternalAppController { @Operation(summary = "查询启用的外部应用") @GetMapping("/active") public LegacyApiResponse> active(@RequestParam(value = "is_active", required = false) Integer ignoredIsActive) { + AndroidRequestLogHelper.logRequest(log, "兼容外部应用", "查询启用外部应用接口", "isActive", ignoredIsActive); return LegacyApiResponse.ok(legacyCatalogAdapterService.listActiveExternalApps()); } } diff --git a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyLlmModelController.java b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyLlmModelController.java index 1da2c5a..235dcf3 100644 --- a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyLlmModelController.java +++ b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyLlmModelController.java @@ -4,11 +4,13 @@ import com.imeeting.dto.android.legacy.LegacyApiResponse; import com.imeeting.dto.android.legacy.LegacyLlmModelItemResponse; import com.imeeting.dto.biz.AiModelVO; import com.imeeting.service.biz.AiModelService; +import com.imeeting.support.AndroidRequestLogHelper; import com.unisbase.dto.PageResult; import com.unisbase.security.LoginUser; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.GetMapping; @@ -22,6 +24,7 @@ import java.util.Objects; @RestController @RequestMapping("/api/llm-models") @RequiredArgsConstructor +@Slf4j public class LegacyLlmModelController { private final AiModelService aiModelService; @@ -30,6 +33,7 @@ public class LegacyLlmModelController { @GetMapping("/active") @PreAuthorize("isAuthenticated()") public LegacyApiResponse> activeModels() { + AndroidRequestLogHelper.logRequest(log, "兼容模型", "查询启用大模型列表接口"); LoginUser loginUser = currentLoginUser(); PageResult> result = aiModelService.pageModels(1, 1000, null, "LLM", loginUser.getTenantId()); List enabledModels = result.getRecords() == null diff --git a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyMeetingController.java b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyMeetingController.java index 69ec57e..dae8560 100644 --- a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyMeetingController.java +++ b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyMeetingController.java @@ -23,6 +23,7 @@ import com.imeeting.entity.biz.Meeting; import com.imeeting.mapper.biz.MeetingTranscriptMapper; import com.imeeting.entity.biz.PromptTemplate; import com.imeeting.service.android.legacy.LegacyMeetingAdapterService; +import com.imeeting.support.AndroidRequestLogHelper; import com.imeeting.service.biz.AiTaskService; import com.imeeting.service.biz.MeetingAccessService; import com.imeeting.service.biz.MeetingCommandService; @@ -38,6 +39,7 @@ import com.unisbase.mapper.SysUserMapper; import com.unisbase.security.LoginUser; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.access.prepost.PreAuthorize; @@ -65,7 +67,7 @@ import java.util.stream.Collectors; @Tag(name = "兼容会议接口") @RestController @RequestMapping("/api/meetings") - +@Slf4j public class LegacyMeetingController { private static final String STAGE_DATA_INITIALIZATION = "data_initialization"; @@ -163,6 +165,7 @@ public class LegacyMeetingController { @PreAuthorize("isAuthenticated()") @Log(value = "新增兼容会议", type = "兼容会议管理") public LegacyApiResponse create(@RequestBody LegacyMeetingCreateRequest request) { + AndroidRequestLogHelper.logRequest(log, "兼容会议", "创建会议接口", "request", request); MeetingVO meeting = legacyMeetingAdapterService.createMeeting(request, currentLoginUser()); return LegacyApiResponse.ok(new LegacyMeetingCreateResponse(meeting.getId())); } @@ -175,6 +178,12 @@ public class LegacyMeetingController { @RequestParam(value = "model_code", required = false) String modelCode, @RequestParam(value = "force_replace", defaultValue = "false") boolean forceReplace, @RequestParam("audio_file") MultipartFile audioFile) throws IOException { + AndroidRequestLogHelper.logRequest(log, "兼容会议", "上传会议音频接口", + "meetingId", meetingId, + "promptId", promptId, + "modelCode", modelCode, + "forceReplace", forceReplace, + "audioFile", audioFile); legacyMeetingAdapterService.uploadAndTriggerOfflineProcess( meetingId, promptId, @@ -193,6 +202,11 @@ public class LegacyMeetingController { @RequestParam(defaultValue = "1") Integer page, @RequestParam(value = "page_size", defaultValue = "10") Integer pageSize, @RequestParam(required = false) String title) { + AndroidRequestLogHelper.logRequest(log, "兼容会议", "分页查询会议接口", + "userId", ignoredUserId, + "page", page, + "pageSize", pageSize, + "title", title); LoginUser loginUser = currentLoginUser(); boolean isAdmin = Boolean.TRUE.equals(loginUser.getIsPlatformAdmin()) || Boolean.TRUE.equals(loginUser.getIsTenantAdmin()); PageResult> result = meetingQueryService.pageMeetings( @@ -222,6 +236,7 @@ public class LegacyMeetingController { @Operation(summary = "兼容查询会议预览数据") @GetMapping("/{meetingId}/preview-data") public LegacyApiResponse previewData(@PathVariable Long meetingId) { + AndroidRequestLogHelper.logRequest(log, "兼容会议", "查询会议预览数据接口", "meetingId", meetingId); LegacyMeetingPreviewResult result = buildPreviewResult(meetingId); return new LegacyApiResponse<>(result.getCode(), result.getMessage(), result.getData()); } @@ -232,6 +247,9 @@ public class LegacyMeetingController { @Log(value = "修改兼容会议访问密码", type = "兼容会议管理") public LegacyApiResponse updateAccessPassword(@PathVariable Long meetingId, @RequestBody(required = false) LegacyMeetingAccessPasswordRequest request) { + AndroidRequestLogHelper.logRequest(log, "兼容会议", "更新会议访问密码接口", + "meetingId", meetingId, + "request", request); LoginUser loginUser = currentLoginUser(); Meeting meeting = meetingAccessService.requireMeeting(meetingId); if (!Objects.equals(meeting.getCreatorId(), loginUser.getUserId())) { @@ -249,6 +267,7 @@ public class LegacyMeetingController { @PreAuthorize("isAuthenticated()") @Log(value = "删除兼容会议", type = "兼容会议管理") public LegacyApiResponse delete(@PathVariable Long meetingId) { + AndroidRequestLogHelper.logRequest(log, "兼容会议", "删除会议接口", "meetingId", meetingId); LoginUser loginUser = currentLoginUser(); Meeting meeting = meetingAccessService.requireMeeting(meetingId); meetingAccessService.assertCanEditMeeting(meeting, loginUser); diff --git a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyPromptController.java b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyPromptController.java index f677820..c40d333 100644 --- a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyPromptController.java +++ b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyPromptController.java @@ -5,11 +5,13 @@ import com.imeeting.dto.android.legacy.LegacyPromptItemResponse; import com.imeeting.dto.android.legacy.LegacyPromptListResponse; import com.imeeting.dto.biz.PromptTemplateVO; import com.imeeting.service.biz.PromptTemplateService; +import com.imeeting.support.AndroidRequestLogHelper; import com.unisbase.dto.PageResult; import com.unisbase.security.LoginUser; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.GetMapping; @@ -24,6 +26,7 @@ import java.util.Objects; @RestController @RequestMapping("/api/prompts") @RequiredArgsConstructor +@Slf4j public class LegacyPromptController { private static final String LEGACY_MEETING_SCENE = "MEETING_TASK"; @@ -34,6 +37,7 @@ public class LegacyPromptController { @GetMapping("/active/{scene}") @PreAuthorize("isAuthenticated()") public LegacyApiResponse activePrompts(@PathVariable String scene) { + AndroidRequestLogHelper.logRequest(log, "兼容提示词", "查询场景提示词接口", "scene", scene); if (!LEGACY_MEETING_SCENE.equals(scene)) { return LegacyApiResponse.error("400", "scene 仅支持 MEETING_TASK"); } diff --git a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyScreenSaverController.java b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyScreenSaverController.java index 902f4ff..fb7c385 100644 --- a/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyScreenSaverController.java +++ b/backend/src/main/java/com/imeeting/controller/android/legacy/LegacyScreenSaverController.java @@ -3,6 +3,7 @@ package com.imeeting.controller.android.legacy; import com.imeeting.dto.android.legacy.LegacyApiResponse; import com.imeeting.dto.android.legacy.LegacyScreenSaverCatalogResponse; import com.imeeting.service.android.legacy.LegacyScreenSaverAdapterService; +import com.imeeting.support.AndroidRequestLogHelper; import com.imeeting.support.TaskSecurityContextRunner; import com.unisbase.dto.InternalAuthCheckResponse; import com.unisbase.security.LoginUser; @@ -11,6 +12,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.GetMapping; @@ -21,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/screensavers") @RequiredArgsConstructor +@Slf4j public class LegacyScreenSaverController { private static final String HEADER_AUTHORIZATION = "Authorization"; @@ -33,6 +36,7 @@ public class LegacyScreenSaverController { @Operation(summary = "查询启用的屏保列表") @GetMapping("/active") public LegacyApiResponse active(HttpServletRequest request) { + AndroidRequestLogHelper.logRequest(log, "兼容屏保", "查询启用屏保列表接口"); LoginUser loginUser = resolveLoginUser(request); return LegacyApiResponse.ok(queryActive(loginUser)); } diff --git a/frontend/src/pages/system/dictionaries/index.less b/frontend/src/pages/system/dictionaries/index.less index e2e2590..0b54a28 100644 --- a/frontend/src/pages/system/dictionaries/index.less +++ b/frontend/src/pages/system/dictionaries/index.less @@ -1,8 +1,13 @@ .dictionaries-page { - padding: 24px; height: 100%; display: flex; flex-direction: column; + + // 强制覆盖全局可能存在的 max-height: none !important 限制 + // 确保 antd table 的 scroll.y 能够生效 + .ant-table-wrapper .ant-table-body { + max-height: inherit !important; + } } .dictionaries-header { @@ -94,3 +99,9 @@ .h-full { height: 100%; } +.ant-table-wrapper .ant-spin-container { + height: calc(100vh - 410px); + display: flex; + flex-direction: column; + min-height: 0; +} diff --git a/frontend/src/pages/system/dictionaries/index.tsx b/frontend/src/pages/system/dictionaries/index.tsx index 1f21f70..75d9063 100644 --- a/frontend/src/pages/system/dictionaries/index.tsx +++ b/frontend/src/pages/system/dictionaries/index.tsx @@ -156,7 +156,7 @@ export default function Dictionaries() { > -