feat: 添加日志注解并更新相关操作描述

- 在多个控制器中添加 `@Log` 注解,记录新增、修改和删除操作
- 更新前端 `MeetingDetail.tsx` 中的按钮文本和注释
- 优化会议管理相关接口的日志记录
dev_na
chenhao 2026-05-06 10:31:06 +08:00
parent aed87e8ad3
commit 5b4304a4b2
14 changed files with 64 additions and 7 deletions

View File

@ -26,6 +26,7 @@ import com.imeeting.service.biz.MeetingQueryService;
import com.imeeting.service.biz.MeetingService;
import com.imeeting.service.biz.PromptTemplateService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.dto.PageResult;
import com.unisbase.entity.SysUser;
import com.unisbase.mapper.SysUserMapper;
@ -91,6 +92,7 @@ public class AndroidMeetingController {
)
})
@PostMapping
@Log(value = "新增Android会议", type = "Android会议管理")
public ApiResponse<MeetingVO> create(HttpServletRequest request, @RequestBody LegacyMeetingCreateRequest command) {
AndroidAuthContext authContext = androidAuthService.authenticateHttp(request);
LoginUser loginUser = AndroidLoginUserSupport.requireLoginUser(authContext);
@ -176,6 +178,7 @@ public class AndroidMeetingController {
)
})
@PutMapping("/{meetingId}/access-password")
@Log(value = "修改Android会议访问密码", type = "Android会议管理")
public ApiResponse<String> updateAccessPassword(HttpServletRequest request,
@PathVariable Long meetingId,
@RequestBody(required = false) LegacyMeetingAccessPasswordRequest command) {
@ -201,6 +204,7 @@ public class AndroidMeetingController {
)
})
@DeleteMapping("/{meetingId}")
@Log(value = "删除Android会议", type = "Android会议管理")
public ApiResponse<Boolean> delete(HttpServletRequest request, @PathVariable Long meetingId) {
AndroidAuthContext authContext = androidAuthService.authenticateHttp(request);
LoginUser loginUser = AndroidLoginUserSupport.requireLoginUser(authContext);

View File

@ -20,6 +20,7 @@ import com.imeeting.service.biz.MeetingQueryService;
import com.imeeting.service.biz.MeetingRuntimeProfileResolver;
import com.imeeting.service.biz.RealtimeMeetingSessionStateService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
@ -65,6 +66,7 @@ public class AndroidMeetingRealtimeController {
)
})
@PostMapping("/realtime/create")
@Log(value = "新增Android实时会议", type = "Android实时会议")
public ApiResponse<AndroidCreateRealtimeMeetingVO> createRealtimeMeeting(HttpServletRequest request,
@RequestBody(required = false) AndroidCreateRealtimeMeetingCommand command) {
AndroidAuthContext authContext = androidAuthService.authenticateHttp(request);

View File

@ -29,6 +29,7 @@ import com.imeeting.service.biz.MeetingCommandService;
import com.imeeting.service.biz.MeetingQueryService;
import com.imeeting.service.biz.MeetingService;
import com.imeeting.service.biz.PromptTemplateService;
import com.unisbase.common.annotation.Log;
import com.unisbase.dto.PageResult;
import com.unisbase.entity.SysUser;
import com.unisbase.mapper.SysUserMapper;
@ -132,6 +133,7 @@ public class LegacyMeetingController {
@Operation(summary = "兼容创建会议")
@PostMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "新增兼容会议", type = "兼容会议管理")
public LegacyApiResponse<LegacyMeetingCreateResponse> create(@RequestBody LegacyMeetingCreateRequest request) {
MeetingVO meeting = legacyMeetingAdapterService.createMeeting(request, currentLoginUser());
return LegacyApiResponse.ok(new LegacyMeetingCreateResponse(meeting.getId()));
@ -198,8 +200,9 @@ public class LegacyMeetingController {
@Operation(summary = "兼容更新会议访问密码")
@PutMapping("/{meetingId}/access-password")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改兼容会议访问密码", type = "兼容会议管理")
public LegacyApiResponse<LegacyMeetingAccessPasswordResponse> updateAccessPassword(@PathVariable Long meetingId,
@RequestBody(required = false) LegacyMeetingAccessPasswordRequest request) {
@RequestBody(required = false) LegacyMeetingAccessPasswordRequest request) {
LoginUser loginUser = currentLoginUser();
Meeting meeting = meetingAccessService.requireMeeting(meetingId);
if (!Objects.equals(meeting.getCreatorId(), loginUser.getUserId())) {
@ -215,6 +218,7 @@ public class LegacyMeetingController {
@Operation(summary = "兼容删除会议")
@DeleteMapping("/{meetingId}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除兼容会议", type = "兼容会议管理")
public LegacyApiResponse<Void> delete(@PathVariable Long meetingId) {
LoginUser loginUser = currentLoginUser();
Meeting meeting = meetingAccessService.requireMeeting(meetingId);

View File

@ -5,6 +5,7 @@ import com.imeeting.dto.biz.AiModelDTO;
import com.imeeting.dto.biz.AiModelVO;
import com.imeeting.service.biz.AiModelService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.dto.PageResult;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
@ -29,6 +30,7 @@ public class AiModelController {
@Operation(summary = "新增AI模型")
@PostMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "新增AI模型", type = "AI模型管理")
public ApiResponse<AiModelVO> save(@RequestBody AiModelDTO dto) {
return ApiResponse.ok(aiModelService.saveModel(dto));
}
@ -36,6 +38,7 @@ public class AiModelController {
@Operation(summary = "更新AI模型")
@PutMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "修改AI模型", type = "AI模型管理")
public ApiResponse<AiModelVO> update(@RequestBody AiModelDTO dto) {
if (dto.getId() == null) {
return ApiResponse.error("模型ID不能为空");
@ -60,6 +63,7 @@ public class AiModelController {
@Operation(summary = "删除AI模型")
@DeleteMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除AI模型", type = "AI模型管理")
public ApiResponse<Boolean> delete(@PathVariable Long id, @RequestParam String type) {
if (type == null || type.isBlank()) {
return ApiResponse.error("模型类型不能为空");

View File

@ -4,6 +4,7 @@ import com.imeeting.dto.biz.ClientDownloadDTO;
import com.imeeting.entity.biz.ClientDownload;
import com.imeeting.service.biz.ClientDownloadService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -53,6 +54,7 @@ public class ClientDownloadController {
@Operation(summary = "新增客户端下载包")
@PostMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "新增客户端下载包", type = "客户端下载管理")
public ApiResponse<ClientDownload> create(@RequestBody ClientDownloadDTO dto) {
return ApiResponse.ok(clientDownloadService.create(dto, currentLoginUser()));
}
@ -60,6 +62,7 @@ public class ClientDownloadController {
@Operation(summary = "修改客户端下载包")
@PutMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改客户端下载包", type = "客户端下载管理")
public ApiResponse<ClientDownload> update(@PathVariable Long id, @RequestBody ClientDownloadDTO dto) {
return ApiResponse.ok(clientDownloadService.update(id, dto, currentLoginUser()));
}
@ -67,6 +70,7 @@ public class ClientDownloadController {
@Operation(summary = "删除客户端下载包")
@DeleteMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除客户端下载包", type = "客户端下载管理")
public ApiResponse<Boolean> delete(@PathVariable Long id) {
clientDownloadService.removeClient(id, currentLoginUser());
return ApiResponse.ok(true);

View File

@ -4,6 +4,7 @@ import com.imeeting.dto.biz.DeviceAdminUpdateCommand;
import com.imeeting.dto.biz.DeviceOnlineAdminVO;
import com.imeeting.service.biz.DeviceOnlineManagementService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.ArraySchema;
@ -46,6 +47,7 @@ public class DeviceManagementController {
@Operation(summary = "更新设备管理信息")
@PutMapping("/{id}")
@Log(value = "修改设备管理信息", type = "设备在线管理")
public ApiResponse<DeviceOnlineAdminVO> update(@PathVariable Long id, @RequestBody DeviceAdminUpdateCommand command) {
return ApiResponse.ok(deviceOnlineManagementService.update(id, command, currentLoginUser()));
}

View File

@ -4,6 +4,7 @@ import com.imeeting.dto.biz.ExternalAppDTO;
import com.imeeting.entity.biz.ExternalApp;
import com.imeeting.service.biz.ExternalAppService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -44,6 +45,7 @@ public class ExternalAppController {
@Operation(summary = "新增外部应用")
@PostMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "新增外部应用", type = "外部应用管理")
public ApiResponse<ExternalApp> create(@RequestBody ExternalAppDTO dto) {
return ApiResponse.ok(externalAppService.create(dto, currentLoginUser()));
}
@ -51,6 +53,7 @@ public class ExternalAppController {
@Operation(summary = "修改外部应用")
@PutMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改外部应用", type = "外部应用管理")
public ApiResponse<ExternalApp> update(@PathVariable Long id, @RequestBody ExternalAppDTO dto) {
return ApiResponse.ok(externalAppService.update(id, dto, currentLoginUser()));
}
@ -58,6 +61,7 @@ public class ExternalAppController {
@Operation(summary = "删除外部应用")
@DeleteMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除外部应用", type = "外部应用管理")
public ApiResponse<Boolean> delete(@PathVariable Long id) {
externalAppService.removeApp(id, currentLoginUser());
return ApiResponse.ok(true);

View File

@ -9,6 +9,7 @@ import com.imeeting.entity.biz.HotWordGroup;
import com.imeeting.service.biz.HotWordGroupService;
import com.imeeting.service.biz.HotWordService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.dto.PageResult;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
@ -43,6 +44,7 @@ public class HotWordController {
@Operation(summary = "新增热词")
@PostMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "新增热词", type = "热词管理")
public ApiResponse<HotWordVO> save(@RequestBody HotWordDTO hotWordDTO) {
LoginUser loginUser = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Long targetTenantId = resolveTargetTenantId(loginUser, hotWordDTO.getTenantId());
@ -52,6 +54,7 @@ public class HotWordController {
@Operation(summary = "修改热词")
@PutMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "修改热词", type = "热词管理")
public ApiResponse<HotWordVO> update(@RequestBody HotWordDTO hotWordDTO) {
HotWord existing = hotWordService.getById(hotWordDTO.getId());
if (existing == null) {
@ -64,6 +67,7 @@ public class HotWordController {
@Operation(summary = "删除热词")
@DeleteMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除热词", type = "热词管理")
public ApiResponse<Boolean> delete(@PathVariable Long id) {
HotWord existing = hotWordService.getById(id);
if (existing == null) {

View File

@ -4,6 +4,7 @@ import com.imeeting.dto.biz.HotWordGroupDTO;
import com.imeeting.dto.biz.HotWordGroupVO;
import com.imeeting.service.biz.HotWordGroupService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.dto.PageResult;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
@ -35,6 +36,7 @@ public class HotWordGroupController {
@Operation(summary = "新增热词组")
@PostMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "新增热词组", type = "热词组管理")
public ApiResponse<HotWordGroupVO> save(@RequestBody HotWordGroupDTO dto) {
LoginUser loginUser = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Long targetTenantId = resolveTargetTenantId(loginUser, dto.getTenantId());
@ -44,6 +46,7 @@ public class HotWordGroupController {
@Operation(summary = "修改热词组")
@PutMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "修改热词组", type = "热词组管理")
public ApiResponse<HotWordGroupVO> update(@RequestBody HotWordGroupDTO dto) {
LoginUser loginUser = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Long targetTenantId = resolveTargetTenantId(loginUser, dto.getTenantId());
@ -61,6 +64,7 @@ public class HotWordGroupController {
@Operation(summary = "删除热词组")
@DeleteMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除热词组", type = "热词组管理")
public ApiResponse<Boolean> delete(@PathVariable Long id, @RequestParam(required = false) Long tenantId) {
LoginUser loginUser = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Long targetTenantId = resolveTargetTenantId(loginUser, tenantId);

View File

@ -30,6 +30,7 @@ import com.imeeting.service.biz.RealtimeMeetingSessionStateService;
import com.imeeting.service.biz.RealtimeMeetingSocketSessionService;
import com.imeeting.service.biz.impl.MeetingAudioUploadSupport;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.dto.PageResult;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
@ -140,6 +141,7 @@ public class MeetingController {
@Operation(summary = "创建离线会议")
@PostMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "新增离线会议", type = "会议管理")
public ApiResponse<MeetingVO> create(@Valid @RequestBody CreateMeetingCommand command) {
LoginUser loginUser = currentLoginUser();
assertPromptAvailable(command.getPromptId(), loginUser);
@ -155,6 +157,7 @@ public class MeetingController {
@Operation(summary = "创建实时会议")
@PostMapping("/realtime/start")
@PreAuthorize("isAuthenticated()")
@Log(value = "新增实时会议", type = "会议管理")
public ApiResponse<MeetingVO> createRealtime(@Valid @RequestBody CreateRealtimeMeetingCommand command) {
LoginUser loginUser = currentLoginUser();
assertPromptAvailable(command.getPromptId(), loginUser);
@ -352,6 +355,7 @@ public class MeetingController {
@Operation(summary = "更新会议讲话人")
@PutMapping("/speaker")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改会议讲话人", type = "会议管理")
public ApiResponse<Boolean> updateSpeaker(@RequestBody MeetingSpeakerUpdateDTO dto) {
LoginUser loginUser = currentLoginUser();
Meeting meeting = meetingAccessService.requireMeeting(dto.getMeetingId());
@ -363,6 +367,7 @@ public class MeetingController {
@Operation(summary = "更新会议转写")
@PutMapping("/{id}/transcripts/{transcriptId}")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改会议转写", type = "会议管理")
public ApiResponse<Boolean> updateTranscript(@PathVariable Long id,
@PathVariable Long transcriptId,
@RequestBody UpdateMeetingTranscriptCommand command) {
@ -378,6 +383,7 @@ public class MeetingController {
@Operation(summary = "更新参会人员")
@PutMapping("/{id}/participants")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改会议参会人员", type = "会议管理")
public ApiResponse<Boolean> updateParticipants(@PathVariable Long id,
@RequestBody UpdateMeetingParticipantsCommand command) {
LoginUser loginUser = currentLoginUser();
@ -415,6 +421,7 @@ public class MeetingController {
@Operation(summary = "更新会议基础信息")
@PutMapping("/{id}/basic")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改会议基础信息", type = "会议管理")
public ApiResponse<Boolean> updateBasic(@PathVariable Long id, @RequestBody UpdateMeetingBasicCommand command) {
LoginUser loginUser = currentLoginUser();
Meeting meeting = meetingAccessService.requireMeeting(id);
@ -427,6 +434,7 @@ public class MeetingController {
@Operation(summary = "更新会议摘要")
@PutMapping("/{id}/summary")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改会议摘要", type = "会议管理")
public ApiResponse<Boolean> updateSummary(@PathVariable Long id, @RequestBody UpdateMeetingSummaryCommand command) {
LoginUser loginUser = currentLoginUser();
Meeting meeting = meetingAccessService.requireMeeting(id);
@ -439,6 +447,7 @@ public class MeetingController {
@Operation(summary = "删除会议")
@DeleteMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除会议", type = "会议管理")
public ApiResponse<Boolean> delete(@PathVariable Long id) {
LoginUser loginUser = currentLoginUser();
Meeting meeting = meetingAccessService.requireMeeting(id);

View File

@ -6,6 +6,7 @@ import com.imeeting.dto.biz.PromptTemplateVO;
import com.imeeting.entity.biz.PromptTemplate;
import com.imeeting.service.biz.PromptTemplateService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.dto.PageResult;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
@ -30,6 +31,7 @@ public class PromptTemplateController {
@Operation(summary = "新增提示词模板")
@PostMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "新增提示词模板", type = "提示词模板管理")
public ApiResponse<PromptTemplateVO> save(@RequestBody PromptTemplateDTO dto) {
LoginUser loginUser = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
@ -52,6 +54,7 @@ public class PromptTemplateController {
@Operation(summary = "修改提示词模板")
@PutMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "修改提示词模板", type = "提示词模板管理")
public ApiResponse<PromptTemplateVO> update(@RequestBody PromptTemplateDTO dto) {
LoginUser loginUser = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
PromptTemplate existing = promptTemplateService.getById(dto.getId());
@ -80,6 +83,7 @@ public class PromptTemplateController {
@Operation(summary = "更新提示词模板状态")
@PutMapping("/{id}/status")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改提示词模板状态", type = "提示词模板管理")
public ApiResponse<Boolean> updateStatus(@PathVariable Long id, @RequestParam Integer status) {
LoginUser loginUser = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
PromptTemplate existing = promptTemplateService.getById(id);
@ -118,6 +122,7 @@ public class PromptTemplateController {
@Operation(summary = "删除提示词模板")
@DeleteMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除提示词模板", type = "提示词模板管理")
public ApiResponse<Boolean> delete(@PathVariable Long id) {
LoginUser loginUser = (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
PromptTemplate existing = promptTemplateService.getById(id);

View File

@ -8,6 +8,7 @@ import com.imeeting.dto.biz.ScreenSaverUserSettingsVO;
import com.imeeting.entity.biz.ScreenSaver;
import com.imeeting.service.biz.ScreenSaverService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -56,6 +57,7 @@ public class ScreenSaverController {
@Operation(summary = "更新当前用户屏保播放设置")
@PutMapping("/my-settings")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改个人屏保设置", type = "屏保管理")
public ApiResponse<ScreenSaverUserSettingsVO> updateMySettings(@RequestBody ScreenSaverUserSettingsDTO dto) {
return ApiResponse.ok(screenSaverService.updateMySettings(dto, currentLoginUser()));
}
@ -63,6 +65,7 @@ public class ScreenSaverController {
@Operation(summary = "新增屏保")
@PostMapping
@PreAuthorize("isAuthenticated()")
@Log(value = "新增屏保", type = "屏保管理")
public ApiResponse<ScreenSaver> create(@RequestBody ScreenSaverDTO dto) {
return ApiResponse.ok(screenSaverService.create(dto, currentLoginUser()));
}
@ -70,6 +73,7 @@ public class ScreenSaverController {
@Operation(summary = "修改屏保")
@PutMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改屏保", type = "屏保管理")
public ApiResponse<ScreenSaver> update(@PathVariable Long id, @RequestBody ScreenSaverDTO dto) {
return ApiResponse.ok(screenSaverService.update(id, dto, currentLoginUser()));
}
@ -77,6 +81,7 @@ public class ScreenSaverController {
@Operation(summary = "更新屏保状态")
@PutMapping("/{id}/status")
@PreAuthorize("isAuthenticated()")
@Log(value = "修改屏保状态", type = "屏保管理")
public ApiResponse<Boolean> updateStatus(@PathVariable Long id, @RequestParam Integer status) {
boolean success = screenSaverService.updateStatus(id, status, currentLoginUser());
if (!success) {
@ -88,6 +93,7 @@ public class ScreenSaverController {
@Operation(summary = "删除屏保")
@DeleteMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除屏保", type = "屏保管理")
public ApiResponse<Boolean> delete(@PathVariable Long id) {
screenSaverService.removeScreenSaver(id, currentLoginUser());
return ApiResponse.ok(true);

View File

@ -4,6 +4,7 @@ import com.imeeting.dto.biz.SpeakerRegisterDTO;
import com.imeeting.dto.biz.SpeakerVO;
import com.imeeting.service.biz.SpeakerService;
import com.unisbase.common.ApiResponse;
import com.unisbase.common.annotation.Log;
import com.unisbase.dto.PageResult;
import com.unisbase.security.LoginUser;
import io.swagger.v3.oas.annotations.Operation;
@ -28,6 +29,7 @@ public class SpeakerController {
@Operation(summary = "注册讲话人样本")
@PostMapping("/register")
@PreAuthorize("isAuthenticated()")
@Log(value = "新增讲话人样本", type = "讲话人管理")
public ApiResponse<SpeakerVO> register(@ModelAttribute SpeakerRegisterDTO registerDTO) {
LoginUser loginUser = getLoginUser();
if (loginUser == null || loginUser.getUserId() == null) {
@ -65,6 +67,7 @@ public class SpeakerController {
@Operation(summary = "删除讲话人")
@DeleteMapping("/{id}")
@PreAuthorize("isAuthenticated()")
@Log(value = "删除讲话人", type = "讲话人管理")
public ApiResponse<Boolean> delete(@PathVariable Long id) {
LoginUser loginUser = getLoginUser();
if (loginUser == null || loginUser.getUserId() == null) {

View File

@ -1656,7 +1656,7 @@ const MeetingDetail: React.FC = () => {
placement="bottomRight"
>
<Button icon={<DownloadOutlined />} loading={!!downloadLoading}>
</Button>
</Dropdown>
)}
@ -1701,12 +1701,14 @@ const MeetingDetail: React.FC = () => {
</div>
<div className="summary-head-actions">
{meeting.summaryContent ? (
<Button type="link" size="small" onClick={() => {
setIsEditingSummary(false);
setSummaryRecordVisible(true);
}}>
// <Button type="link" size="small" onClick={() => {
// setIsEditingSummary(false);
// setSummaryRecordVisible(true);
// }}>
<span>
</Button>
</span>
// </Button>
) : null}
{meeting.summaryContent && isOwner ? (
<Button