diff --git a/admin/src/api/user.ts b/admin/src/api/user.ts index 6f69e58..87969f8 100644 --- a/admin/src/api/user.ts +++ b/admin/src/api/user.ts @@ -67,6 +67,14 @@ export function deleteUser(id: number): Promise { return request.delete(`/admin/users/${id}`) } +/** + * 批量删除所有测试用户 + * @returns 删除的数量 + */ +export function deleteAllTestUsers(): Promise { + return request.delete('/admin/users/test-users') +} + /** * 更新用户联系次数 * @param id 用户ID diff --git a/admin/src/views/user/list.vue b/admin/src/views/user/list.vue index a1807cb..068176a 100644 --- a/admin/src/views/user/list.vue +++ b/admin/src/views/user/list.vue @@ -14,7 +14,7 @@ import { View, Edit, Plus, Delete, Refresh } from '@element-plus/icons-vue' import SearchForm from '@/components/SearchForm/index.vue' import Pagination from '@/components/Pagination/index.vue' import StatusTag from '@/components/StatusTag/index.vue' -import { getUserList, updateUserStatus, createTestUsers, deleteUser, refreshRecommend } from '@/api/user' +import { getUserList, updateUserStatus, createTestUsers, deleteUser, deleteAllTestUsers, refreshRecommend } from '@/api/user' import { getFullImageUrl } from '@/utils/image' import type { UserListItem, UserQueryParams } from '@/types/user.d' @@ -207,6 +207,29 @@ const formatTime = (time: string) => { // 创建测试用户弹窗 const testUserDialogVisible = ref(false) const testUserLoading = ref(false) + +// 批量删除测试用户 +const handleDeleteAllTestUsers = async () => { + try { + await ElMessageBox.confirm( + '确定要删除所有测试用户吗?此操作不可恢复!', + '批量删除测试用户', + { + confirmButtonText: '确定删除', + cancelButtonText: '取消', + type: 'warning' + } + ) + + const count = await deleteAllTestUsers() + ElMessage.success(`成功删除${count}个测试用户`) + fetchUserList() + } catch (error) { + if (error !== 'cancel') { + console.error('批量删除测试用户失败:', error) + } + } +} const testUserForm = reactive({ count: 10, gender: undefined as number | undefined @@ -387,13 +410,22 @@ onMounted(() => { >.Success(result, $"成功创建{result.Count}个测试用户"); } + /// + /// 批量删除所有测试用户 + /// + /// 删除的数量 + [HttpDelete("test-users")] + [OperationLog("用户管理", "删除", Description = "批量删除测试用户")] + public async Task> DeleteAllTestUsers() + { + var adminId = GetCurrentAdminId(); + var count = await _adminUserService.DeleteAllTestUsersAsync(adminId); + return ApiResponse.Success(count, $"成功删除{count}个测试用户"); + } + /// /// 获取当前管理员ID /// diff --git a/server/src/XiangYi.Application/Interfaces/IAdminUserService.cs b/server/src/XiangYi.Application/Interfaces/IAdminUserService.cs index 32a56df..eb43470 100644 --- a/server/src/XiangYi.Application/Interfaces/IAdminUserService.cs +++ b/server/src/XiangYi.Application/Interfaces/IAdminUserService.cs @@ -53,6 +53,13 @@ public interface IAdminUserService /// 是否成功 Task DeleteUserAsync(long userId, long adminId); + /// + /// 批量删除所有测试用户 + /// + /// 操作管理员ID + /// 删除的用户数量 + Task DeleteAllTestUsersAsync(long adminId); + /// /// 更新用户联系次数 /// diff --git a/server/src/XiangYi.Application/Services/AdminUserService.cs b/server/src/XiangYi.Application/Services/AdminUserService.cs index 833fb1d..ff4fbe5 100644 --- a/server/src/XiangYi.Application/Services/AdminUserService.cs +++ b/server/src/XiangYi.Application/Services/AdminUserService.cs @@ -511,6 +511,38 @@ public class AdminUserService : IAdminUserService return true; } + /// + public async Task DeleteAllTestUsersAsync(long adminId) + { + var testUsers = await _userRepository.GetListAsync(u => u.OpenId.StartsWith("test_openid_")); + if (!testUsers.Any()) + { + return 0; + } + + var deletedCount = 0; + foreach (var user in testUsers) + { + try + { + await _photoRepository.DeleteAsync(p => p.UserId == user.Id); + await _requirementRepository.DeleteAsync(r => r.UserId == user.Id); + await _profileRepository.DeleteAsync(p => p.UserId == user.Id); + await _userRepository.DeleteAsync(user.Id); + deletedCount++; + } + catch (Exception ex) + { + _logger.LogError(ex, "删除测试用户失败: UserId={UserId}", user.Id); + } + } + + _logger.LogInformation("管理员批量删除测试用户: AdminId={AdminId}, DeletedCount={DeletedCount}, TotalCount={TotalCount}", + adminId, deletedCount, testUsers.Count); + + return deletedCount; + } + /// public async Task UpdateContactCountAsync(long userId, int contactCount, long adminId) {